changeset 679:83a48de05fe9

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().
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 04 Mar 2020 19:45:26 +0200
parents 7e207f1023d9
children 39c82d877251
files th_string.c th_string.h
diffstat 2 files changed, 49 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- 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];
     }
 
--- 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);