]> gitweb.ps.run Git - iftint/blobdiff - main2.c
notes.md, changes in GetNode()
[iftint] / main2.c
diff --git a/main2.c b/main2.c
index 3dcbf8448b9ac57a6760cf51b6fc67875e946c74..aeb0c5586d7daa90902f8d1ce203bd3c47c6459a 100644 (file)
--- a/main2.c
+++ b/main2.c
@@ -319,15 +319,6 @@ 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) {
@@ -336,69 +327,101 @@ GetNode() {
         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 || 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);
+            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;
+                }
+            }
+            else {
+                if (node->parent != NULL)
+                    node = node->parent;
+            }
+
+            g_CurrNode = node;
             
             continue;
         }
 
-        if (JSONNodeEditable(node) && editingNode) {
-            if (node->data == (size_t)NULL) {
-                node->data = (size_t)NEWARR(char, 16);
-                strLen = 0;
-            }
-            char * str = (char *)node->data;
+        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--;
+                if (isBackspace(c)) {
+                    str[strLen-1] = '\0';
+                    strLen--;
+                }
+                else if (strLen < 16 - 1) {
+                    str[strLen] = c;
+                    str[strLen+1] = '\0';
+                    strLen++;
+                }
             }
-            else if (strLen < 16 - 1) {
-                str[strLen] = c;
-                str[strLen+1] = '\0';
-                strLen++;
+            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)); }
+                }
+                g_CurrNode = node;
             }
         }
         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); editingNode = true; }
+                else if (c == 'a') { node = JSONNodeNew(JSONNodeKind_Arr); editingNode = true; }
+                g_DrawNode = g_CurrNode = result = node;
             }
+            // else if (node->kind == JSONNodeKind_Str && node->parent != NULL && node->parent->kind == JSONNodeKind_Obj) {
+                
+            // }
             else {
-                g_DrawNode = result = node;
+                /**/ 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; if (JSONNodeEditable(node) && (void *)node->data != NULL) strLen = strlen((char *)node->data); }
+                else if (isBackspace(c)) { g_CurrNode = node = JSONNodeRemove(node); }
+
+                g_CurrNode = node;
             }
-
-            g_CurrNode = node;
         }
     }