]> 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 80f6a171febeda78e83f076dd945ec8fcce965af..aeb0c5586d7daa90902f8d1ce203bd3c47c6459a 100644 (file)
--- a/main2.c
+++ b/main2.c
@@ -34,6 +34,13 @@ isBackspace(char c) {
 }
 
 
+// Key defines
+
+#define KEY_CTRL_C 3
+#define KEY_BACKSPACE1 8
+#define KEY_BACKSPACE2 127
+
+
 // getch
 
 #ifdef _WIN32
@@ -188,6 +195,14 @@ JSONNodeRemove(JSONNode * node) {
     }
 }
 
+bool
+JSONNodeEditable(JSONNode * node) {
+    if (node == NULL) return false;
+    else if (node->kind == JSONNodeKind_Int) return true;
+    else if (node->kind == JSONNodeKind_Str) return true;
+    return false;
+}
+
 void
 Indent(int indent) {
     for (int i = 0; i < indent; i++)
@@ -229,15 +244,11 @@ JSONNodePrint(JSONNode * node, JSONNode * currNode) {
         while (ptr != NULL) {
             Indent(indent);
             JSONNodePrint(ptr, currNode);
+            printf(": ");
+            JSONNodePrint(ptr->firstChild, currNode);
+            if (ptr->next != NULL)
+                printf(",");
             ptr = ptr->next;
-
-            if (ptr != NULL) {
-                printf(": ");
-                JSONNodePrint(ptr, currNode);
-                if (ptr->next != NULL)
-                    printf(",");
-                ptr = ptr->next;
-            }
             printf("\n");
         }
         indent--;
@@ -313,58 +324,103 @@ GetNode() {
     while (true) {
         c = GetChar();
 
-        if (c == 3)
+        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 (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;
+            }
 
-            editingNode = false;
-            g_CurrNode = node = node->parent;
+            g_CurrNode = node;
             
             continue;
         }
 
-        if (! editingNode) {
-            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 (isBackspace(c) && node != NULL) {
-                g_CurrNode = node = JSONNodeRemove(node);
-                continue;
+        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++;
+                }
+            }
+            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 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 { continue; }
-
-            g_CurrNode = node;
-
-            if (old != NULL)
-                JSONNodePush(old, node);
-            else
-                g_DrawNode = result = node;
         }
         else {
-            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 (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 (strLen < 16 - 1) {
-                str[strLen] = c;
-                str[strLen+1] = '\0';
-                strLen++;
+            // 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; }
+                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;
             }
         }
     }