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);