changeset 1820:02bc3ef29b22 HEAD

Added t_strsplit_spaces().
author Timo Sirainen <tss@iki.fi>
date Mon, 20 Oct 2003 07:15:16 +0300
parents c9571aa175f8
children d623907c098a
files src/auth/mech.c src/auth/userdb-static.c src/imap/imap-fetch.c src/lib-index/mbox/mbox-lock.c src/lib-storage/index/index-storage.c src/lib-storage/mail-storage.c src/lib/strfuncs.c src/lib/strfuncs.h src/master/main.c src/master/master-settings.c
diffstat 10 files changed, 49 insertions(+), 41 deletions(-) [+]
line wrap: on
line diff
--- a/src/auth/mech.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/auth/mech.c	Mon Oct 20 07:15:16 2003 +0300
@@ -238,7 +238,7 @@
 	if (env == NULL || *env == '\0')
 		i_fatal("MECHANISMS environment is unset");
 
-	mechanisms = t_strsplit(env, " ");
+	mechanisms = t_strsplit_spaces(env, " ");
 	while (*mechanisms != NULL) {
 		if (strcasecmp(*mechanisms, "PLAIN") == 0)
 			mech_register_module(&mech_plain);
@@ -267,7 +267,7 @@
 	env = getenv("REALMS");
 	if (env == NULL)
 		env = "";
-	auth_realms = t_strsplit(env, " ");
+	auth_realms = t_strsplit_spaces(env, " ");
 
 	default_realm = getenv("DEFAULT_REALM");
 	if (default_realm != NULL && *default_realm == '\0')
--- a/src/auth/userdb-static.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/auth/userdb-static.c	Mon Oct 20 07:15:16 2003 +0300
@@ -43,10 +43,7 @@
 	static_gid = 0;
 	static_home_template = NULL;
 
-	for (tmp = t_strsplit(args, " "); *tmp != NULL; tmp++) {
-		if (**tmp == '\0')
-			continue;
-
+	for (tmp = t_strsplit_spaces(args, " "); *tmp != NULL; tmp++) {
 		if (strncasecmp(*tmp, "uid=", 4) == 0)
 			static_uid = atoi(*tmp + 4);
 		else if (strncasecmp(*tmp, "gid=", 4) == 0)
--- a/src/imap/imap-fetch.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/imap/imap-fetch.c	Mon Oct 20 07:15:16 2003 +0300
@@ -22,16 +22,15 @@
 	if (*fields == '(')
 		fields++;
 
-	field_list = t_strsplit(fields, " )");
+	field_list = t_strsplit_spaces(fields, " )");
 
 	/* array ends at ")" element */
 	for (field = dest = field_list; *field != NULL; field++) {
 		if (strcmp(*field, ")") == 0)
 			break;
-		if (**field != '\0') {
-			*dest = *field;
-			dest++;
-		}
+
+		*dest = *field;
+		dest++;
 	}
 	*dest = NULL;
 
--- a/src/lib-index/mbox/mbox-lock.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/lib-index/mbox/mbox-lock.c	Mon Oct 20 07:15:16 2003 +0300
@@ -44,7 +44,7 @@
 
 	str = getenv("MBOX_LOCKS");
 	if (str == NULL) str = DEFAULT_LOCK_METHODS;
-	for (lock = t_strsplit(str, " "); *lock != NULL; lock++) {
+	for (lock = t_strsplit_spaces(str, " "); *lock != NULL; lock++) {
 		if (strcasecmp(*lock, "dotlock") == 0)
 			use_dotlock = TRUE;
 		else if (strcasecmp(*lock, "fcntl") == 0) {
--- a/src/lib-storage/index/index-storage.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/lib-storage/index/index-storage.c	Mon Oct 20 07:15:16 2003 +0300
@@ -181,10 +181,7 @@
 		return 0;
 
 	ret = 0;
-	for (arr = t_strsplit(fields, " ,"); *arr != NULL; arr++) {
-		if (*arr == '\0')
-			continue;
-
+	for (arr = t_strsplit_spaces(fields, " ,"); *arr != NULL; arr++) {
 		for (i = 0; field_names[i] != NULL; i++) {
 			if (strcasecmp(field_names[i], *arr) == 0) {
 				ret |= field_masks[i];
--- a/src/lib-storage/mail-storage.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/lib-storage/mail-storage.c	Mon Oct 20 07:15:16 2003 +0300
@@ -44,10 +44,7 @@
 	if (env == NULL)
 		return;
 
-	for (str = t_strsplit(env, " "); *str != NULL; str++) {
-		if (**str == '\0')
-			continue;
-
+	for (str = t_strsplit_spaces(env, " "); *str != NULL; str++) {
 		list = client_workaround_list;
 		for (; list->name != NULL; list++) {
 			if (strcasecmp(*str, list->name) == 0) {
--- a/src/lib/strfuncs.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/lib/strfuncs.c	Mon Oct 20 07:15:16 2003 +0300
@@ -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;
 		}
 
@@ -501,6 +505,16 @@
         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)
 {
 	char *buffer;
--- a/src/lib/strfuncs.h	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/lib/strfuncs.h	Mon Oct 20 07:15:16 2003 +0300
@@ -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);
 
--- a/src/master/main.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/master/main.c	Mon Oct 20 07:15:16 2003 +0300
@@ -242,7 +242,8 @@
 		ssl_ip = normal_ip;
 
 	/* register wanted protocols */
-	for (proto = t_strsplit(set->protocols, " "); *proto != NULL; proto++) {
+        proto = t_strsplit_spaces(set->protocols, " ");
+	for (; *proto != NULL; proto++) {
 		fd = NULL; ip = NULL; port = 0;
 		if (strcasecmp(*proto, "imap") == 0) {
 			if (set->protocol == MAIL_PROTOCOL_IMAP) {
--- a/src/master/master-settings.c	Mon Oct 20 06:25:10 2003 +0300
+++ b/src/master/master-settings.c	Mon Oct 20 07:15:16 2003 +0300
@@ -472,7 +472,8 @@
 	}
 
 	dotlock_got = fcntl_got = flock_got = FALSE;
-	for (str = t_strsplit(set->mbox_locks, " "); *str != NULL; str++) {
+        str = t_strsplit_spaces(set->mbox_locks, " ");
+	for (; *str != NULL; str++) {
 		if (strcasecmp(*str, "dotlock") == 0)
 			dotlock_got = TRUE;
 		else if (strcasecmp(*str, "fcntl") == 0)