]> gitweb.ps.run Git - iftint/commitdiff
new parsing pattern
authorPatrick <patrick.schoenberger@posteo.de>
Thu, 10 Aug 2023 22:13:33 +0000 (00:13 +0200)
committerPatrick <patrick.schoenberger@posteo.de>
Thu, 10 Aug 2023 22:13:33 +0000 (00:13 +0200)
main2.c

diff --git a/main2.c b/main2.c
index b2376c28d9897582b778d90d048d9d4303b1a7ca..db8e7cb927686a2694c824d4ae3985fd36b61b3c 100644 (file)
--- 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;
         }
     }