From ea636c55e4bea1785e5178b41c48c634eba8bc6d Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 12 Mar 2021 01:27:30 +0200 Subject: [PATCH] lib: Optimize str_append_tabescaped() Avoid calling strlen() and replace for-loop with strcspn(). --- src/lib/strescape.c | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/lib/strescape.c b/src/lib/strescape.c index 73489cad84..99482a5700 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -135,7 +135,35 @@ void str_append_tabescaped_n(string_t *dest, const unsigned char *src, size_t sr void str_append_tabescaped(string_t *dest, const char *src) { - str_append_tabescaped_n(dest, (const unsigned char*)src, strlen(src)); + size_t pos, prev_pos = 0; + char esc[2] = { '\001', '\0' }; + + for (;;) { + pos = prev_pos + strcspn(src + prev_pos, "\001\t\r\n"); + str_append_data(dest, src + prev_pos, pos - prev_pos); + prev_pos = pos + 1; + + switch (src[pos]) { + case '\000': + /* end of src string reached */ + return; + case '\001': + esc[1] = '1'; + break; + case '\t': + esc[1] = 't'; + break; + case '\r': + esc[1] = 'r'; + break; + case '\n': + esc[1] = 'n'; + break; + default: + i_unreached(); + } + str_append_data(dest, esc, 2); + } } -- 2.47.3