From: Patrick Date: Thu, 10 Aug 2023 22:13:33 +0000 (+0200) Subject: new parsing pattern X-Git-Url: https://gitweb.ps.run/iftint/commitdiff_plain/015ebcd11070a32ca030630abf8b663a95120c8a?ds=sidebyside new parsing pattern --- diff --git a/main2.c b/main2.c index b2376c2..db8e7cb 100644 --- a/main2.c +++ b/main2.c @@ -319,14 +319,7 @@ GetNode() { int c; int strLen = 0; - typedef enum { - InputState_Initial, - InputState_Primitive, - InputState_Object, - InputState_KeyValue, - InputState_Array, - } InputState; - InputState inputState; + bool editingNode = false; while (true) { c = GetChar(); @@ -334,69 +327,80 @@ GetNode() { if (c == KEY_CTRL_C) break; - if (isNewline(c)) { - if (node == NULL || node->parent == NULL) - break; - - if (node->parent->kind == JSONNodeKind_Obj) // editing obj key - g_CurrNode = node = node->firstChild; - else if (node->parent->kind == JSONNodeKind_Str) // editing obj value - g_CurrNode = node = node->parent->parent; - else - g_CurrNode = node = node->parent; - - editingNode = JSONNodeEditable(node); - - continue; - } - - if (JSONNodeEditable(node) && editingNode) { + if (editingNode) { 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--; + if (isNewline(c)) { + editingNode = false; } - else if (strLen < 16 - 1) { - str[strLen] = c; - str[strLen+1] = '\0'; - strLen++; + else { + 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++; + } } } else { - JSONNode * old = node; - - /**/ 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); } - else if (c == 'a') { node = JSONNodeNew(JSONNodeKind_Arr); } - else if (c == 'h') { if (node->prev != NULL) g_CurrNode = node = node->prev; continue; } - else if (c == 'l') { if (node->next != NULL) g_CurrNode = node = node->next; continue; } - else if (c == 'k') { if (node->parent != NULL) g_CurrNode = node = node->parent; continue; } - else if (c == 'j') { if (node->firstChild != NULL) g_CurrNode = node = node->firstChild; continue; } - else if (c == ' ') { if (JSONNodeEditable(node)) editingNode = true; continue; } - else if (isBackspace(c) && node != NULL) { g_CurrNode = node = JSONNodeRemove(node); continue; } - else { continue; } - - if (old != NULL) { - // new node was added to an object - if (old->kind == JSONNodeKind_Obj) { - JSONNode * keyNode = JSONNodeNew(JSONNodeKind_Str); - JSONNodePush(keyNode, node); - node = keyNode; - editingNode = true; - } - JSONNodePush(old, node); + 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); } + else if (c == 'a') { node = JSONNodeNew(JSONNodeKind_Arr); } + g_DrawNode = g_CurrNode = result = node; } - else { - g_DrawNode = result = node; + else if (node->kind == JSONNodeKind_Int) { + /**/ 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 == ' ') { if (JSONNodeEditable(node)) editingNode = true; } + else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); } + } + else if (node->kind == JSONNodeKind_Str) { + /**/ 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 == ' ') { if (JSONNodeEditable(node)) editingNode = true; } + else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); } + } + else if (node->kind == JSONNodeKind_Obj) { + /**/ if (c == 'i') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Int))->parent); editingNode = true; } + else if (c == 's') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Str))->parent); editingNode = true; } + else if (c == 'o') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Obj))->parent); editingNode = true; } + else if (c == 'a') { node = JSONNodePush(node, JSONNodePush(JSONNodeNew(JSONNodeKind_Str), JSONNodeNew(JSONNodeKind_Arr))->parent); 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 (isBackspace(c)) { node = JSONNodeRemove(node); } + + g_CurrNode = node; + } + else if (node->kind == JSONNodeKind_Arr) { + /**/ if (c == 'i') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Int)); editingNode = true; } + else if (c == 's') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Str)); editingNode = true; } + else if (c == 'o') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Obj)); } + else if (c == 'a') { node = JSONNodePush(node, JSONNodeNew(JSONNodeKind_Arr)); } + + 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 (isBackspace(c)) { node = JSONNodeRemove(node); } + + g_CurrNode = node; } - - g_CurrNode = node; } }