Fixes to Libc, Doxygen Comments and VTerm layout
[tpg/acess2.git] / Usermode / Applications / CLIShell_src / main.c
index d6c40d6..836c6f5 100644 (file)
@@ -135,7 +135,9 @@ char *ReadCommandLine(int *Length)
        char    *ret;\r
         int    len, pos, space = 1023;\r
        char    ch;\r
-       // int  scrollbackPos = giLastCommand;\r
+       #if 1\r
+        int    scrollbackPos = giLastCommand;\r
+       #endif\r
         \r
        // Preset Variables\r
        ret = malloc( space+1 );\r
@@ -145,8 +147,13 @@ char *ReadCommandLine(int *Length)
        // Read In Command Line\r
        do {\r
                read(_stdin, 1, &ch);   // Read Character from stdin (read is a blocking call)\r
+               \r
+               if(ch == '\n')  break;\r
+               \r
+               switch(ch)\r
+               {\r
                // Control characters\r
-               if(ch == '\x1B') {\r
+               case '\x1B':\r
                        read(_stdin, 1, &ch);   // Read control character\r
                        switch(ch)\r
                        {\r
@@ -158,23 +165,32 @@ char *ReadCommandLine(int *Length)
                                {\r
                                #if 0\r
                                case 'A':       // Up\r
-                                       if( scrollbackPos > 0 ) break;\r
-                                       \r
-                                       free(ret);\r
-                                       ret = strdup( gasCommandHistory[--scrollbackPos] );\r
-                                       \r
-                                       len = strlen(ret);\r
-                                       while(pos--)    write(_stdout, 3, "\x1B[D");\r
-                                       while(pos++ < len)      write(_stdout, 3, "\x1B[C");\r
+                                       {\r
+                                                int    oldLen = len;\r
+                                               if( scrollbackPos > 0 ) break;\r
+                                               \r
+                                               free(ret);\r
+                                               ret = strdup( gasCommandHistory[--scrollbackPos] );\r
+                                               \r
+                                               len = strlen(ret);\r
+                                               while(pos--)    write(_stdout, 3, "\x1B[D");\r
+                                               write(_stdout, len, ret);       pos = len;\r
+                                               while(pos++ < oldLen)   write(_stdout, 1, " ");\r
+                                       }\r
                                        break;\r
                                case 'B':       // Down\r
-                                       if( scrollbackPos < giLastCommand-1 )   break;\r
-                                       free(ret);\r
-                                       ret = strdup( gasCommandHistory[++scrollbackPos] );\r
-                                       \r
-                                       len = strlen(ret);\r
-                                       while(pos--)    write(_stdout, 3, "\x1B[D");\r
-                                       while(pos++ < len)      write(_stdout, 3, "\x1B[C");\r
+                                       {\r
+                                                int    oldLen = len;\r
+                                               if( scrollbackPos < giLastCommand-1 )   break;\r
+                                               \r
+                                               free(ret);\r
+                                               ret = strdup( gasCommandHistory[++scrollbackPos] );\r
+                                               \r
+                                               len = strlen(ret);\r
+                                               while(pos--)    write(_stdout, 3, "\x1B[D");\r
+                                               write(_stdout, len, ret);       pos = len;\r
+                                               while(pos++ < oldLen)   write(_stdout, 1, " ");\r
+                                       }\r
                                        break;\r
                                #endif\r
                                case 'D':       // Left\r
@@ -183,49 +199,74 @@ char *ReadCommandLine(int *Length)
                                        write(_stdout, 3, "\x1B[D");\r
                                        break;\r
                                case 'C':       // Right\r
-                                       if(pos == len-1)        break;\r
+                                       if(pos == len)  break;\r
                                        pos++;\r
                                        write(_stdout, 3, "\x1B[C");\r
                                        break;\r
                                }\r
                        }\r
-                       continue;\r
-               }\r
+                       break;\r
+               \r
                // Backspace\r
-               if(ch == '\b') {\r
-                       if(len <= 0)            continue;       // Protect against underflows\r
+               case '\b':\r
+                       if(len <= 0)            break;  // Protect against underflows\r
+                       write(_stdout, 1, &ch);\r
                        if(pos == len) {        // Simple case of end of string\r
-                               len --; pos--;\r
-                       } else {\r
+                               len --;\r
+                               pos--;\r
+                       }\r
+                       else {\r
+                               char    buf[7] = "\x1B[000D";\r
+                               buf[2] += ((len-pos+1)/100) % 10;\r
+                               buf[3] += ((len-pos+1)/10) % 10;\r
+                               buf[4] += (len-pos+1) % 10;\r
+                               write(_stdout, len-pos, &ret[pos]);     // Move Text\r
+                               ch = ' ';       write(_stdout, 1, &ch); ch = '\b';      // Clear deleted character\r
+                               write(_stdout, 7, buf); // Update Cursor\r
+                               // Alter Buffer\r
                                memmove(&ret[pos-1], &ret[pos], len-pos);\r
                                pos --;\r
                                len --;\r
                        }\r
-                       write(_stdout, 1, &ch);\r
-                       continue;\r
-               }\r
+                       break;\r
+               \r
                // Tab\r
-               if(ch == '\t') {\r
+               case '\t':\r
                        //TODO: Implement Tab-Completion\r
                        //Currently just ignore tabs\r
-                       continue;\r
-               }\r
+                       break;\r
                \r
-               // Expand Buffer\r
-               if(len > space) {\r
-                       space += 256;\r
-                       ret = realloc(ret, space+1);\r
-                       if(!ret)        return NULL;\r
+               default:                \r
+                       // Expand Buffer\r
+                       if(len+1 > space) {\r
+                               space += 256;\r
+                               ret = realloc(ret, space+1);\r
+                               if(!ret)        return NULL;\r
+                       }\r
+                       \r
+                       // Editing inside the buffer\r
+                       if(pos != len) {\r
+                               char    buf[7] = "\x1B[000D";\r
+                               buf[2] += ((len-pos)/100) % 10;\r
+                               buf[3] += ((len-pos)/10) % 10;\r
+                               buf[4] += (len-pos) % 10;\r
+                               write(_stdout, 1, &ch); // Print new character\r
+                               write(_stdout, len-pos, &ret[pos]);     // Move Text\r
+                               write(_stdout, 7, buf); // Update Cursor\r
+                               memmove( &ret[pos+1], &ret[pos], len-pos );\r
+                       }\r
+                       else {\r
+                               write(_stdout, 1, &ch);\r
+                       }\r
+                       ret[pos++] = ch;\r
+                       len ++;\r
+                       break;\r
                }\r
-               \r
-               write(_stdout, 1, &ch);\r
-               ret[pos++] = ch;\r
-               len ++;\r
        } while(ch != '\n');\r
        \r
-       // Remove newline\r
-       pos --;\r
-       ret[pos] = '\0';\r
+       // Cap String\r
+       ret[len] = '\0';\r
+       printf("\n");\r
        \r
        // Return length\r
        if(Length)      *Length = len;\r

UCC git Repository :: git.ucc.asn.au