summaryrefslogtreecommitdiff
path: root/sys/src/libjson
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-12-22 18:12:56 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2015-12-22 18:12:56 +0100
commita53ae2782a6e8b1996c1d5dea4190eb11d06d056 (patch)
tree4d394ca68c430addd1310d38fdd145dc9865d428 /sys/src/libjson
parentf6e8b115d49e8aec463e3a495d53ee11031a4db6 (diff)
libjson: added printing support (thanks spew)
Diffstat (limited to 'sys/src/libjson')
-rw-r--r--sys/src/libjson/mkfile3
-rw-r--r--sys/src/libjson/printjson.c93
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);
+}