3 * - By John Hodge (thePowersGang)
6 * - VT100/xterm Emulation
9 #include "include/vt100.h"
10 #include "include/display.h"
11 #include <ctype.h> // isalpha
13 # define _SysDebug(v...) Debug("VT100 "v)
15 # include <acess/sys.h> // _SysDebug
20 const uint32_t caVT100Colours[] = {
21 // Black, Red, Green, Yellow, Blue, Magenta, Cyan, Gray
22 // Same again, but bright
23 0x000000, 0x770000, 0x007700, 0x777700, 0x000077, 0x770077, 0x007777, 0xAAAAAA,
24 0xCCCCCC, 0xFF0000, 0x00FF00, 0xFFFF00, 0x0000FF, 0xFF00FF, 0x00FFFF, 0xFFFFFF,
27 int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buf);
29 static inline int min(int a, int b)
34 int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
36 #define MAX_VT100_ESCAPE_LEN 16
37 static char inc_buf[MAX_VT100_ESCAPE_LEN];
38 static int inc_len = 0;
40 if( inc_len > 0 || *Buf == '\x1b' )
42 // Handle VT100 (like) escape sequence
43 int new_bytes = min(MAX_VT100_ESCAPE_LEN - inc_len, Len);
45 int old_inc_len = inc_len;
46 memcpy(inc_buf + inc_len, Buf, new_bytes);
48 if( new_bytes == 0 ) {
49 _SysDebug("Term_HandleVT100: Hit max? (Len=%i)", Len);
55 //_SysDebug("inc_buf = %i '%.*s'", inc_len, inc_len, inc_buf);
58 return 1; // Skip 1 character (the '\x1b')
62 case '[': // Multibyte, funtime starts
63 ret = Term_HandleVT100_Long(Term, inc_len-2, inc_buf+2);
69 Display_ScrollDown(Term, 1);
73 Display_ScrollDown(Term, -1);
83 assert(ret > old_inc_len);
84 //_SysDebug("%i bytes of escape code '%.*s' (return %i)",
85 // ret, ret, inc_buf, ret-old_inc_len);
86 ret -= old_inc_len; // counter cached bytes
95 // TODO: Need to handle \t and ^A-Z
97 Display_MoveCursor(Term, 0, -1);
98 Display_AddText(Term, 1, " ");
99 Display_MoveCursor(Term, 0, -1);
102 // TODO: tab (get current cursor pos, space until multiple of 8)
105 // TODO: Support disabling CR after NL
106 Display_Newline(Term, 1);
109 if( Len >= 2 && Buf[1] == '\n' ) {
110 Display_Newline(Term, 1);
114 Display_MoveCursor(Term, 0, INT_MIN);
129 // Force an exit right now
141 int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
145 int args[6] = {0,0,0,0,0,0};
146 int bQuestionMark = 0;
149 if(j == Len) return 0;
153 if(j == Len) return 0;
156 if( '0' <= c && c <= '9' )
160 if(j == Len) return 0;
163 while('0' <= c && c <= '9') {
166 if(j == Len) return 0;
176 _SysDebug("Unexpected char 0x%x in VT100 escape code '\\e[%.*s'", c,
192 case 1: // Aplication cursor keys
193 _SysDebug("TODO: \\e[?1%c Application cursor keys", c);
195 case 25: // Hide cursor
196 _SysDebug("TODO: \\e[?25%c Show/Hide cursor", c);
198 case 1047: // Alternate buffer
199 Display_ShowAltBuffer(Term, set);
202 _SysDebug("TODO: \\e[?%i%c Unknow DEC private mode", args[0], c);
207 _SysDebug("Unknown VT100 extended escape char 0x%x", c);
217 Display_MoveCursor(Term, -(argc >= 1 ? args[0] : 1), 0);
220 Display_MoveCursor(Term, (argc >= 1 ? args[0] : 1), 0);
223 Display_MoveCursor(Term, 0, (argc >= 1 ? args[0] : 1));
226 Display_MoveCursor(Term, 0, -(argc >= 1 ? args[0] : 1));
232 Display_SetCursor(Term, args[0], args[1]);
235 case 'J': // Clear lines
239 Display_ClearLines(Term, 1); // Down
242 Display_ClearLines(Term, -1); // Up
245 Display_ClearLines(Term, 0); // All
248 _SysDebug("Unknown VT100 %i J", args[0]);
256 Display_ClearLine(Term, -1);
259 Display_ClearLine(Term, 1);
262 Display_ClearLine(Term, 0);
265 _SysDebug("Unknown VT100 %i K", args[0]);
268 case 'S': // Scroll down n=1
269 Display_ScrollDown(Term, -(argc >= 1 ? args[0] : 1));
271 case 'T': // Scroll down n=1
272 Display_ScrollDown(Term, (argc >= 1 ? args[0] : 1));
278 Display_ResetAttributes(Term);
282 for( int i = 0; i < argc; i ++ )
287 Display_ResetAttributes(Term);
290 _SysDebug("TODO: VT100 \\e[1m - Bold");
293 _SysDebug("TODO: VT100 \\e[1m - Reverse");
297 Display_SetForeground( Term, caVT100Colours[ args[i]-30 ] );
301 Display_SetBackground( Term, caVT100Colours[ args[i]-40 ] );
304 _SysDebug("TODO: VT100 \\e[%im", args[i]);
310 // Set scrolling region
312 Display_SetScrollArea(Term, args[0], (args[1] - args[0]));
316 Display_SaveCursor(Term);
319 Display_RestoreCursor(Term);
322 _SysDebug("Unknown VT100 long escape char 0x%x '%c'", c, c);