summaryrefslogtreecommitdiff
path: root/sys/src/libjson/printjson.c
blob: aa6d52485ec614ab21481815dd066b201b3b06fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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);
}