#include "str.h"
#include "strescape.h"
-const char *str_escape(const char *str)
+const char *str_nescape(const void *str, size_t len)
{
- const char *p;
+ const unsigned char *s = str, *p = str;
string_t *ret;
-
/* see if we need to quote it */
- for (p = str; *p != '\0'; p++) {
+ for (p = str; (size_t)(p - s) < len; p++) {
if (IS_ESCAPED_CHAR(*p))
break;
}
- if (*p == '\0')
+ if (p == (s + len))
return str;
/* quote */
- ret = t_str_new((size_t) (p - str) + 128);
- str_append_n(ret, str, (size_t) (p - str));
+ ret = t_str_new((size_t)(p - s) + 128);
+ str_append_n(ret, s, (size_t)(p - s));
- for (; *p != '\0'; p++) {
+ for (; (size_t)(p - s) < len; p++) {
if (IS_ESCAPED_CHAR(*p))
str_append_c(ret, '\\');
- str_append_c(ret, *p);
+ str_append_data(ret, p, 1);
}
return str_c(ret);
}
#define IS_ESCAPED_CHAR(c) ((c) == '"' || (c) == '\\' || (c) == '\'')
-/* escape all '\', '"' and "'" characters */
-const char *str_escape(const char *str);
+/* escape all '\', '"' and "'" characters,
+ this is nul safe */
+const char *str_nescape(const void *str, size_t len);
+
+/* escape string */
+static inline const char *str_escape(const char *str)
+{
+ return str_nescape(str, strlen(str));
+}
/* remove all '\' characters, append to given string */
void str_append_unescaped(string_t *dest, const void *src, size_t src_size);
"\\\\\\\\\\\"\\\"\\\'\\\'") == 0);
test_end();
+ test_begin("str_nescape");
+
+ escaped = str_nescape("\"escape only first but not 'this'", 10);
+ test_assert(strcmp(escaped, "\\\"escape on") == 0);
+
+ escaped = str_nescape("\"hello\"\0\"world\"", 15);
+ test_assert(memcmp(escaped, "\\\"hello\\\"\0\\\"world\\\"", 19) == 0);
+
+ test_end();
+
str = t_str_new(256);
test_begin("str_unescape");
for (i = 0; i < N_ELEMENTS(unesc); i++) {