]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added str_tabunescape().
authorTimo Sirainen <tss@iki.fi>
Tue, 23 Jun 2009 21:31:08 +0000 (17:31 -0400)
committerTimo Sirainen <tss@iki.fi>
Tue, 23 Jun 2009 21:31:08 +0000 (17:31 -0400)
--HG--
branch : HEAD

src/lib/strescape.c
src/lib/strescape.h
src/lib/test-strescape.c

index aa8c154f77a797eb568b030c4f27afbb791968e8..5ac13414b4bd241272aea99ccda888a5d39f2082 100644 (file)
@@ -161,3 +161,45 @@ void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size)
                start = i;
        }
 }
+
+char *str_tabunescape(char *str)
+{
+       /* @UNSAFE */
+       char *dest, *start = str;
+
+       while (*str != '\001') {
+               if (*str == '\0')
+                       return start;
+               str++;
+       }
+
+       for (dest = str; *str != '\0'; str++) {
+               if (*str != '\001')
+                       *dest++ = *str;
+               else {
+                       str++;
+                       if (*str == '\0')
+                               break;
+                       switch (*str) {
+                       case '1':
+                               *dest++ = '\001';
+                               break;
+                       case 't':
+                               *dest++ = '\t';
+                               break;
+                       case 'r':
+                               *dest++ = '\r';
+                               break;
+                       case 'n':
+                               *dest++ = '\n';
+                               break;
+                       default:
+                               *dest++ = *str;
+                               break;
+                       }
+               }
+       }
+
+       *dest = '\0';
+       return start;
+}
index c9d6ee159ba8f66bb0429cd1a06b1145245ea95f..93457e4b856a37b75df395b13331e0197c0274db 100644 (file)
@@ -17,5 +17,6 @@ char *str_unescape(char *str);
 const char *str_tabescape(const char *str);
 void str_tabescape_write(string_t *dest, const char *src);
 void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size);
+char *str_tabunescape(char *str);
 
 #endif
index 165b0a9d9072d6db850f8339c6dca518a98e24d0..156a83f43fb02cb0fe124a17b6505f290e69fe89 100644 (file)
@@ -25,7 +25,7 @@ void test_strescape(void)
                { "\001\001\t\t\r\r\n\n", "\0011\0011\001t\001t\001r\001r\001n\001n" }
        };
        unsigned char buf[1 << CHAR_BIT];
-       const char *escaped;
+       const char *escaped, *tabstr;
        string_t *str;
        unsigned int i;
 
@@ -59,6 +59,8 @@ void test_strescape(void)
 
        test_begin("str_tabescape");
        for (i = 0; i < N_ELEMENTS(tabesc); i++) {
+               test_assert(strcmp(str_tabunescape(t_strdup_noconst(tabesc[i].output)),
+                                  tabesc[i].input) == 0);
                test_assert(strcmp(str_tabescape(tabesc[i].input),
                                   tabesc[i].output) == 0);
                str_truncate(str, 0);
@@ -66,7 +68,9 @@ void test_strescape(void)
                test_assert(strcmp(str_c(str), tabesc[i].input) == 0);
        }
        str_truncate(str, 0);
-       str_append_tabunescaped(str, "\0012\001l\001", strlen("\0012\001l\001"));
+       tabstr = "\0012\001l\001";
+       str_append_tabunescaped(str, tabstr, strlen(tabstr));
        test_assert(strcmp(str_c(str), "2l") == 0);
+       test_assert(strcmp(str_c(str), str_tabunescape(t_strdup_noconst(tabstr))) == 0);
        test_end();
 }