Mercurial > dovecot > core-2.2
changeset 20600:9af7c7196540
lib: Add binary-safe tabescape
author | Aki Tuomi <aki.tuomi@dovecot.fi> |
---|---|
date | Mon, 08 Aug 2016 11:23:02 +0300 |
parents | ad69150c10f9 |
children | 4a9ec6ed3ddc |
files | src/lib/strescape.c src/lib/strescape.h |
diffstat | 2 files changed, 20 insertions(+), 4 deletions(-) [+] |
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;
--- a/src/lib/strescape.h Mon Aug 08 09:29:26 2016 +0300 +++ b/src/lib/strescape.h Mon Aug 08 11:23:02 2016 +0300 @@ -21,6 +21,7 @@ using \001. */ const char *str_tabescape(const char *str); 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); void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size); char *str_tabunescape(char *str); const char *t_str_tabunescape(const char *str);