Mercurial > dovecot > core-2.2
diff src/lib/strescape.c @ 20600:9af7c7196540
lib: Add binary-safe tabescape
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Mon, 08 Aug 2016 11:23:02 +0300 |
parents | 327fcf6d2205 |
children | 2e2563132d5f |
line wrap: on
line diff
--- a/src/lib/strescape.c Mon Aug 08 09:29:26 2016 +0300 +++ b/src/lib/strescape.c Mon Aug 08 11:23:02 2016 +0300 @@ -101,10 +101,14 @@ return 0; } -void str_append_tabescaped(string_t *dest, const char *src) +void str_append_tabescaped_n(string_t *dest, const unsigned char *src, size_t src_size) { - for (; *src != '\0'; src++) { - switch (*src) { + for (size_t i = 0; i < src_size; i++) { + switch (src[i]) { + case '\000': + str_append_c(dest, '\001'); + str_append_c(dest, '0'); + break; case '\001': str_append_c(dest, '\001'); str_append_c(dest, '1'); @@ -122,12 +126,17 @@ str_append_c(dest, 'n'); break; default: - str_append_c(dest, *src); + str_append_c(dest, src[i]); break; } } } +void str_append_tabescaped(string_t *dest, const char *src) { + str_append_tabescaped_n(dest, (const unsigned char*)src, strlen(src)); +} + + const char *str_tabescape(const char *str) { string_t *tmp; @@ -161,6 +170,9 @@ i++; if (i < src_size) { switch (src_c[i]) { + case '0': + str_append_c(dest, '\000'); + break; case '1': str_append_c(dest, '\001'); break; @@ -203,6 +215,9 @@ if (*str == '\0') break; switch (*str) { + case '0': + *dest++ = '\000'; + break; case '1': *dest++ = '\001'; break;