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