git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Transform string_append_listele{,_n}() to proper expanding-string triplet interface
[exim.git]
/
src
/
src
/
string.c
diff --git
a/src/src/string.c
b/src/src/string.c
index 4850fd958776875c7e6ef1a51482ea2576df0b86..53bcdfb7b7795ab20101892a6191418eee63977f 100644
(file)
--- a/
src/src/string.c
+++ b/
src/src/string.c
@@
-968,21
+968,43
@@
else
*listptr = s;
return buffer;
}
*listptr = s;
return buffer;
}
-#endif /* COMPILE_UTILITY */
-#ifndef COMPILE_UTILITY
+static const uschar *
+Ustrnchr(const uschar * s, int c, unsigned * len)
+{
+unsigned siz = *len;
+while (siz)
+ {
+ if (!*s) return NULL;
+ if (*s == c)
+ {
+ *len = siz;
+ return s;
+ }
+ s++;
+ siz--;
+ }
+return NULL;
+}
+
+
/************************************************
* Add element to separated list *
************************************************/
/************************************************
* Add element to separated list *
************************************************/
-/* This function is used to build a list, returning
-an allocated null-terminated growable string. The
-given element has any embedded separator characters
+/* This function is used to build a list, returning an allocated null-terminated
+growable string. The given element has any embedded separator characters
doubled.
doubled.
+Despite having the same growable-string interface as string_cat() the list is
+always returned null-terminated.
+
Arguments:
list points to the start of the list that is being built, or NULL
if this is a new list that has no contents yet
Arguments:
list points to the start of the list that is being built, or NULL
if this is a new list that has no contents yet
+ sz (ptr to) amount of memory allocated for list; zero for a new list
+ off (ptr to) current list length in chars (insert point for next addition),
+ zero for a new list
sep list separator character
ele new element to be appended to the list
sep list separator character
ele new element to be appended to the list
@@
-990,78
+1012,49
@@
Returns: pointer to the start of the list, changed if copied for expansion.
*/
uschar *
*/
uschar *
-string_append_listele(uschar * list, uschar sep, const uschar * ele)
+string_append_listele(uschar * list, int * sz, int * off,
+ uschar sep, const uschar * ele)
{
{
-uschar * new = NULL;
-int sz = 0, off = 0;
uschar * sp;
if (list)
uschar * sp;
if (list)
- {
- new = string_cat (new, &sz, &off, list);
- new = string_catn(new, &sz, &off, &sep, 1);
- }
+ list = string_catn(list, sz, off, &sep, 1);
while((sp = Ustrchr(ele, sep)))
{
while((sp = Ustrchr(ele, sep)))
{
-
new = string_catn(new, &sz, &
off, ele, sp-ele+1);
-
new = string_catn(new, &sz, &
off, &sep, 1);
+
list = string_catn(list, sz,
off, ele, sp-ele+1);
+
list = string_catn(list, sz,
off, &sep, 1);
ele = sp+1;
}
ele = sp+1;
}
-
new = string_cat(new, &sz, &
off, ele);
-
new[
off] = '\0';
-return
new
;
+
list = string_cat(list, sz,
off, ele);
+
list[*
off] = '\0';
+return
list
;
}
}
-static const uschar *
-Ustrnchr(const uschar * s, int c, unsigned * len)
-{
-unsigned siz = *len;
-while (siz)
- {
- if (!*s) return NULL;
- if (*s == c)
- {
- *len = siz;
- return s;
- }
- s++;
- siz--;
- }
-return NULL;
-}
-
uschar *
uschar *
-string_append_listele_n(uschar * list,
uschar sep, const uschar * ele
,
- unsigned len)
+string_append_listele_n(uschar * list,
int * sz, int * off
,
+ u
schar sep, const uschar * ele, u
nsigned len)
{
{
-uschar * new = NULL;
-int sz = 0, off = 0;
const uschar * sp;
if (list)
const uschar * sp;
if (list)
- {
- new = string_cat (new, &sz, &off, list);
- new = string_catn(new, &sz, &off, &sep, 1);
- }
+ list = string_catn(list, sz, off, &sep, 1);
while((sp = Ustrnchr(ele, sep, &len)))
{
while((sp = Ustrnchr(ele, sep, &len)))
{
-
new = string_catn(new, &sz, &
off, ele, sp-ele+1);
-
new = string_catn(new, &sz, &
off, &sep, 1);
+
list = string_catn(list, sz,
off, ele, sp-ele+1);
+
list = string_catn(list, sz,
off, &sep, 1);
ele = sp+1;
len--;
}
ele = sp+1;
len--;
}
-
new = string_catn(new, &sz, &
off, ele, len);
-
new[
off] = '\0';
-return
new
;
+
list = string_catn(list, sz,
off, ele, len);
+
list[*
off] = '\0';
+return
list
;
}
}
-#endif /* COMPILE_UTILITY */
-#ifndef COMPILE_UTILITY
/*************************************************
* Add chars to string *
*************************************************/
/*************************************************
* Add chars to string *
*************************************************/
@@
-1081,7
+1074,7
@@
Arguments:
characters, updated to the new offset
s points to characters to add
count count of characters to add; must not exceed the length of s, if s
characters, updated to the new offset
s points to characters to add
count count of characters to add; must not exceed the length of s, if s
- is a C string.
If -1 given, strlen(s) is used.
+ is a C string.
If string is given as NULL, *size and *ptr should both be zero.
If string is given as NULL, *size and *ptr should both be zero.