# HG changeset patch # User Timo Sirainen # Date 1245792668 14400 # Node ID aad42b172e1ae21d6788d53eadd86c87e64ecf27 # Parent 70b96df05e9ae88168fb3d4ba14d77be4092a2c1 Added str_tabunescape(). diff -r 70b96df05e9a -r aad42b172e1a src/lib/strescape.c --- a/src/lib/strescape.c Tue Jun 23 17:30:42 2009 -0400 +++ b/src/lib/strescape.c Tue Jun 23 17:31:08 2009 -0400 @@ -161,3 +161,45 @@ 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 -r 70b96df05e9a -r aad42b172e1a src/lib/strescape.h --- a/src/lib/strescape.h Tue Jun 23 17:30:42 2009 -0400 +++ b/src/lib/strescape.h Tue Jun 23 17:31:08 2009 -0400 @@ -17,5 +17,6 @@ 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 -r 70b96df05e9a -r aad42b172e1a src/lib/test-strescape.c --- a/src/lib/test-strescape.c Tue Jun 23 17:30:42 2009 -0400 +++ b/src/lib/test-strescape.c Tue Jun 23 17:31:08 2009 -0400 @@ -25,7 +25,7 @@ { "\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 @@ 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 @@ 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(); }