changeset 9516:aad42b172e1a HEAD

Added str_tabunescape().
author Timo Sirainen <tss@iki.fi>
date Tue, 23 Jun 2009 17:31:08 -0400
parents 70b96df05e9a
children f5d95f4fd954
files src/lib/strescape.c src/lib/strescape.h src/lib/test-strescape.c
diffstat 3 files changed, 49 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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;
+}
--- 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
--- 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();
 }