From: John Hodge (sonata) Date: Sun, 20 Jan 2013 07:02:29 +0000 (+0800) Subject: Usermode/GUITerminal - VT100 extended parsing X-Git-Tag: rel0.15~598^2~13 X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=b5aad1760060dd031d23887cfe8d64a3f287c34a;p=tpg%2Facess2.git Usermode/GUITerminal - VT100 extended parsing --- diff --git a/Usermode/Applications/gui_shell_src/vt100.c b/Usermode/Applications/gui_shell_src/vt100.c index 190f42c1..f73f4529 100644 --- a/Usermode/Applications/gui_shell_src/vt100.c +++ b/Usermode/Applications/gui_shell_src/vt100.c @@ -9,6 +9,10 @@ #include #include "include/vt100.h" #include "include/display.h" +#include // isalpha +#include // _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; +}