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();
 }