return ret;
}
-void json_append_escaped(string_t *dest, const char *src)
+static void json_append_escaped_char(string_t *dest, unsigned char src)
{
- for (; *src != '\0'; src++) {
- switch (*src) {
- case '\b':
- str_append(dest, "\\b");
- break;
- case '\f':
- str_append(dest, "\\f");
- break;
- case '\n':
- str_append(dest, "\\n");
- break;
- case '\r':
- str_append(dest, "\\r");
- break;
- case '\t':
- str_append(dest, "\\t");
- break;
- case '"':
- str_append(dest, "\\\"");
- break;
- case '\\':
- str_append(dest, "\\\\");
- break;
- default:
- if ((unsigned char)*src < 32)
- str_printfa(dest, "\\u%04x", *src);
- else
- str_append_c(dest, *src);
- break;
- }
+ switch (src) {
+ case '\b':
+ str_append(dest, "\\b");
+ break;
+ case '\f':
+ str_append(dest, "\\f");
+ break;
+ case '\n':
+ str_append(dest, "\\n");
+ break;
+ case '\r':
+ str_append(dest, "\\r");
+ break;
+ case '\t':
+ str_append(dest, "\\t");
+ break;
+ case '"':
+ str_append(dest, "\\\"");
+ break;
+ case '\\':
+ str_append(dest, "\\\\");
+ break;
+ default:
+ if (src < 32)
+ str_printfa(dest, "\\u%04x", src);
+ else
+ str_append_c(dest, src);
+ break;
}
}
+
+void json_append_escaped(string_t *dest, const char *src)
+{
+ for (; *src != '\0'; src++)
+ json_append_escaped_char(dest, *src);
+}
+
+void json_append_escaped_data(string_t *dest, const unsigned char *src, size_t size)
+{
+ unsigned int i;
+
+ for (i = 0; i < size; i++)
+ json_append_escaped_char(dest, src[i]);
+}
test_end();
}
+static void test_json_append_escaped_data(void)
+{
+ static const unsigned char test_input[] =
+ "\b\f\r\n\t\"\\\000\001\002-\xC3\xA4";
+ string_t *str = t_str_new(32);
+
+ test_begin("json_append_escaped()");
+ json_append_escaped_data(str, test_input, sizeof(test_input)-1);
+ test_assert(strcmp(str_c(str), "\\b\\f\\r\\n\\t\\\"\\\\\\u0000\\u0001\\u0002-\xC3\xA4") == 0);
+ test_end();
+}
+
void test_json_parser(void)
{
test_json_parser_success(TRUE);
test_json_parser_success(FALSE);
test_json_append_escaped();
+ test_json_append_escaped_data();
}