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