]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Optimize p_strsplit_tabescaped()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 17 Sep 2021 13:10:12 +0000 (16:10 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 21 Sep 2021 07:12:53 +0000 (07:12 +0000)
src/lib/strescape.c

index 0d2fc1c50b9b29906c789960c05a1788a8556199..54d44ec235c66443dd4b056802fa753438aefc98 100644 (file)
@@ -295,17 +295,19 @@ const char *t_str_tabunescape(const char *str)
        return str_tabunescape_from(dest, dest + (p - str));
 }
 
-const char *const *t_strsplit_tabescaped_inplace(char *data)
+static char **p_strsplit_tabescaped_inplace(pool_t pool, char *data)
 {
        /* @UNSAFE */
        char **array;
        unsigned int count, new_alloc_count, alloc_count;
 
        if (*data == '\0')
-               return t_new(const char *, 1);
+               return p_new(pool, char *, 1);
 
        alloc_count = 32;
-       array = t_malloc_no0(sizeof(char *) * alloc_count);
+       array = pool == unsafe_data_stack_pool ?
+               t_malloc_no0(sizeof(char *) * alloc_count) :
+               p_malloc(pool, sizeof(char *) * alloc_count);
 
        array[0] = data; count = 1;
        char *need_unescape = NULL;
@@ -319,7 +321,7 @@ const char *const *t_strsplit_tabescaped_inplace(char *data)
                }
                if (count+1 >= alloc_count) {
                        new_alloc_count = nearest_power(alloc_count+1);
-                       array = p_realloc(unsafe_data_stack_pool, array,
+                       array = p_realloc(pool, array,
                                          sizeof(char *) * alloc_count,
                                          sizeof(char *) *
                                          new_alloc_count);
@@ -337,18 +339,19 @@ const char *const *t_strsplit_tabescaped_inplace(char *data)
        i_assert(count < alloc_count);
        array[count] = NULL;
 
-       return (const char *const *)array;
+       return array;
 }
 
-char **p_strsplit_tabescaped(pool_t pool, const char *str)
+const char *const *t_strsplit_tabescaped_inplace(char *data)
 {
-       char **args;
-       unsigned int i;
+       char *const *escaped =
+               p_strsplit_tabescaped_inplace(unsafe_data_stack_pool, data);
+       return (const char *const *)escaped;
+}
 
-       args = p_strsplit(pool, str, "\t");
-       for (i = 0; args[i] != NULL; i++)
-               args[i] = str_tabunescape(args[i]);
-       return args;
+char **p_strsplit_tabescaped(pool_t pool, const char *str)
+{
+       return p_strsplit_tabescaped_inplace(pool, p_strdup(pool, str));
 }
 
 const char *const *t_strsplit_tabescaped(const char *str)