diff options
author | Ori Bernstein <ori@eigenstate.org> | 2022-12-18 01:43:51 +0000 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2022-12-18 01:43:51 +0000 |
commit | 85728b93ec89ec80e4dfc2aa36a490ec5dda2452 (patch) | |
tree | 7911d9a91edf96bde017aef211c6a722072c38a7 /sys/src/libjson | |
parent | 834b7f36cf4da1f4c08d27f1db9e0eed8717c542 (diff) |
libjson: correctly escape strings in JSONfmt()
Diffstat (limited to 'sys/src/libjson')
-rw-r--r-- | sys/src/libjson/printjson.c | 29 |
1 files changed, 28 insertions, 1 deletions
diff --git a/sys/src/libjson/printjson.c b/sys/src/libjson/printjson.c index aa6d52485..2c32926fa 100644 --- a/sys/src/libjson/printjson.c +++ b/sys/src/libjson/printjson.c @@ -7,6 +7,33 @@ static int printarray(Fmt*, JSON*, int); static int printobject(Fmt*, JSON*, int); static int +printstring(Fmt *f, char *s) +{ + Rune r; + int n; + + n = fmtstrcpy(f, "\""); + while(*s){ + s += chartorune(&r, s); + switch(r){ + case '\\': n += fmtstrcpy(f, "\\\\"); break; + case '\f': n += fmtstrcpy(f, "\\f"); break; + case '\b': n += fmtstrcpy(f, "\\b"); break; + case '\n': n += fmtstrcpy(f, "\\n"); break; + case '\r': n += fmtstrcpy(f, "\\r"); break; + case '\"': n += fmtstrcpy(f, "\\\""); break; + default: + if(r < 0x20) + n += fmtprint(f, "\\u%04x", r); + else + n += fmtrune(f, r); + } + } + n += fmtstrcpy(f, "\""); + return n; +} + +static int printarray(Fmt *f, JSON *j, int indent) { JSONEl *jl; @@ -65,7 +92,7 @@ printjson(Fmt *f, JSON *j, int indent) return fmtprint(f, "%f", j->n); break; case JSONString: - return fmtprint(f, "\"%s\"", j->s); + return printstring(f, j->s); break; case JSONArray: return printarray(f, j, indent+1); |