dovecot-2.0: Added str_tabunescape().

dovecot at dovecot.org dovecot at dovecot.org
Wed Jun 24 01:35:34 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/aad42b172e1a
changeset: 9516:aad42b172e1a
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jun 23 17:31:08 2009 -0400
description:
Added str_tabunescape().

diffstat:

3 files changed, 49 insertions(+), 2 deletions(-)
src/lib/strescape.c      |   42 ++++++++++++++++++++++++++++++++++++++++++
src/lib/strescape.h      |    1 +
src/lib/test-strescape.c |    8 ++++++--

diffs (91 lines):

diff -r 70b96df05e9a -r aad42b172e1a src/lib/strescape.c
--- 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 @@ void str_append_tabunescaped(string_t *d
 		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;
+}
diff -r 70b96df05e9a -r aad42b172e1a src/lib/strescape.h
--- 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 *st
 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
diff -r 70b96df05e9a -r aad42b172e1a src/lib/test-strescape.c
--- 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 @@ void test_strescape(void)
 		{ "\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 @@ void test_strescape(void)
 
 	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 @@ void test_strescape(void)
 		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();
 }


More information about the dovecot-cvs mailing list