py: Simplify JSON str printing (while still conforming to JSON spec).

The JSON specs are relatively flexible and allow us to use one function
to print strings, be they ascii, bytes or utf-8 encoded.
This commit is contained in:
Damien George
2014-09-25 17:35:56 +01:00
parent d19c256656
commit cde0ca21bf
4 changed files with 12 additions and 41 deletions

View File

@@ -91,41 +91,11 @@ STATIC void uni_print_quoted(void (*print)(void *env, const char *fmt, ...), voi
print(env, "%c", quote_char);
}
#if MICROPY_PY_UJSON
STATIC void uni_print_json(void (*print)(void *env, const char *fmt, ...), void *env, const byte *str_data, uint str_len) {
print(env, "\"");
const byte *s = str_data, *top = str_data + str_len;
while (s < top) {
unichar ch;
ch = utf8_get_char(s);
s = utf8_next_char(s);
if (ch == '"' || ch == '\\' || ch == '/') {
print(env, "\\%c", ch);
} else if (32 <= ch && ch <= 126) {
print(env, "%c", ch);
} else if (*s == '\b') {
print(env, "\\b");
} else if (*s == '\f') {
print(env, "\\f");
} else if (*s == '\n') {
print(env, "\\n");
} else if (*s == '\r') {
print(env, "\\r");
} else if (*s == '\t') {
print(env, "\\t");
} else {
print(env, "\\u%04x", ch);
}
}
print(env, "\"");
}
#endif
STATIC void uni_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) {
GET_STR_DATA_LEN(self_in, str_data, str_len);
#if MICROPY_PY_UJSON
if (kind == PRINT_JSON) {
uni_print_json(print, env, str_data, str_len);
mp_str_print_json(print, env, str_data, str_len);
return;
}
#endif