X-Git-Url: https://gitweb.ps.run/iftint/blobdiff_plain/458e5019b068ff5673405b62bf7ac35fd60bc28a..refs/heads/StateParsing:/main2.c diff --git a/main2.c b/main2.c index aeb0c55..c8b9023 100644 --- a/main2.c +++ b/main2.c @@ -139,6 +139,7 @@ typedef enum { JSONNodeKind_Int, JSONNodeKind_Str, JSONNodeKind_Obj, + JSONNodeKind_Key, JSONNodeKind_Arr, JSONNodeKind_COUNT } JSONNodeKind; @@ -244,7 +245,6 @@ JSONNodePrint(JSONNode * node, JSONNode * currNode) { while (ptr != NULL) { Indent(indent); JSONNodePrint(ptr, currNode); - printf(": "); JSONNodePrint(ptr->firstChild, currNode); if (ptr->next != NULL) printf(","); @@ -256,6 +256,11 @@ JSONNodePrint(JSONNode * node, JSONNode * currNode) { printf("}"); break; } + case JSONNodeKind_Key: { + char * str = (char *)node->data; + printf("\"%s\": ", str == NULL ? "" : str); + break; + } case JSONNodeKind_Arr: { printf("[\n"); JSONNode * ptr = node->firstChild; @@ -312,102 +317,126 @@ typedef bool(*CharPredicateFunc)(char, int); bool predStr(char c, int i) { return c >= 'a' && c <= 'z'; } bool predInt(char c, int i) { return c >= '0' && c <= '9'; } +void +GetInput(JSONNode * node, char c) { + if (node->data == (size_t)NULL) { + node->data = (size_t)NEWARR(char, 16); + } + + char * str = (char *)node->data; + int strLen = strlen(str); + + if (isBackspace(c)) { + str[strLen-1] = '\0'; + } + else if (strLen < 16 - 1) { + str[strLen] = c; + str[strLen+1] = '\0'; + } +} + JSONNode * GetNode() { JSONNode * result = NULL; JSONNode * node = NULL; int c; - int strLen = 0; bool editingNode = false; while (true) { - c = GetChar(); + Draw(); + c = getch(); if (c == KEY_CTRL_C) break; - /* - - - editing - - primitive -> input - - obj/arr -> new node inside - - not editing - - hjkl -> movement - - isoa - - parent=obj -> new key/value node after - - parent=arr -> new node after - - else -> nothing - */ - - if (isNewline(c)) { + if (node == NULL) { + /**/ if (c == 'i') { node = JSONNodeNew(JSONNodeKind_Int); editingNode = true; } + else if (c == 's') { node = JSONNodeNew(JSONNodeKind_Str); editingNode = true; } + else if (c == 'o') { node = JSONNodeNew(JSONNodeKind_Obj); editingNode = true; } + else if (c == 'a') { node = JSONNodeNew(JSONNodeKind_Arr); editingNode = true; } + g_DrawNode = g_CurrNode = result = node; + } + else if (node->kind ==JSONNodeKind_Int) { if (editingNode) { - editingNode = false; - if (node->parent != NULL && node->parent->kind == JSONNodeKind_Obj && node->firstChild != NULL) { - node = node->firstChild; - editingNode = true; - } - else if (node->parent != NULL && node->parent->kind == JSONNodeKind_Str && node->parent->parent != NULL) { - node = node->parent->parent; - editingNode = true; - } + GetInput(node, c); } else { - if (node->parent != NULL) - node = node->parent; + /**/ if (c == 'i' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Int)); editingNode = true; } + else if (c == 's' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Str)); editingNode = true; } + else if (c == 'o' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Obj)); editingNode = true; } + else if (c == 'a' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Arr)); editingNode = true; } + else if (c == 'h') { if (node->prev != NULL) g_CurrNode = node = node->prev; } + else if (c == 'l') { if (node->next != NULL) g_CurrNode = node = node->next; } + else if (c == 'k') { if (node->parent != NULL) g_CurrNode = node = node->parent; } + else if (c == 'j') { if (node->firstChild != NULL) g_CurrNode = node = node->firstChild; } + else if (c == ' ') { editingNode = true; } + else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); } + + g_CurrNode = node; } + } + else if (node->kind ==JSONNodeKind_Str) { + if (editingNode) { + GetInput(node, c); + } + else { + /**/ if (c == 'i' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Int)); editingNode = true; } + else if (c == 's' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Str)); editingNode = true; } + else if (c == 'o' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Obj)); editingNode = true; } + else if (c == 'a' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Arr)); editingNode = true; } + else if (c == 'h') { if (node->prev != NULL) g_CurrNode = node = node->prev; } + else if (c == 'l') { if (node->next != NULL) g_CurrNode = node = node->next; } + else if (c == 'k') { if (node->parent != NULL) g_CurrNode = node = node->parent; } + else if (c == 'j') { if (node->firstChild != NULL) g_CurrNode = node = node->firstChild; } + else if (c == ' ') { editingNode = true; } + else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); } - g_CurrNode = node; - - continue; + g_CurrNode = node; + } } + else if (node->kind ==JSONNodeKind_Obj) { + if (editingNode) { + GetInput(node, c); + } + else { + /**/ if (c == 'i' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Int)); editingNode = true; } + else if (c == 's' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Str)); editingNode = true; } + else if (c == 'o' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Obj)); editingNode = true; } + else if (c == 'a' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Arr)); editingNode = true; } + else if (c == 'h') { if (node->prev != NULL) g_CurrNode = node = node->prev; } + else if (c == 'l') { if (node->next != NULL) g_CurrNode = node = node->next; } + else if (c == 'k') { if (node->parent != NULL) g_CurrNode = node = node->parent; } + else if (c == 'j') { if (node->firstChild != NULL) g_CurrNode = node = node->firstChild; } + else if (c == ' ') { editingNode = true; } + else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); } - if (editingNode) { - if (JSONNodeEditable(node)) { - if (node->data == (size_t)NULL) { - node->data = (size_t)NEWARR(char, 16); - strLen = 0; - } - - char * str = (char *)node->data; - - if (isBackspace(c)) { - str[strLen-1] = '\0'; - strLen--; - } - else if (strLen < 16 - 1) { - str[strLen] = c; - str[strLen+1] = '\0'; - strLen++; - } + g_CurrNode = node; + } + } + else if (node->kind ==JSONNodeKind_Key) { + if (editingNode) { + GetInput(node, c); } else { - if (node->kind == JSONNodeKind_Obj) { - /**/ if (c == 'i') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Int))->parent); } - else if (c == 's') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Str))->parent); } - else if (c == 'o') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Obj))->parent); } - else if (c == 'a') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Arr))->parent); } - } - else if (node->kind == JSONNodeKind_Arr) { - /**/ if (c == 'i') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Int)); } - else if (c == 's') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Str)); } - else if (c == 'o') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Obj)); } - else if (c == 'a') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Arr)); } - } + /**/ if (c == 'i' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Int)); editingNode = true; } + else if (c == 's' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Str)); editingNode = true; } + else if (c == 'o' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Obj)); editingNode = true; } + else if (c == 'a' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Arr)); editingNode = true; } + else if (c == 'h') { if (node->prev != NULL) g_CurrNode = node = node->prev; } + else if (c == 'l') { if (node->next != NULL) g_CurrNode = node = node->next; } + else if (c == 'k') { if (node->parent != NULL) g_CurrNode = node = node->parent; } + else if (c == 'j') { if (node->firstChild != NULL) g_CurrNode = node = node->firstChild; } + else if (c == ' ') { editingNode = true; } + else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); } + g_CurrNode = node; } } - else { - if (node == NULL) { - /**/ if (c == 'i') { node = JSONNodeNew(JSONNodeKind_Int); editingNode = true; } - else if (c == 's') { node = JSONNodeNew(JSONNodeKind_Str); editingNode = true; } - else if (c == 'o') { node = JSONNodeNew(JSONNodeKind_Obj); editingNode = true; } - else if (c == 'a') { node = JSONNodeNew(JSONNodeKind_Arr); editingNode = true; } - g_DrawNode = g_CurrNode = result = node; + else if (node->kind ==JSONNodeKind_Arr) { + if (editingNode) { + GetInput(node, c); } - // else if (node->kind == JSONNodeKind_Str && node->parent != NULL && node->parent->kind == JSONNodeKind_Obj) { - - // } else { /**/ if (c == 'i' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Int)); editingNode = true; } else if (c == 's' && node->parent != NULL) { node = JSONNodePush(node->parent, JSONNodeNew(JSONNodeKind_Str)); editingNode = true; } @@ -417,7 +446,7 @@ GetNode() { else if (c == 'l') { if (node->next != NULL) g_CurrNode = node = node->next; } else if (c == 'k') { if (node->parent != NULL) g_CurrNode = node = node->parent; } else if (c == 'j') { if (node->firstChild != NULL) g_CurrNode = node = node->firstChild; } - else if (c == ' ') { editingNode = true; if (JSONNodeEditable(node) && (void *)node->data != NULL) strLen = strlen((char *)node->data); } + else if (c == ' ') { editingNode = true; } else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); } g_CurrNode = node;