# HG changeset patch # User Matti Hamalainen # Date 1583343926 -7200 # Node ID 83a48de05fe958cea54333ec827fada51691f87f # Parent 7e207f1023d9966ca0cf8aea521fed4f05e086e9 Add in th_strlen() which is a custom function if TH_CHAR_TYPE is defined. Otherwise th_strlen() is defined as a macro alias to libc strlen(). diff -r 7e207f1023d9 -r 83a48de05fe9 th_string.c --- a/th_string.c Sat Feb 29 12:19:02 2020 +0200 +++ b/th_string.c Wed Mar 04 19:45:26 2020 +0200 @@ -25,7 +25,7 @@ if (src == NULL) return NULL; - len = strlen(src); + len = th_strlen(src); if ((res = th_malloc((len + 1) * sizeof(th_char_t))) == NULL) return NULL; @@ -52,7 +52,7 @@ if (src == NULL) return NULL; - len = strlen(src); + len = th_strlen(src); if (len > n) len = n; @@ -123,7 +123,7 @@ if (src == NULL) return NULL; - return th_strdup_trim_do(src, strlen(src), flags); + return th_strdup_trim_do(src, th_strlen(src), flags); } @@ -490,18 +490,20 @@ { if (str == NULL || needle == NULL) return NULL; - - const size_t - slen = strlen(str), - nlen = strlen(needle); + else + { + const size_t + slen = th_strlen(str), + nlen = th_strlen(needle); - if (slen < nlen) - return NULL; + if (slen < nlen) + return NULL; - if (th_strcasecmp(str + slen - nlen, needle) == 0) - return str + slen - nlen; - else - return NULL; + if (th_strcasecmp(str + slen - nlen, needle) == 0) + return str + slen - nlen; + else + return NULL; + } } @@ -509,14 +511,14 @@ */ int th_pstr_cpy(th_char_t **pdst, const th_char_t *src) { - assert(pdst != NULL); + size_t slen; - if (src == NULL) + if (pdst == NULL || src == NULL) return THERR_NULLPTR; th_free(*pdst); - size_t slen = strlen(src); + slen = th_strlen(src); if ((*pdst = th_malloc((slen + 1) * sizeof(th_char_t))) == NULL) return THERR_MALLOC; @@ -530,9 +532,7 @@ */ int th_pstr_cat(th_char_t **pdst, const th_char_t *src) { - assert(pdst != NULL); - - if (src == NULL) + if (pdst == NULL || src == NULL) return THERR_NULLPTR; if (*pdst != NULL) @@ -572,10 +572,13 @@ // Split foremost str element out match = FALSE; for (end = start; str[end] != 0; end++) - if (strchr(sep, str[end]) != NULL) { - match = TRUE; - break; + for (size_t n = 0; sep[n]; n++) + if (sep[n] == str[end]) + { + match = TRUE; + break; + } } // If the element is there, create it @@ -609,11 +612,11 @@ if ((elemlens = th_malloc(nelems * sizeof(size_t))) == NULL) return THERR_MALLOC; - seplen = strlen(sep); + seplen = th_strlen(sep); for (len = n = 0; n < nelems; n++) { - len += elemlens[n] = strlen(elems[n]); + len += elemlens[n] = th_strlen(ctx->elems[n]); } len += 1 + n * seplen; @@ -628,11 +631,11 @@ { if (n > 0) { - memcpy((*str) + offs, sep, seplen); + memcpy((*str) + offs, sep, seplen * sizeof(th_char_t)); offs += seplen; } - memcpy((*str) + offs, elems[n], elemlens[n]); + memcpy((*str) + offs, elems[n], elemlens[n] * sizeof(th_char_t)); offs += elemlens[n]; } diff -r 7e207f1023d9 -r 83a48de05fe9 th_string.h --- a/th_string.h Sat Feb 29 12:19:02 2020 +0200 +++ b/th_string.h Wed Mar 04 19:45:26 2020 +0200 @@ -111,6 +111,26 @@ /* Normal NUL-terminated string functions */ +#ifdef TH_CHAR_TYPE +/** + * Implementation of strlen() that uses th_char_t type. Not optimized. + * @param[in] src string to get length of + * @returns length of the string in number of th_char_t units. + */ +size_t th_strlen(const th_char_t *str) +{ + size_t len = 0; + assert(str != NULL); + + while (str[len]) len++; + + return len; +} +#else +#define th_strlen(xd) strlen(xd) +#endif + + th_char_t *th_strdup(const th_char_t *src); th_char_t *th_strndup(const th_char_t *src, const size_t n); th_char_t *th_strdup_trim(const th_char_t *src, const int flags);