Mercurial > dovecot > core-2.2
diff src/lib/strescape.c @ 9484:5a6fe52a0cfc HEAD
Added str_append_tabunescaped(). str_tabescape*() now escapes also CR. Added unit tests.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 16 Jun 2009 13:49:18 -0400 |
parents | 464116e1d0ae |
children | aad42b172e1a |
line wrap: on
line diff
--- a/src/lib/strescape.c Tue Jun 16 13:39:40 2009 -0400 +++ b/src/lib/strescape.c Tue Jun 16 13:49:18 2009 -0400 @@ -65,8 +65,11 @@ } for (dest = str; *str != '\0'; str++) { - if (*str == '\\' && str[1] != '\0') + if (*str == '\\') { str++; + if (*str == '\0') + break; + } *dest++ = *str; } @@ -87,6 +90,10 @@ str_append_c(dest, '\001'); str_append_c(dest, 't'); break; + case '\r': + str_append_c(dest, '\001'); + str_append_c(dest, 'r'); + break; case '\n': str_append_c(dest, '\001'); str_append_c(dest, 'n'); @@ -104,7 +111,7 @@ const char *p; for (p = str; *p != '\0'; p++) { - if (*p <= '\n') { + if (*p <= '\r') { tmp = t_str_new(128); str_append_n(tmp, str, p-str); str_tabescape_write(tmp, p); @@ -113,3 +120,44 @@ } return str; } + +void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size) +{ + const unsigned char *src_c = src; + size_t start = 0, i = 0; + + while (i < src_size) { + start = i; + for (; i < src_size; i++) { + if (src_c[i] == '\001') + break; + } + + str_append_n(dest, src_c + start, i-start); + + if (i < src_size) { + i++; + if (i < src_size) { + switch (src_c[i]) { + case '1': + str_append_c(dest, '\001'); + break; + case 't': + str_append_c(dest, '\t'); + break; + case 'r': + str_append_c(dest, '\r'); + break; + case 'n': + str_append_c(dest, '\n'); + break; + default: + str_append_c(dest, src_c[i]); + break; + } + i++; + } + } + start = i; + } +}