From a53ae2782a6e8b1996c1d5dea4190eb11d06d056 Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 22 Dec 2015 18:12:56 +0100 Subject: libjson: added printing support (thanks spew) --- sys/src/libjson/mkfile | 3 +- sys/src/libjson/printjson.c | 93 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 sys/src/libjson/printjson.c (limited to 'sys/src/libjson') diff --git a/sys/src/libjson/mkfile b/sys/src/libjson/mkfile index 3b61d9c89..016c2c021 100644 --- a/sys/src/libjson/mkfile +++ b/sys/src/libjson/mkfile @@ -2,7 +2,8 @@ LIB=/$objtype/lib/libjson.a OFILES=\ - json.$O + json.$O\ + printjson.$O HFILES=\ /sys/include/json.h diff --git a/sys/src/libjson/printjson.c b/sys/src/libjson/printjson.c new file mode 100644 index 000000000..aa6d52485 --- /dev/null +++ b/sys/src/libjson/printjson.c @@ -0,0 +1,93 @@ +#include +#include +#include + +static int printjson(Fmt*, JSON*, int); +static int printarray(Fmt*, JSON*, int); +static int printobject(Fmt*, JSON*, int); + +static int +printarray(Fmt *f, JSON *j, int indent) +{ + JSONEl *jl; + int i, r; + + if(j->first == nil){ + return fmtprint(f, "[]"); + } + r = fmtprint(f, "[\n"); + for(jl = j->first; jl != nil; jl = jl->next){ + for(i = 0; i < indent; i++) + r += fmtprint(f, "\t"); + r += printjson(f, jl->val, indent); + r += fmtprint(f, "%s\n", jl->next != nil ? "," : ""); + } + for(i = 0; i < indent-1; i++) + r += fmtprint(f, "\t"); + r += fmtprint(f, "]"); + return r; +} + +static int +printobject(Fmt *f, JSON *j, int indent) +{ + JSONEl *jl; + int i, r; + + if(j->first == nil){ + return fmtprint(f, "{}"); + } + r = fmtprint(f, "{\n"); + for(jl = j->first; jl != nil; jl = jl->next){ + for(i = 0; i < indent; i++) + fmtprint(f, "\t"); + r += fmtprint(f, "\"%s\": ", jl->name); + r += printjson(f, jl->val, indent); + r += fmtprint(f, "%s\n", jl->next != nil ? "," : ""); + } + for(i = 0; i < indent-1; i++) + r += fmtprint(f, "\t"); + r += fmtprint(f, "}"); + return r; +} + +static int +printjson(Fmt *f, JSON *j, int indent) +{ + switch(j->t){ + case JSONNull: + return fmtprint(f, "null"); + break; + case JSONBool: + return fmtprint(f, "%s", j->n ? "true" : "false"); + break; + case JSONNumber: + return fmtprint(f, "%f", j->n); + break; + case JSONString: + return fmtprint(f, "\"%s\"", j->s); + break; + case JSONArray: + return printarray(f, j, indent+1); + break; + case JSONObject: + return printobject(f, j, indent+1); + break; + } + return 0; +} + +int +JSONfmt(Fmt *f) +{ + JSON *j; + + j = va_arg(f->args, JSON*); + return printjson(f, j, 0); +} + +void +JSONfmtinstall(void) +{ + fmtinstall('J', JSONfmt); +} -- cgit v1.2.3