# HG changeset patch # User Matti Hamalainen # Date 1455523870 -7200 # Node ID 099a1a156fd71062251b52769fdc624d7f60ffea # Parent faeeac291a6cc3805ffaff7fcbfefc126b1868ee Implement th_strndup_trim() and factorize implementation of th_strdup_trim(). diff -r faeeac291a6c -r 099a1a156fd7 th_string.c --- a/th_string.c Mon Feb 15 06:05:42 2016 +0200 +++ b/th_string.c Mon Feb 15 10:11:10 2016 +0200 @@ -53,15 +53,14 @@ * according to specified flags. See TH_TRIM_* in * th_string.h */ -char *th_strdup_trim(const char *src, const int flags) +static inline th_strdup_trim_do(const char src, size_t len, const int flags) { char *res; - size_t start, end, len; - if (src == NULL) + size_t start, end; + + if (len == 0) return NULL; - len = strlen(src); - // Trim start: find first non-whitespace character if (flags & TH_TRIM_START) for (start = 0; start < len && th_isspace(src[start]); start++); @@ -85,6 +84,27 @@ } +char *th_strdup_trim(const char *src, const int flags) +{ + if (src == NULL) + return NULL; + + return th_strdup_trim_do(src, strlen(src), flags); +} + + +char *th_strndup_trim(const char *src, const size_t n, const int flags) +{ + size_t len; + if (src == NULL || n == 0) + return NULL; + + for (len = 0; len < n && src[len]; len++); + + return th_strdup_trim_do(src, len, flags); +} + + /* Simulate a sprintf() that allocates memory */ char *th_strdup_vprintf(const char *fmt, va_list args) diff -r faeeac291a6c -r 099a1a156fd7 th_string.h --- a/th_string.h Mon Feb 15 06:05:42 2016 +0200 +++ b/th_string.h Mon Feb 15 10:11:10 2016 +0200 @@ -53,6 +53,7 @@ char *th_strdup(const char *src); char *th_strndup(const char *src, const size_t n); char *th_strdup_trim(const char *, const int flags); +char *th_strndup_trim(const char *, const size_t n, const int flags); int th_strcasecmp(const char *haystack, const char *needle); int th_strncasecmp(const char *haystack, const char *needle, size_t n);