From eb84645a00544187e875e8044b06bcfedfb6e503 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Sat, 1 Aug 2015 08:57:44 -0400 Subject: [PATCH] Add str_split_ws (). To trim whitespace around a field delimiter. --- src/util-string.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++------ src/util-string.h | 1 + 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/util-string.c b/src/util-string.c index b063e578..0e2f6d8c 100644 --- a/src/util-string.c +++ b/src/util-string.c @@ -329,26 +329,43 @@ strv_catv (char **dst, char **src) return d; } -char ** -str_split (const char *str, const char *delim, int count) +static char * +trim (char *str) +{ + size_t len = strlen (str); + char *p = str; + + while (isspace (str[--len])) + str[len] = 0; + + while (isspace (*p)) + p++; + + return p; +} + +static char ** +str_split_common (const char *src, const char *delim, int count, int ws) { char **dst = NULL; int index = 0; - const char *dp = delim, *p; + const char *dp = delim; + char *str = str_dup (src); + char *p = str; size_t dlen = strlen (delim); size_t pos = 0, lastpos = 0; if (!str || !*str) return NULL; - for (p = str; *p; p++) + for (; *p; p++) { if (*p == *dp++) { if (!*dp) { char **tmp; - char *xp; + char *xp, *s; size_t len = pos - lastpos - dlen + 1; index++; @@ -356,17 +373,23 @@ str_split (const char *str, const char *delim, int count) if (!xp) { strv_free (dst); + xfree (str); return NULL; } memcpy (xp, &str[lastpos], len); xp[len] = 0; + s = xp; - tmp = strv_cat (dst, xp); + if (ws) + s = trim (xp); + + tmp = strv_cat (dst, s); if (!tmp) { xfree (xp); strv_free (dst); + xfree (str); return NULL; } @@ -378,9 +401,11 @@ str_split (const char *str, const char *delim, int count) if (!strv_printf (&dst, "%s", p + 1)) { strv_free (dst); + xfree (str); return NULL; } + xfree (str); return dst; } @@ -396,15 +421,33 @@ str_split (const char *str, const char *delim, int count) } p = str + lastpos; + if (ws) + p = trim (p); + if (!strv_printf (&dst, "%s", p)) { strv_free (dst); + xfree (str); return NULL; } + xfree (str); return dst; } +/* Like str_split() but trims whitespace between 'delim'. */ +char ** +str_split_ws (const char *str, const char *delim, int count) +{ + return str_split_common (str, delim, count, 1); +} + +char ** +str_split (const char *str, const char *delim, int count) +{ + return str_split_common (str, delim, count, 0); +} + char * strv_join (char *delim, char **a) { diff --git a/src/util-string.h b/src/util-string.h index bb0e873a..7b7fd279 100644 --- a/src/util-string.h +++ b/src/util-string.h @@ -54,6 +54,7 @@ char **strv_dup (char **src); char *strv_join (char *delim, char **a); char **str_split (const char *str, const char *delim, int count); +char **str_split_ws (const char *str, const char *delim, int count); char *str_down (char *str); char *str_chomp (char *str); char *str_dup (const char *); -- 2.11.4.GIT