3 * - By John Hodge (thePowersGang)
6 * - VT100/xterm Emulation
10 #include "include/vt100.h"
11 #include "include/display.h"
12 #include <ctype.h> // isalpha
13 #include <acess/sys.h> // _SysDebug
16 const uint32_t caVT100Colours[] = {
17 // Black, Red, Green, Yellow, Blue, Purple, Cyan, Gray
18 // Same again, but bright
19 0x000000, 0x770000, 0x007700, 0x777700, 0x000077, 0x770077, 0x007777, 0xAAAAAAA,
20 0xCCCCCC, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFFF
23 int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buf);
25 static inline int min(int a, int b)
30 int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
32 #define MAX_VT100_ESCAPE_LEN 16
33 static char inc_buf[MAX_VT100_ESCAPE_LEN];
34 static int inc_len = 0;
36 if( inc_len > 0 || *Buf == '\x1b' )
38 // Handle VT100 (like) escape sequence
39 int new_bytes = min(MAX_VT100_ESCAPE_LEN - inc_len, Len);
41 int old_inc_len = inc_len;
42 memcpy(inc_buf + inc_len, Buf, new_bytes);
44 if( new_bytes == 0 ) {
50 //_SysDebug("inc_buf = %i '%.*s'", inc_len, inc_len, inc_buf);
53 return 1; // Skip 1 character (the '\x1b')
57 case '[': // Multibyte, funtime starts
58 ret = Term_HandleVT100_Long(Term, inc_len-2, inc_buf+2);
64 Display_ScrollDown(Term, 1);
68 Display_ScrollDown(Term, -1);
78 assert(ret > old_inc_len);
79 //_SysDebug("%i bytes of escape code '%.*s' (return %i)",
80 // ret, ret, inc_buf, ret-old_inc_len);
81 ret -= old_inc_len; // counter cached bytes
91 Display_MoveCursor(Term, 0, -1);
92 Display_AddText(Term, 1, " ");
93 Display_MoveCursor(Term, 0, -1);
94 // TODO: Need to handle \t and ^A-Z
97 // TODO: tab (get current cursor pos, space until multiple of 8)
100 Display_Newline(Term, 1);
103 Display_MoveCursor(Term, 0, INT_MIN);
117 // Force an exit right now
129 int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
133 int args[6] = {0,0,0,0,0,0};
134 int bQuestionMark = 0;
137 if(j == Len) return 0;
141 if(j == Len) return 0;
144 if( '0' <= c && c <= '9' )
148 if(j == Len) return 0;
151 while('0' <= c && c <= '9') {
154 if(j == Len) return 0;
164 _SysDebug("Unexpected char 0x%x in VT100 escape code '\\e[%.*s'", c,
180 case 25: // Hide cursor
181 _SysDebug("TODO: \\e[?25%c Show/Hide cursor", c);
183 case 1047: // Alternate buffer
184 Display_ShowAltBuffer(Term, set);
187 _SysDebug("TODO: \\e[?%i%c Unknow DEC private mode", args[0], c);
192 _SysDebug("Unknown VT100 extended escape char 0x%x", c);
205 Display_SetCursor(Term, args[0], args[1]);
213 _SysDebug("TODO: VT100 %i J", args[0]);
215 case 2: // Everything
216 Display_ClearLines(Term, 0);
219 _SysDebug("Unknown VT100 %i J", args[0]);
228 _SysDebug("TODO: VT100 %i K", args[0]);
231 Display_ClearLine(Term, 0);
234 _SysDebug("Unknown VT100 %i K", args[0]);
237 case 'T': // Scroll down n=1
238 Display_ScrollDown(Term, 1);
248 for( i = 0; i < argc; i ++ )
254 else if( 30 <= args[i] && args[i] <= 37 )
257 Display_SetForeground( Term, caVT100Colours[ args[i]-30 ] );
259 else if( 40 <= args[i] && args[i] <= 47 )
262 Display_SetBackground( Term, caVT100Colours[ args[i]-30 ] );
267 // Set scrolling region
269 Display_SetScrollArea(Term, args[0], args[1]);
273 Display_SaveCursor(Term);
276 Display_RestoreCursor(Term);
279 _SysDebug("Unknown VT100 long escape char 0x%x '%c'", c, c);