1
0
Fork 0

stdlib: Add Lth_fpeekc, Lth_strealoc, et al.

master
Marrub 2016-10-21 14:49:11 -04:00
parent 6834efad4f
commit ab547ad527
2 changed files with 76 additions and 8 deletions

View File

@ -13,6 +13,7 @@
#ifndef lithos3__Lth_stdlib_h
#define lithos3__Lth_stdlib_h
#include <stdio.h>
#include <stdbool.h>
#define Lth_isidenti(ch) \
@ -24,16 +25,23 @@
// Extern Functions ----------------------------------------------------------|
// file
int Lth_fpeekc(FILE *fp);
// str
char *Lth_strdup(char const *s);
char *Lth_strdup_str(__str s);
__str Lth_strentdup(char const *s);
__str Lth_strlocal(__str s);
char *Lth_strealoc(char *p, char const *s);
char *Lth_strealoc_str(char *p, __str s);
bool Lth_strcontains(char const *s, char ch);
// Print
void Lth_PrintString(char const *s);
// Hash
size_t Lth_Hash_char(char const *s);
size_t Lth_Hash_str(__str s);
#endif//lithos3__Lth_stdlib_h

View File

@ -12,12 +12,24 @@
#include "Lth.h"
#include <GDCC.h> // OH GOD
#include <string.h>
#include <stdlib.h>
// Extern Functions ----------------------------------------------------------|
//
// Lth_fpeekc
//
int Lth_fpeekc(FILE *fp)
{
int ret = fgetc(fp);
ungetc(ret, fp);
return ret;
}
//
// Lth_strdup
//
@ -25,11 +37,10 @@
//
char *Lth_strdup(char const *s)
{
Lth_assert(s != NULL);
size_t len = strlen(s);
char *ret = calloc(len + 1, 1);
Lth_assert(ret != NULL);
char *ret = malloc(len + 1);
memcpy(ret, s, len);
ret[len] = '\0';
return ret;
}
@ -40,11 +51,10 @@ char *Lth_strdup(char const *s)
//
char *Lth_strdup_str(__str s)
{
Lth_assert(s != NULL);
size_t len = ACS_StrLen(s);
char *ret = calloc(len + 1, 1);
Lth_assert(ret != NULL);
for(size_t i = 0; i < len; i++) ret[i] = s[i];
char *ret = malloc(len + 1);
ACS_StrArsCpyToGlobalCharRange((int)ret, __GDCC__Sta, 0, len, s);
ret[len] = '\0';
return ret;
}
@ -55,7 +65,6 @@ char *Lth_strdup_str(__str s)
//
__str Lth_strentdup(char const *s)
{
Lth_assert(s != NULL);
size_t len = strlen(s);
ACS_BeginPrint();
Lth_PrintString(s);
@ -72,6 +81,41 @@ __str Lth_strlocal(__str s)
return ACS_EndStrParam();
}
//
// Lth_strealoc
//
// Reallocates a string and replaces its contents.
//
char *Lth_strealoc(char *p, char const *s)
{
size_t len = strlen(s);
p = realloc(p, len + 1);
memcpy(p, s, len);
p[len] = '\0';
return p;
}
//
// Lth_strealoc_str
//
char *Lth_strealoc_str(char *p, __str s)
{
size_t len = ACS_StrLen(s);
p = realloc(p, len + 1);
ACS_StrArsCpyToGlobalCharRange((int)p, __GDCC__Sta, 0, len, s);
p[len] = '\0';
return p;
}
//
// Lth_strcontains
//
bool Lth_strcontains(char const *s, char ch)
{
for(; *s; s++) if(*s == ch) return true;
return false;
}
//
// Lth_PrintString
//
@ -98,4 +142,20 @@ size_t Lth_Hash_char(char const *s)
return ret;
}
//
// Lth_Hash_str
//
size_t Lth_Hash_str(__str s)
{
if(s == NULL) return 0;
size_t ret = 0;
size_t len = ACS_StrLen(s);
for(size_t i = 0; i < len; i++)
ret = ret * 101 + (unsigned char)(s[i]);
return ret;
}
// EOF