8 #define NEW(TYPE) ((TYPE *)calloc(1, sizeof(TYPE)))
9 #define NEWARR(TYPE, NUM) ((TYPE *)calloc(NUM, sizeof(TYPE)))
21 /* reads from keypress, doesn't echo */
24 struct termios oldattr, newattr;
26 tcgetattr( STDIN_FILENO, &oldattr );
28 newattr.c_lflag &= ~( ICANON | ECHO );
29 tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
31 tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
35 /* reads from keypress, echoes */
38 struct termios oldattr, newattr;
40 tcgetattr( STDIN_FILENO, &oldattr );
42 newattr.c_lflag &= ~( ICANON );
43 tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
45 tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
52 struct termios oldattr, newattr;
53 tcgetattr( STDIN_FILENO, &oldattr );
55 newattr.c_lflag &= ~( ICANON | ECHO );
56 tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
58 tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
75 void vt100Escape(const char * str, ...) {
79 printf("%c", ASCII_ESC);
83 void vt100ClearScreen() { vt100Escape("[2J"); }
84 void vt100CursorHome() { vt100Escape("[H"); }
85 void vt100CursorPos(int v, int h) { vt100Escape("[%d;%dH", v, h); }
86 void vt100SaveCursor() { vt100Escape("7"); }
87 void vt100RestoreCursor() { vt100Escape("8"); }
99 typedef struct JSONNode {
102 struct JSONNode * parent;
103 struct JSONNode * children;
104 struct JSONNode * next;
108 JSONNodeNew(JSONNodeKind kind, size_t data) {
109 JSONNode * result = NEW(JSONNode);
116 JSONNodeNewStr(const char * str) {
117 return JSONNodeNew(JSONNodeKind_Str, (size_t)str);
122 return JSONNodeNew(JSONNodeKind_Obj, (size_t)NULL);
127 return JSONNodeNew(JSONNodeKind_Nul, (size_t)NULL);
131 JSONNodeAppend(JSONNode * this, JSONNode * that) {
132 if (this->children == NULL) {
133 this->children = that;
136 JSONNode * lastNode = this->children;
137 while (lastNode->next != NULL)
138 lastNode = lastNode->next;
139 lastNode->next = that;
149 for (int i = 0; i < indent; i++)
154 JSONNodePrint(JSONNode * node) {
159 if (node->parent == NULL)
162 switch (node->kind) {
163 case JSONNodeKind_Nul: {
167 case JSONNodeKind_Str: {
168 char * str = (char *)node->data;
169 printf("\"%s\"", str == NULL ? "" : str);
172 case JSONNodeKind_Obj: {
174 JSONNode * ptr = node->children;
176 while (ptr != NULL) {
177 char * key = (char *)ptr->data;
178 JSONNode * value = ptr->next;
180 printf("\"%s\": ", key);
181 JSONNodePrint(value);
182 if (ptr->next != NULL)
183 ptr = ptr->next->next;
186 printf("%s\n", (ptr == NULL ? "" : ","));
202 Draw(JSONNode * node, const char * str) {
206 printf("> %s\n\n", str);
211 vt100CursorPos(0, strlen(str) + 3);
216 char * str = NEWARR(char, 16);
219 while ((c = getch()), (c != '\r') && (c != '\n')) {
220 if (strLen < 16 - 1) {
230 GetNode(JSONNode * parent) {
233 JSONNode * result = JSONNodeNewNul();
238 if (parent != NULL && result != NULL)
239 JSONNodeAppend(parent, result);
243 result->kind = JSONNodeKind_Str;
245 result->data = (size_t)GetStr();
250 result->kind = JSONNodeKind_Obj;
252 while ((c = peekch()), (c != '\r') && (c != '\n')) {
255 JSONNodeAppend(result, JSONNodeNewStr(GetStr()));
258 JSONNodeAppend(result, GetNode(result));
270 JSONNode * n = JSONNodeNewObj();
271 JSONNode * k1 = JSONNodeNewStr("key 1");
272 JSONNode * v1 = JSONNodeNewObj();
273 JSONNode * k11 = JSONNodeNewStr("key 11");
274 JSONNode * v11 = JSONNodeNewStr("val 11");
275 JSONNode * k12 = JSONNodeNewStr("key 12");
276 JSONNode * v12 = JSONNodeNewStr("val 12");
277 JSONNode * k2 = JSONNodeNewStr("key 2");
278 JSONNode * v2 = JSONNodeNewStr("val 2");
280 JSONNodeAppend(n, k1);
281 JSONNodeAppend(n, v1);
282 JSONNodeAppend(n, k2);
283 JSONNodeAppend(n, v2);
285 JSONNodeAppend(v1, k11);
286 JSONNodeAppend(v1, v11);
287 JSONNodeAppend(v1, k12);
288 JSONNodeAppend(v1, v12);
296 JSONNode * n = GetNode(NULL);
297 //JSONNode * n = TestNode();