+
+static void json_print(JSONValue *value, char *name, int indent) {
+ if(name) {
+ printf("%*s%s: ", indent*4, "", name);
+ } else {
+ printf("%*s", indent*4, "");
+ }
+
+
+ switch(value->type) {
+ case JSON_OBJECT: {
+ printf("{\n");
+
+ for(int i=0;i<value->value.object.size;i++) {
+ JSONObjValue val = value->value.object.values[i];
+ json_print(val.value, val.name, indent+1);
+ if(i+1 < value->value.object.size) {
+ printf(",\n");
+ } else {
+ printf("\n");
+ }
+ }
+
+ printf("%*s}", indent*4, "");
+ break;
+ }
+ case JSON_ARRAY: {
+ printf("[\n");
+
+ for(int i=0;i<value->value.object.size;i++) {
+ JSONValue *v = value->value.array.array[i];
+ json_print(v, NULL, indent+1);
+ if(i+1 < value->value.array.size) {
+ printf(",\n");
+ } else {
+ printf("\n");
+ }
+ }
+
+ printf("%*s]", indent*4, "");
+ break;
+ }
+ case JSON_STRING: {
+ printf("\"%s\"", value->value.string.string);
+ break;
+ }
+ case JSON_INTEGER: {
+ printf("%i", (int)value->value.integer.value);
+ break;
+ }
+ case JSON_NUMBER: {
+ printf("%f", value->value.number.value);
+ break;
+ }
+ case JSON_LITERAL: {
+ printf("%s\n", "literal\n");
+ break;
+ }
+ }
+
+ if(indent == 0) {
+ putchar('\n');
+ }
+}
+