Usermode/GUITerminal - VT100 extended parsing
authorJohn Hodge (sonata) <[email protected]>
Sun, 20 Jan 2013 07:02:29 +0000 (15:02 +0800)
committerJohn Hodge (sonata) <[email protected]>
Sun, 20 Jan 2013 07:02:29 +0000 (15:02 +0800)
Usermode/Applications/gui_shell_src/vt100.c

index 190f42c..f73f452 100644 (file)
@@ -9,6 +9,10 @@
 #include <limits.h>
 #include "include/vt100.h"
 #include "include/display.h"
+#include <ctype.h>     // isalpha
+#include <acess/sys.h> // _SysDebug
+
+ int   Term_HandleVT100_Long(int Len, const char *Buf);
 
 static inline int min(int a, int b)
 {
@@ -23,11 +27,32 @@ int Term_HandleVT100(int Len, const char *Buf)
 
        if( inc_len > 0 || *Buf == '\x1b' )
        {
-               memcpy(inc_buf + inc_len, Buf, min(MAX_VT100_ESCAPE_LEN - inc_len, Len));
+                int    new_bytes = min(MAX_VT100_ESCAPE_LEN - inc_len, Len);
+                int    ret = 0;
+               memcpy(inc_buf + inc_len, Buf, new_bytes);
+               inc_len += new_bytes;
                // Handle VT100 (like) escape sequence
-               
-               inc_len = 0;
-               return 1;
+
+               _SysDebug("inc_len = %i, new_bytes = %i", inc_len, new_bytes);
+
+               if( inc_len <= 1 )
+                       return 1;       // Skip 1 character (the '\x1b')
+
+               switch(inc_buf[1])
+               {
+               case '[':       // Multibyte, funtime starts    
+                       ret = Term_HandleVT100_Long(inc_len-2, inc_buf+2);
+                       if( ret > 0 )
+                               ret += 2;
+                       break;
+               default:
+                       ret = 2;
+                       break;
+               }       
+
+               if( ret != 0 )
+                       inc_len = 0;
+               return ret;
        }
 
        switch( *Buf )
@@ -60,3 +85,73 @@ int Term_HandleVT100(int Len, const char *Buf)
        }
        return -ret;
 }
+
+int Term_HandleVT100_Long(int Len, const char *Buffer)
+{
+       char    c;
+        int    argc = 0, j = 0;
+        int    args[6] = {0,0,0,0,0,0};
+        int    bQuestionMark = 0;
+       
+       // Get Arguments
+       if(j == Len)    return 0;
+       c = Buffer[j++];
+       if(c == '?') {
+               bQuestionMark = 1;
+               if(j == Len)    return 0;
+               c = Buffer[j++];
+       }
+       if( '0' <= c && c <= '9' )
+       {
+               do {
+                       if(c == ';') {
+                               if(j == Len)    return 0;
+                               c = Buffer[j++];
+                       }
+                       while('0' <= c && c <= '9') {
+                               args[argc] *= 10;
+                               args[argc] += c-'0';
+                               if(j == Len)    return 0;
+                               c = Buffer[j++];
+                       }
+                       argc ++;
+               } while(c == ';');
+       }
+       
+       // Get Command
+       if( !isalpha(c) ) {
+               // Bother.
+               _SysDebug("Unexpected char 0x%x in VT100 escape code", c);
+               return -1;
+       }
+
+       if( bQuestionMark )
+       {
+               // Special commands
+               switch( c )
+               {
+               default:
+                       _SysDebug("Unknown VT100 extended escape char 0x%x", c);
+                       break;
+               }
+       }
+       else
+       {
+               // Standard commands
+               switch( c )
+               {
+               case 'J':
+                       if( argc == 0 )
+                               Display_ClearLine(0);
+                       else if( args[0] == 2 )
+                               Display_ClearLines(0);  // Entire screen!
+                       else
+                               _SysDebug("TODO: VT100 %i J", args[0]);
+                       break;
+               default:
+                       _SysDebug("Unknown VT100 escape char 0x%x", c);
+                       break;
+               }
+       }
+       return j;
+}

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