8 - whitelist input on GetStr/GetInt
13 #define NEW(TYPE) ((TYPE *)calloc(1, sizeof(TYPE)))
14 #define NEWARR(TYPE, NUM) ((TYPE *)calloc(NUM, sizeof(TYPE)))
26 /* reads from keypress, doesn't echo */
29 struct termios oldattr, newattr;
31 tcgetattr( STDIN_FILENO, &oldattr );
33 newattr.c_lflag &= ~( ICANON | ECHO );
34 tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
36 tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
40 /* reads from keypress, echoes */
43 struct termios oldattr, newattr;
45 tcgetattr( STDIN_FILENO, &oldattr );
47 newattr.c_lflag &= ~( ICANON );
48 tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
50 tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
57 struct termios oldattr, newattr;
58 tcgetattr( STDIN_FILENO, &oldattr );
60 newattr.c_lflag &= ~( ICANON | ECHO );
61 tcsetattr( STDIN_FILENO, TCSANOW, &newattr );
63 tcsetattr( STDIN_FILENO, TCSANOW, &oldattr );
80 void vt100Escape(const char * str, ...) {
84 printf("%c", ASCII_ESC);
88 void vt100ClearScreen() { vt100Escape("[2J"); }
89 void vt100CursorHome() { vt100Escape("[H"); }
90 void vt100CursorPos(int v, int h) { vt100Escape("[%d;%dH", v, h); }
91 void vt100SaveCursor() { vt100Escape("7"); }
92 void vt100RestoreCursor() { vt100Escape("8"); }
93 void vt100GetScreenSize(int * v, int * h) {
95 vt100CursorPos(1000000, 1000000);
99 while ((c = getch()) != ';')
100 *v = (10*(*v)+(c-'0'));
101 while ((c = getch()) != 'R')
102 *h = (10*(*h)+(c-'0'));
117 typedef struct JSONNode {
120 struct JSONNode * parent;
121 struct JSONNode * children;
122 struct JSONNode * next;
126 JSONNodeNew(JSONNodeKind kind, size_t data) {
127 JSONNode * result = NEW(JSONNode);
135 return JSONNodeNew(JSONNodeKind_Nul, (size_t)NULL);
139 JSONNodeNewInt(int i) {
140 return JSONNodeNew(JSONNodeKind_Int, (size_t)i);
144 JSONNodeNewStr(const char * str) {
145 return JSONNodeNew(JSONNodeKind_Str, (size_t)str);
150 return JSONNodeNew(JSONNodeKind_Obj, (size_t)NULL);
155 return JSONNodeNew(JSONNodeKind_Arr, (size_t)NULL);
159 JSONNodePush(JSONNode * this, JSONNode * that) {
160 if (this->children == NULL) {
161 this->children = that;
164 JSONNode * lastNode = this->children;
165 while (lastNode->next != NULL)
166 lastNode = lastNode->next;
167 lastNode->next = that;
176 JSONNodePop(JSONNode * this) {
178 JSONNode * ptr = this->children;
180 if (ptr == NULL) { // no children
181 JSONNodePop(this->parent);
183 else if (ptr->next == NULL) { // one child
184 this->children = NULL;
187 else { // more than one child
188 while (ptr->next->next != NULL)
197 for (int i = 0; i < indent; i++)
202 JSONNodePrint(JSONNode * node) {
207 if (node->parent == NULL)
210 switch (node->kind) {
211 case JSONNodeKind_Nul: {
215 case JSONNodeKind_Int: {
216 int i = (int)node->data;
220 case JSONNodeKind_Str: {
221 char * str = (char *)node->data;
222 printf("\"%s\"", str == NULL ? "" : str);
225 case JSONNodeKind_Obj: {
227 JSONNode * ptr = node->children;
229 while (ptr != NULL) {
230 char * key = (char *)ptr->data;
231 JSONNode * value = ptr->next;
233 printf("\"%s\": ", key);
234 JSONNodePrint(value);
235 if (ptr->next != NULL)
236 ptr = ptr->next->next;
239 printf("%s\n", (ptr == NULL ? "" : ","));
246 case JSONNodeKind_Arr: {
248 JSONNode * ptr = node->children;
249 while (ptr != NULL) {
250 JSONNode * value = ptr;
251 JSONNodePrint(value);
253 printf("%s", (ptr == NULL ? "" : ", "));
264 JSONNode * g_DrawNode = NULL;
265 const char * g_DrawStr = "";
272 if (g_DrawNode != NULL)
273 JSONNodePrint(g_DrawNode);
276 vt100GetScreenSize(&v, &h);
277 vt100CursorPos(v, 0);
278 printf("> %s", g_DrawStr);
280 vt100CursorPos(v, strlen(g_DrawStr) + 3);
299 static char intStr[16];
304 while ((c = GetChar()), (c != '\r') && (c != '\n')) {
305 if ((c == 8 || c == 127) && intStrLen > 0) {
307 intStr[intStrLen] = '\0';
310 else if (intStrLen < 16 - 1 && (c >= '0' && c <= '9')) {
311 intStr[intStrLen++] = c;
312 intStr[intStrLen] = '\0';
323 char * str = NEWARR(char, 16);
327 while ((c = GetChar()), (c != '\r') && (c != '\n')) {
328 if ((c == 8 || c == 127) && strLen > 0) {
332 else if (strLen < 16 - 1) {
342 GetNode(JSONNode * parent) {
345 JSONNode * result = JSONNodeNewNul();
350 if (parent != NULL && result != NULL)
351 JSONNodePush(parent, result);
355 result->kind = JSONNodeKind_Int;
356 result->data = (size_t)GetInt();
360 result->kind = JSONNodeKind_Str;
361 result->data = (size_t)GetStr();
365 result->kind = JSONNodeKind_Obj;
366 while ((c = PeekChar()), (c != '\r') && (c != '\n')) {
367 JSONNodePush(result, JSONNodeNewStr(GetStr()));
369 JSONNodePush(result, GetNode(result));
375 result->kind = JSONNodeKind_Arr;
376 while ((c = PeekChar()), (c != '\r') && (c != '\n')) {
377 JSONNodePush(result, GetNode(result));
385 result = GetNode(parent);
388 result->kind = JSONNodeKind_Int;
389 result->data = (size_t)GetChar();
402 JSONNode * n = GetNode(NULL);
403 //JSONNode * n = TestNode();