]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Add str_append_escaped and use it with str_escape
authorAki Tuomi <aki.tuomi@dovecot.fi>
Wed, 9 May 2018 07:18:39 +0000 (10:18 +0300)
committerAki Tuomi <aki.tuomi@dovecot.fi>
Tue, 21 Aug 2018 09:13:21 +0000 (12:13 +0300)
src/lib/strescape.c
src/lib/strescape.h

index 6312367f2a4b9134d30fdb0770bea96214be9dc7..9af20ddba1e0470e004f61c95f4b2c905cae0aff 100644 (file)
@@ -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)
index b4658ce21c2bda54ad51a456aca5543fa5e6678c..138165085099fd32a832c68ff57425b44ecaa8e6 100644 (file)
@@ -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);