diff src/lib/strescape.c @ 9484:5a6fe52a0cfc HEAD

Added str_append_tabunescaped(). str_tabescape*() now escapes also CR. Added unit tests.
author Timo Sirainen <tss@iki.fi>
date Tue, 16 Jun 2009 13:49:18 -0400
parents 464116e1d0ae
children aad42b172e1a
line wrap: on
line diff
--- a/src/lib/strescape.c	Tue Jun 16 13:39:40 2009 -0400
+++ b/src/lib/strescape.c	Tue Jun 16 13:49:18 2009 -0400
@@ -65,8 +65,11 @@
 	}
 
 	for (dest = str; *str != '\0'; str++) {
-		if (*str == '\\' && str[1] != '\0')
+		if (*str == '\\') {
 			str++;
+			if (*str == '\0')
+				break;
+		}
 
 		*dest++ = *str;
 	}
@@ -87,6 +90,10 @@
 			str_append_c(dest, '\001');
 			str_append_c(dest, 't');
 			break;
+		case '\r':
+			str_append_c(dest, '\001');
+			str_append_c(dest, 'r');
+			break;
 		case '\n':
 			str_append_c(dest, '\001');
 			str_append_c(dest, 'n');
@@ -104,7 +111,7 @@
 	const char *p;
 
 	for (p = str; *p != '\0'; p++) {
-		if (*p <= '\n') {
+		if (*p <= '\r') {
 			tmp = t_str_new(128);
 			str_append_n(tmp, str, p-str);
 			str_tabescape_write(tmp, p);
@@ -113,3 +120,44 @@
 	}
 	return str;
 }
+
+void str_append_tabunescaped(string_t *dest, const void *src, size_t src_size)
+{
+	const unsigned char *src_c = src;
+	size_t start = 0, i = 0;
+
+	while (i < src_size) {
+		start = i;
+		for (; i < src_size; i++) {
+			if (src_c[i] == '\001')
+				break;
+		}
+
+		str_append_n(dest, src_c + start, i-start);
+
+		if (i < src_size) {
+			i++;
+			if (i < src_size) {
+				switch (src_c[i]) {
+				case '1':
+					str_append_c(dest, '\001');
+					break;
+				case 't':
+					str_append_c(dest, '\t');
+					break;
+				case 'r':
+					str_append_c(dest, '\r');
+					break;
+				case 'n':
+					str_append_c(dest, '\n');
+					break;
+				default:
+					str_append_c(dest, src_c[i]);
+					break;
+				}
+				i++;
+			}
+		}
+		start = i;
+	}
+}