summaryrefslogtreecommitdiff
path: root/py/objstrunicode.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/objstrunicode.c')
-rw-r--r--py/objstrunicode.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/py/objstrunicode.c b/py/objstrunicode.c
index 8231eb9b1..0ee7f1dc9 100644
--- a/py/objstrunicode.c
+++ b/py/objstrunicode.c
@@ -91,8 +91,44 @@ 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);
+ return;
+ }
+ #endif
if (kind == PRINT_STR) {
print(env, "%.*s", str_len, str_data);
} else {