}
}
-char *str_tabunescape(char *str)
+static char *str_tabunescape_from(char *str, char *src)
{
/* @UNSAFE */
- char *dest, *src, *p;
-
- src = strchr(str, '\001');
- if (src == NULL) {
- /* no unescaping needed */
- return str;
- }
+ char *dest, *p;
dest = src;
for (;;) {
return str;
}
+char *str_tabunescape(char *str)
+{
+ char *src = strchr(str, '\001');
+ if (src == NULL) {
+ /* no unescaping needed */
+ return str;
+ }
+ return str_tabunescape_from(str, src);
+}
+
const char *t_str_tabunescape(const char *str)
{
- if (strchr(str, '\001') == NULL)
+ const char *p;
+
+ p = strchr(str, '\001');
+ if (p == NULL)
return str;
- else
- return str_tabunescape(t_strdup_noconst(str));
+
+ char *dest = t_strdup_noconst(str);
+ return str_tabunescape_from(dest, dest + (p - str));
}
const char *const *t_strsplit_tabescaped_inplace(char *data)