]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: Optimize str_append_tabescaped()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Thu, 11 Mar 2021 23:27:30 +0000 (01:27 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Tue, 21 Sep 2021 07:12:53 +0000 (07:12 +0000)
Avoid calling strlen() and replace for-loop with strcspn().

src/lib/strescape.c

index 73489cad8457306a584661644f9c364c651a79e1..99482a570055ed99b03d632afdd3b20e69955b13 100644 (file)
@@ -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);
+       }
 }