X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=src%2Fsrc%2Fstring.c;h=3abe2a3bdbd07de686ee2968f194ece565a1e296;hb=c59b09dc16145178a29850e7bda7d6bc6dedbc58;hp=ee5731999854c986cd4f61b4df11097708afb5a2;hpb=acec9514b1006e352ef283f205ecec75a9b6ff0d;p=exim.git diff --git a/src/src/string.c b/src/src/string.c index ee5731999..3abe2a3bd 100644 --- a/src/src/string.c +++ b/src/src/string.c @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2016 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ /* Miscellaneous string-handling functions. Some are not required for @@ -914,7 +914,7 @@ sep_is_special = iscntrl(sep); /* Handle the case when a buffer is provided. */ -if (buffer != NULL) +if (buffer) { int p = 0; for (; *s != 0; s++) @@ -960,6 +960,7 @@ else } while (g->ptr > 0 && isspace(g->s[g->ptr-1])) g->ptr--; buffer = string_from_gstring(g); + gstring_reset_unused(g); } /* Update the current pointer and return the new string */ @@ -1050,6 +1051,24 @@ return list; +/* A slightly-bogus listmaker utility; the separator is a string so +can be multiple chars - there is no checking for the element content +containing any of the separator. */ + +gstring * +string_append2_listele_n(gstring * list, const uschar * sepstr, + const uschar * ele, unsigned len) +{ +if (list && list->ptr) + list = string_cat(list, sepstr); + +list = string_catn(list, ele, len); +(void) string_from_gstring(list); +return list; +} + + + /************************************************/ /* Create a growable-string with some preassigned space */ @@ -1073,11 +1092,23 @@ g->s[g->ptr] = '\0'; return g->s; } +void +gstring_reset_unused(gstring * g) +{ +store_reset(g->s + (g->size = g->ptr + 1)); +} + /************************************************* * Add chars to string * *************************************************/ -void +/* Arguments: + g the grawable-string + p current end of data + count amount to grow by +*/ + +static void gstring_grow(gstring * g, int p, int count) { int oldsize = g->size; @@ -1102,13 +1133,7 @@ was the last item on the dynamic memory stack. This is the case if it matches store_last_get. */ if (!store_extend(g->s, oldsize, g->size)) - { - BOOL release_ok = store_last_get[store_pool] == g->s; - uschar *newstring = store_get(g->size); - memcpy(newstring, g->s, p); - if (release_ok) store_release(g->s); - g->s = newstring; - } + g->s = store_newblock(g->s, g->size, p); }