]> gitweb.ps.run Git - iftint/blobdiff - main2.c
new parsing pattern
[iftint] / main2.c
diff --git a/main2.c b/main2.c
index 80f6a171febeda78e83f076dd945ec8fcce965af..db8e7cb927686a2694c824d4ae3985fd36b61b3c 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
 // 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++)
 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);
         while (ptr != NULL) {
             Indent(indent);
             JSONNodePrint(ptr, currNode);
+            printf(": ");
+            JSONNodePrint(ptr->firstChild, currNode);
+            if (ptr->next != NULL)
+                printf(",");
             ptr = ptr->next;
             ptr = ptr->next;
-
-            if (ptr != NULL) {
-                printf(": ");
-                JSONNodePrint(ptr, currNode);
-                if (ptr->next != NULL)
-                    printf(",");
-                ptr = ptr->next;
-            }
             printf("\n");
         }
         indent--;
             printf("\n");
         }
         indent--;
@@ -313,58 +324,82 @@ GetNode() {
     while (true) {
         c = GetChar();
 
     while (true) {
         c = GetChar();
 
-        if (c == 3)
+        if (c == KEY_CTRL_C)
             break;
 
             break;
 
-        if (isNewline(c)) {
-            if (node == NULL || node->parent == NULL)
-                break;
-
-            editingNode = false;
-            g_CurrNode = node = node->parent;
-            
-            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;
-            }
-            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 (editingNode) {
             if (node->data == (size_t)NULL) {
                 node->data = (size_t)NEWARR(char, 16);
                 strLen = 0;
             }
             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 {
+                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 == 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 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 (strLen < 16 - 1) {
-                str[strLen] = c;
-                str[strLen+1] = '\0';
-                strLen++;
+            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;
             }
         }
     }
             }
         }
     }