From: Timo Sirainen Date: Thu, 11 Mar 2021 23:41:35 +0000 (+0200) Subject: lib: Optimize t_str_tabunescape() X-Git-Tag: 2.3.17~97 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6345e8f021d6bf01c2115e7c8346661029eb9edc;p=thirdparty%2Fdovecot%2Fcore.git lib: Optimize t_str_tabunescape() --- diff --git a/src/lib/strescape.c b/src/lib/strescape.c index 012689b8b7..eb3fc3bcc7 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -226,16 +226,10 @@ void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size) } } -char *str_tabunescape(char *str) +static char *str_tabunescape_from(char *str, char *src) { /* @UNSAFE */ - char *dest, *src, *p; - - src = strchr(str, '\001'); - if (src == NULL) { - /* no unescaping needed */ - return str; - } + char *dest, *p; dest = src; for (;;) { @@ -279,12 +273,26 @@ char *str_tabunescape(char *str) return str; } +char *str_tabunescape(char *str) +{ + char *src = strchr(str, '\001'); + if (src == NULL) { + /* no unescaping needed */ + return str; + } + return str_tabunescape_from(str, src); +} + const char *t_str_tabunescape(const char *str) { - if (strchr(str, '\001') == NULL) + const char *p; + + p = strchr(str, '\001'); + if (p == NULL) return str; - else - return str_tabunescape(t_strdup_noconst(str)); + + char *dest = t_strdup_noconst(str); + return str_tabunescape_from(dest, dest + (p - str)); } const char *const *t_strsplit_tabescaped_inplace(char *data)