[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