From: Aki Tuomi Date: Wed, 9 May 2018 07:18:39 +0000 (+0300) Subject: lib: Add str_append_escaped and use it with str_escape X-Git-Tag: 2.3.4~305 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6f56eb2a0c5123c09f33042b6d0805c1704fc025;p=thirdparty%2Fdovecot%2Fcore.git lib: Add str_append_escaped and use it with str_escape --- diff --git a/src/lib/strescape.c b/src/lib/strescape.c index 6312367f2a..9af20ddba1 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -6,27 +6,28 @@ const char *str_nescape(const void *str, size_t len) { - const unsigned char *s = str, *p = str; - string_t *ret; + string_t *dest = t_str_new(len*2); + str_append_escaped(dest, str, len); + return str_c(dest); +} + +void str_append_escaped(string_t *dest, const void *src, size_t src_size) +{ + const unsigned char *pstart = src, *p = src, *pend = pstart + src_size; /* see if we need to quote it */ - for (p = str; (size_t)(p - s) < len; p++) { + for (; p < pend; p++) { if (IS_ESCAPED_CHAR(*p)) break; } - if (p == (s + len)) - return str; - /* quote */ - ret = t_str_new((size_t)(p - s) + 128); - str_append_n(ret, s, (size_t)(p - s)); + str_append_data(dest, pstart, (size_t)(p - pstart)); - for (; (size_t)(p - s) < len; p++) { + for (; p < pend; p++) { if (IS_ESCAPED_CHAR(*p)) - str_append_c(ret, '\\'); - str_append_data(ret, p, 1); + str_append_c(dest, '\\'); + str_append_data(dest, p, 1); } - return str_c(ret); } void str_append_unescaped(string_t *dest, const void *src, size_t src_size) diff --git a/src/lib/strescape.h b/src/lib/strescape.h index b4658ce21c..1381650850 100644 --- a/src/lib/strescape.h +++ b/src/lib/strescape.h @@ -13,6 +13,7 @@ static inline const char *str_escape(const char *str) return str_nescape(str, strlen(str)); } +void str_append_escaped(string_t *dest, const void *src, size_t src_size); /* remove all '\' characters, append to given string */ void str_append_unescaped(string_t *dest, const void *src, size_t src_size);