diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-12-22 18:12:56 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-12-22 18:12:56 +0100 |
commit | a53ae2782a6e8b1996c1d5dea4190eb11d06d056 (patch) | |
tree | 4d394ca68c430addd1310d38fdd145dc9865d428 /sys/src/libjson | |
parent | f6e8b115d49e8aec463e3a495d53ee11031a4db6 (diff) |
libjson: added printing support (thanks spew)
Diffstat (limited to 'sys/src/libjson')
-rw-r--r-- | sys/src/libjson/mkfile | 3 | ||||
-rw-r--r-- | sys/src/libjson/printjson.c | 93 |
2 files changed, 95 insertions, 1 deletions
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 <u.h> +#include <libc.h> +#include <json.h> + +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); +} |