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