ref: d26dc323c121e512b3c9b71c6c6bb98ffa27348a
author: phil9 <telephil9@gmail.com>
date: Wed Sep 29 03:17:06 EDT 2021
initial import
--- /dev/null
+++ b/gj.c
@@ -1,0 +1,97 @@
+#include <u.h>
+#include <libc.h>
+#include <json.h>
+
+char*
+readfile(int fd)
+{+ char *b;
+ int s, r, n;
+
+ n = 0;
+ s = 4096;
+ b = malloc(s);
+ if(b==nil)
+ sysfatal("malloc: %r");+ for(;;){+ r = read(fd, b+n, s-n);
+ if(r<0)
+ sysfatal("read: %r");+ if(r==0)
+ break;
+ n += r;
+ if(n==s){+ s *= 1.5;
+ b = realloc(b, s);
+ if(b==nil)
+ sysfatal("realloc: %r");+ }
+ }
+ b[n] = 0;
+ return b;
+}
+
+void
+walk(char *path, JSON *json)
+{+ int i;
+ char *s;
+ JSONEl *e;
+
+ print("%s = ", path);+ switch(json->t){+ case JSONNull:
+ print("null;\n");+ break;
+ case JSONBool:
+ print("%s;\n", json->n ? "true": "false");+ break;
+ case JSONNumber:
+ print("%f;\n", json->n);+ break;
+ case JSONString:
+ print("\"%s\";\n", json->s);+ break;
+ case JSONArray:
+ print("[];\n");+ for(i=0, e=json->first; e!=nil; i++, e=e->next){+ s = smprint("%s[%d]", path, i);+ walk(s, e->val);
+ free(s);
+ }
+ break;
+ case JSONObject:
+ print("{};\n");+ for(e=json->first; e!=nil; e=e->next){+ s = smprint("%s.%s", path, e->name);+ walk(s, e->val);
+ free(s);
+ }
+ break;
+ }
+}
+
+void
+main(int argc, char *argv[])
+{+ int fd;
+ char *s;
+ JSON *json;
+
+ fd = 0;
+ ARGBEGIN{+ }ARGEND;
+ if(argc==1){+ fd = open(*argv, OREAD);
+ if(fd<=0)
+ sysfatal("open: %r");+ }
+ s = readfile(fd);
+ close(fd);
+ json = jsonparse(s);
+ if(json==nil)
+ sysfatal("jsonparse: %r");+ walk("json", json);+ jsonfree(json);
+ exits(nil);
+}
--- /dev/null
+++ b/mkfile
@@ -1,0 +1,8 @@
+</$objtype/mkfile
+
+BIN=/$objtype/bin
+CFLAGS=-FTVw
+TARG=gj
+OFILES=gj.$O
+
+</sys/src/cmd/mkone
--
⑨