From: Timo Sirainen Date: Tue, 23 Jun 2009 21:31:08 +0000 (-0400) Subject: Added str_tabunescape(). X-Git-Tag: 2.0.alpha1~536 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=03b33ccb012636e453189ceef3865dee7812392e;p=thirdparty%2Fdovecot%2Fcore.git Added str_tabunescape(). --HG-- branch : HEAD --- diff --git a/src/lib/strescape.c b/src/lib/strescape.c index aa8c154f77..5ac13414b4 100644 --- a/src/lib/strescape.c +++ b/src/lib/strescape.c @@ -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; +} diff --git a/src/lib/strescape.h b/src/lib/strescape.h index c9d6ee159b..93457e4b85 100644 --- a/src/lib/strescape.h +++ b/src/lib/strescape.h @@ -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 diff --git a/src/lib/test-strescape.c b/src/lib/test-strescape.c index 165b0a9d90..156a83f43f 100644 --- a/src/lib/test-strescape.c +++ b/src/lib/test-strescape.c @@ -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(); }