dovecot-2.2: lib: Created t_str_trim() functions to trim charact...
dovecot at dovecot.org
dovecot at dovecot.org
Sat Nov 28 21:50:30 UTC 2015
details: http://hg.dovecot.org/dovecot-2.2/rev/922de4bc4777
changeset: 19433:922de4bc4777
user: Stephan Bosch <stephan at rename-it.nl>
date: Sat Nov 28 23:50:14 2015 +0200
description:
lib: Created t_str_trim() functions to trim characters from beginning and end of string.
diffstat:
src/lib/strfuncs.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++
src/lib/strfuncs.h | 6 +++++
src/lib/test-strfuncs.c | 51 +++++++++++++++++++++++++++++++++++++++++++
3 files changed, 114 insertions(+), 0 deletions(-)
diffs (148 lines):
diff -r a9c75e48cf8c -r 922de4bc4777 src/lib/strfuncs.c
--- 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)
diff -r a9c75e48cf8c -r 922de4bc4777 src/lib/strfuncs.h
--- 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;
diff -r a9c75e48cf8c -r 922de4bc4777 src/lib/test-strfuncs.c
--- 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();
}
More information about the dovecot-cvs
mailing list