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 be1a1d7a4771ddaf2a90cb4ce97552a4ff1f9211..53bcdfb7b7795ab20101892a6191418eee63977f 100644
(file)
--- a/
src/src/string.c
+++ b/
src/src/string.c
@@
-42,7
+42,7
@@
int yield = 4;
/* If an optional mask is permitted, check for it. If found, pass back the
offset. */
/* If an optional mask is permitted, check for it. If found, pass back the
offset. */
-if (maskptr
!= NULL
)
+if (maskptr)
{
const uschar *ss = s + Ustrlen(s);
*maskptr = 0;
{
const uschar *ss = s + Ustrlen(s);
*maskptr = 0;
@@
-79,7
+79,7
@@
if (Ustrchr(s, ':') != NULL)
if we hit the / that introduces a mask or the % that introduces the
interface specifier (scope id) of a link-local address. */
if we hit the / that introduces a mask or the % that introduces the
interface specifier (scope id) of a link-local address. */
- if (*s == 0 || *s == '%' || *s == '/') return had_double_colon? yield : 0;
+ if (*s == 0 || *s == '%' || *s == '/') return had_double_colon
? yield : 0;
/* If a component starts with an additional colon, we have hit a double
colon. This is permitted to appear once only, and counts as at least
/* If a component starts with an additional colon, we have hit a double
colon. This is permitted to appear once only, and counts as at least
@@
-135,13
+135,16
@@
if (Ustrchr(s, ':') != NULL)
for (i = 0; i < 4; i++)
{
for (i = 0; i < 4; i++)
{
+ long n;
+ uschar * end;
+
if (i != 0 && *s++ != '.') return 0;
if (i != 0 && *s++ != '.') return 0;
- if (!isdigit(*s++)) return 0;
- if (isdigit(*s) && isdigit(*(++s))) s++;
+ n = strtol(CCS s, CSS &end, 10);
+ if (n > 255 || n < 0 || end <= s || end > s+3) return 0;
+ s = end;
}
}
-return (*s == 0 || (*s == '/' && maskptr != NULL && *maskptr != 0))?
- yield : 0;
+return !*s || (*s == '/' && maskptr && *maskptr != 0) ? yield : 0;
}
#endif /* COMPILE_UTILITY */
}
#endif /* COMPILE_UTILITY */
@@
-306,7
+309,7
@@
expanded string. */
ss = store_get(length + nonprintcount * 3 + 1);
ss = store_get(length + nonprintcount * 3 + 1);
-/* Copy everying, escaping non printers. */
+/* Copy every
th
ing, escaping non printers. */
t = s;
tt = ss;
t = s;
tt = ss;
@@
-965,100
+968,93
@@
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 seperator 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
- sep list seperator charactoer
- ele new lement to be appended to the list
+ 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
Returns: pointer to the start of the list, changed if copied for expansion.
*/
uschar *
Returns: pointer to the start of the list, changed if copied for expansion.
*/
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 *
*************************************************/
@@
-1078,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.