From ab547ad527f691421190c26763d6baf93842141b Mon Sep 17 00:00:00 2001 From: Marrub Date: Fri, 21 Oct 2016 14:49:11 -0400 Subject: [PATCH] stdlib: Add Lth_fpeekc, Lth_strealoc, et al. --- lithos_c/inc/Lth_stdlib.h | 8 +++++ lithos_c/src/stdlib.c | 76 ++++++++++++++++++++++++++++++++++----- 2 files changed, 76 insertions(+), 8 deletions(-) diff --git a/lithos_c/inc/Lth_stdlib.h b/lithos_c/inc/Lth_stdlib.h index d8242d2..c648463 100644 --- a/lithos_c/inc/Lth_stdlib.h +++ b/lithos_c/inc/Lth_stdlib.h @@ -13,6 +13,7 @@ #ifndef lithos3__Lth_stdlib_h #define lithos3__Lth_stdlib_h +#include #include #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 diff --git a/lithos_c/src/stdlib.c b/lithos_c/src/stdlib.c index 2b2c109..9212bea 100644 --- a/lithos_c/src/stdlib.c +++ b/lithos_c/src/stdlib.c @@ -12,12 +12,24 @@ #include "Lth.h" +#include // OH GOD + #include #include // 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