#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)
{
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 )
}
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;
+}