summaryrefslogtreecommitdiff
path: root/sys/src/libjson
diff options
context:
space:
mode:
authorOri Bernstein <ori@eigenstate.org>2022-12-18 01:43:51 +0000
committerOri Bernstein <ori@eigenstate.org>2022-12-18 01:43:51 +0000
commit85728b93ec89ec80e4dfc2aa36a490ec5dda2452 (patch)
tree7911d9a91edf96bde017aef211c6a722072c38a7 /sys/src/libjson
parent834b7f36cf4da1f4c08d27f1db9e0eed8717c542 (diff)
libjson: correctly escape strings in JSONfmt()
Diffstat (limited to 'sys/src/libjson')
-rw-r--r--sys/src/libjson/printjson.c29
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);