]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libjson/printjson.c
upas/Mail: avoid showing empty To: and CC: lines in compose windows
[plan9front.git] / sys / src / libjson / printjson.c
1 #include <u.h>
2 #include <libc.h>
3 #include <json.h>
4
5 static int printjson(Fmt*, JSON*, int);
6 static int printarray(Fmt*, JSON*, int);
7 static int printobject(Fmt*, JSON*, int);
8
9 static int
10 printarray(Fmt *f, JSON *j, int indent)
11 {
12         JSONEl *jl;
13         int i, r;
14
15         if(j->first == nil){
16                 return fmtprint(f, "[]");
17         }
18         r = fmtprint(f, "[\n");
19         for(jl = j->first; jl != nil; jl = jl->next){
20                 for(i = 0; i < indent; i++)
21                         r += fmtprint(f, "\t");
22                 r += printjson(f, jl->val, indent);
23                 r += fmtprint(f, "%s\n", jl->next != nil ? "," : "");
24         }
25         for(i = 0; i < indent-1; i++)
26                 r += fmtprint(f, "\t");
27         r += fmtprint(f, "]");
28         return r;
29 }
30
31 static int
32 printobject(Fmt *f, JSON *j, int indent)
33 {
34         JSONEl *jl;
35         int i, r;
36
37         if(j->first == nil){
38                 return fmtprint(f, "{}");
39         }
40         r = fmtprint(f, "{\n");
41         for(jl = j->first; jl != nil; jl = jl->next){
42                 for(i = 0; i < indent; i++)
43                         fmtprint(f, "\t");
44                 r += fmtprint(f, "\"%s\": ", jl->name);
45                 r += printjson(f, jl->val, indent);
46                 r += fmtprint(f, "%s\n", jl->next != nil ? "," : "");
47         }
48         for(i = 0; i < indent-1; i++)
49                 r += fmtprint(f, "\t");
50         r += fmtprint(f, "}");
51         return r;
52 }
53
54 static int
55 printjson(Fmt *f, JSON *j, int indent)
56 {
57         switch(j->t){
58         case JSONNull:
59                 return fmtprint(f, "null");
60                 break;
61         case JSONBool:
62                 return fmtprint(f, "%s", j->n ? "true" : "false");
63                 break;
64         case JSONNumber:
65                 return fmtprint(f, "%f", j->n);
66                 break;
67         case JSONString:
68                 return fmtprint(f, "\"%s\"", j->s);
69                 break;
70         case JSONArray:
71                 return printarray(f, j, indent+1);
72                 break;
73         case JSONObject:
74                 return printobject(f, j, indent+1);
75                 break;
76         }
77         return 0;
78 }
79
80 int
81 JSONfmt(Fmt *f)
82 {
83         JSON *j;
84
85         j = va_arg(f->args, JSON*);
86         return printjson(f, j, 0);
87 }
88
89 void
90 JSONfmtinstall(void)
91 {
92         fmtinstall('J', JSONfmt);
93 }