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;
+}
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
{ "\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;
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);
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();
}