Mercurial > dovecot > core-2.2
changeset 19433:922de4bc4777
lib: Created t_str_trim() functions to trim characters from beginning and end of string.
author | Stephan Bosch <stephan@rename-it.nl> |
---|---|
date | Sat, 28 Nov 2015 23:50:14 +0200 |
parents | a9c75e48cf8c |
children | 9a15b989cc41 |
files | src/lib/strfuncs.c src/lib/strfuncs.h src/lib/test-strfuncs.c |
diffstat | 3 files changed, 114 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/strfuncs.c Sat Nov 28 13:36:14 2015 +0200 +++ b/src/lib/strfuncs.c Sat Nov 28 23:50:14 2015 +0200 @@ -364,6 +364,63 @@ return str_ucase(t_strdup_noconst(str)); } +const char *t_str_trim(const char *str, const char *chars) +{ + const char *p, *pend, *begin; + + pend = str + strlen(str); + if (pend == str) + return ""; + + p = str; + while (p < pend && strchr(chars, *p) != NULL) + p++; + begin = p; + + p = pend - 1; + while (p > begin && strchr(chars, *p) != NULL) + p--; + + if (p <= begin) + return ""; + return t_strdup_until(begin, p+1); +} + +const char *str_ltrim(const char *str, const char *chars) +{ + const char *p; + + if (*str == '\0') + return ""; + + p = str; + while (*p != '\0' && strchr(chars, *p) != NULL) + p++; + + return p; +} + +const char *t_str_ltrim(const char *str, const char *chars) +{ + return t_strdup(str_ltrim(str, chars)); +} + +const char *t_str_rtrim(const char *str, const char *chars) +{ + const char *p, *pend; + + pend = str + strlen(str); + if (pend == str) + return ""; + + p = pend - 1; + while (p > str && strchr(chars, *p) != NULL) + p--; + if (p <= str) + return ""; + return t_strdup_until(str, p+1); +} + int null_strcmp(const char *s1, const char *s2) { if (s1 == NULL)
--- a/src/lib/strfuncs.h Sat Nov 28 13:36:14 2015 +0200 +++ b/src/lib/strfuncs.h Sat Nov 28 23:50:14 2015 +0200 @@ -53,6 +53,12 @@ const char *t_str_lcase(const char *str); const char *t_str_ucase(const char *str); +/* Trim matching chars from either side of the string */ +const char *str_ltrim(const char *str, const char *chars); +const char *t_str_ltrim(const char *str, const char *chars); +const char *t_str_rtrim(const char *str, const char *chars); +const char *t_str_trim(const char *str, const char *chars); + int null_strcmp(const char *s1, const char *s2) ATTR_PURE; int bsearch_strcmp(const char *key, const char *const *member) ATTR_PURE; int bsearch_strcasecmp(const char *key, const char *const *member) ATTR_PURE;
--- a/src/lib/test-strfuncs.c Sat Nov 28 13:36:14 2015 +0200 +++ b/src/lib/test-strfuncs.c Sat Nov 28 23:50:14 2015 +0200 @@ -109,10 +109,61 @@ test_end(); } +static void test_t_str_trim(void) +{ + test_begin("t_str_trim"); + test_assert(strcmp(t_str_trim("foo", ""), "foo") == 0); + test_assert(strcmp(t_str_trim("foo", " "), "foo") == 0); + test_assert(strcmp(t_str_trim("foo ", " "), "foo") == 0); + test_assert(strcmp(t_str_trim(" foo", " "), "foo") == 0); + test_assert(strcmp(t_str_trim(" foo ", " "), "foo") == 0); + test_assert(strcmp(t_str_trim("\tfoo ", "\t "), "foo") == 0); + test_assert(strcmp(t_str_trim(" \tfoo\t ", "\t "), "foo") == 0); + test_assert(strcmp(t_str_trim("\r \tfoo\t \r", "\t \r"), "foo") == 0); + test_assert(strcmp(t_str_trim("\r \tfoo foo\t \r", "\t \r"), "foo foo") == 0); + test_assert(strcmp(t_str_trim("\tfoo\tfoo\t", "\t \r"), "foo\tfoo") == 0); + test_end(); +} + +static void test_t_str_ltrim(void) +{ + test_begin("t_str_ltrim"); + test_assert(strcmp(t_str_ltrim("foo", ""), "foo") == 0); + test_assert(strcmp(t_str_ltrim("foo", " "), "foo") == 0); + test_assert(strcmp(t_str_ltrim("foo ", " "), "foo ") == 0); + test_assert(strcmp(t_str_ltrim(" foo", " "), "foo") == 0); + test_assert(strcmp(t_str_ltrim(" foo ", " "), "foo ") == 0); + test_assert(strcmp(t_str_ltrim("\tfoo ", "\t "), "foo ") == 0); + test_assert(strcmp(t_str_ltrim(" \tfoo\t ", "\t "), "foo\t ") == 0); + test_assert(strcmp(t_str_ltrim("\r \tfoo\t \r", "\t \r"), "foo\t \r") == 0); + test_assert(strcmp(t_str_ltrim("\r \tfoo foo\t \r", "\t \r"), "foo foo\t \r") == 0); + test_assert(strcmp(t_str_ltrim("\tfoo\tfoo\t", "\t \r"), "foo\tfoo\t") == 0); + test_end(); +} + +static void test_t_str_rtrim(void) +{ + test_begin("t_str_rtrim"); + test_assert(strcmp(t_str_rtrim("foo", ""), "foo") == 0); + test_assert(strcmp(t_str_rtrim("foo", " "), "foo") == 0); + test_assert(strcmp(t_str_rtrim("foo ", " "), "foo") == 0); + test_assert(strcmp(t_str_rtrim(" foo", " "), " foo") == 0); + test_assert(strcmp(t_str_rtrim(" foo ", " "), " foo") == 0); + test_assert(strcmp(t_str_rtrim("\tfoo ", "\t "), "\tfoo") == 0); + test_assert(strcmp(t_str_rtrim(" \tfoo\t ", "\t "), " \tfoo") == 0); + test_assert(strcmp(t_str_rtrim("\r \tfoo\t \r", "\t \r"), "\r \tfoo") == 0); + test_assert(strcmp(t_str_rtrim("\r \tfoo foo\t \r", "\t \r"), "\r \tfoo foo") == 0); + test_assert(strcmp(t_str_rtrim("\tfoo\tfoo\t", "\t \r"), "\tfoo\tfoo") == 0); + test_end(); +} + void test_strfuncs(void) { test_p_strarray_dup(); test_t_strsplit(); test_t_strsplit_tab(); test_t_str_replace(); + test_t_str_trim(); + test_t_str_ltrim(); + test_t_str_rtrim(); }