[dovecot-cvs] dovecot/src/lib strfuncs.c,1.34,1.35 strfuncs.h,1.17,1.18

cras at procontrol.fi cras at procontrol.fi
Mon Oct 20 08:15:19 EEST 2003


Update of /home/cvs/dovecot/src/lib
In directory danu:/tmp/cvs-serv771/lib

Modified Files:
	strfuncs.c strfuncs.h 
Log Message:
Added t_strsplit_spaces().



Index: strfuncs.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib/strfuncs.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- strfuncs.c	21 Sep 2003 17:18:29 -0000	1.34
+++ strfuncs.c	20 Oct 2003 04:15:17 -0000	1.35
@@ -218,8 +218,8 @@
 const char *_vstrconcat(const char *str1, va_list args, size_t *ret_len)
 {
 	const char *str;
-        char *temp, *temp_end, *p;
-	size_t bufsize, pos;
+        char *temp;
+	size_t bufsize, i, len;
 
 	if (str1 == NULL)
 		return NULL;
@@ -228,29 +228,26 @@
 	bufsize = STRCONCAT_BUFSIZE;
 	temp = t_buffer_get(bufsize);
 
-	pos = 0;
+	i = 0;
 	do {
-		temp_end = temp + bufsize - 1; /* leave 1 for \0 */
-
-		p = temp + pos;
-		while (*str != '\0' && p != temp_end)
-			*p++ = *str++;
-		pos = (size_t)(p - temp);
+		len = strlen(str);
 
-		if (p == temp_end) {
+		if (i + len >= bufsize) {
 			/* need more memory */
-			bufsize = nearest_power(bufsize+1);
+			bufsize = nearest_power(i + len + 1);
 			temp = t_buffer_reget(temp, bufsize);
-		} else {
-			/* next string */
-			str = va_arg(args, const char *);
 		}
+
+		memcpy(temp + i, str, len);
+
+		/* next string */
+		str = va_arg(args, const char *);
 	} while (str != NULL);
 
-	i_assert(pos < bufsize);
+	i_assert(i < bufsize);
 
-	temp[pos] = '\0';
-        *ret_len = pos+1;
+	temp[i++] = '\0';
+        *ret_len = i;
         return temp;
 }
 
@@ -463,7 +460,8 @@
         return 0;
 }
 
-const char **t_strsplit(const char *data, const char *separators)
+static const char **_strsplit(const char *data, const char *separators,
+			      int spaces)
 {
         const char **array;
 	char *str;
@@ -487,7 +485,13 @@
 						       alloc_len);
 			}
 
-                        *str = '\0';
+			if (*str != ' ' || !spaces)
+				*str = '\0';
+			else {
+				*str = '\0';
+				while (str[1] == ' ') str++;
+			}
+
 			array[len++] = str+1;
 		}
 
@@ -499,6 +503,16 @@
 
 	t_buffer_alloc(sizeof(const char *) * (len+1));
         return array;
+}
+
+const char **t_strsplit(const char *data, const char *separators)
+{
+	return _strsplit(data, separators, FALSE);
+}
+
+const char **t_strsplit_spaces(const char *data, const char *separators)
+{
+	return _strsplit(data, separators, TRUE);
 }
 
 const char *dec2str(uintmax_t number)

Index: strfuncs.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib/strfuncs.h,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- strfuncs.h	20 Jan 2003 14:52:51 -0000	1.17
+++ strfuncs.h	20 Oct 2003 04:15:17 -0000	1.18
@@ -56,6 +56,8 @@
 
 /* seprators is an array of separator characters, not a separator string. */
 const char **t_strsplit(const char *data, const char *separators);
+/* like t_strsplit(), but treats multiple spaces as a single separator. */
+const char **t_strsplit_spaces(const char *data, const char *separators);
 
 const char *dec2str(uintmax_t number);
 



More information about the dovecot-cvs mailing list