Usermode/GUI Terminal - Fixed some crashes and implimentation issues
[tpg/acess2.git] / Usermode / Applications / gui_terminal_src / vt100.c
index cad4119..69296bd 100644 (file)
@@ -11,6 +11,7 @@
 #include "include/display.h"
 #include <ctype.h>     // isalpha
 #include <acess/sys.h> // _SysDebug
+#include <assert.h>
 
 const uint32_t caVT100Colours[] = {
        // Black, Red, Green, Yellow, Blue, Purple, Cyan, Gray
@@ -36,10 +37,17 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
        {
                // Handle VT100 (like) escape sequence
                 int    new_bytes = min(MAX_VT100_ESCAPE_LEN - inc_len, Len);
-                int    ret = 0, old_inc_len = inc_len;
+                int    ret = 0;
+                int    old_inc_len = inc_len;
                memcpy(inc_buf + inc_len, Buf, new_bytes);
 
+               if( new_bytes == 0 ) {
+                       inc_len = 0;
+                       return 0;
+               }
+
                inc_len += new_bytes;
+               //_SysDebug("inc_buf = %i '%.*s'", inc_len, inc_len, inc_buf);
 
                if( inc_len <= 1 )
                        return 1;       // Skip 1 character (the '\x1b')
@@ -52,6 +60,14 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
                                ret += 2;
                        }
                        break;
+               case 'D':
+                       Display_ScrollDown(Term, 1);
+                       ret = 2;
+                       break;
+               case 'M':
+                       Display_ScrollDown(Term, -1);
+                       ret = 2;
+                       break;
                default:
                        ret = 2;
                        break;
@@ -59,17 +75,22 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
 
                if( ret != 0 ) {
                        inc_len = 0;
+                       assert(ret > old_inc_len);
+                       //_SysDebug("%i bytes of escape code '%.*s' (return %i)",
+                       //      ret, ret, inc_buf, ret-old_inc_len);
                        ret -= old_inc_len;     // counter cached bytes
                }
+               else
+                       ret = new_bytes;
                return ret;
        }
 
        switch( *Buf )
        {
        case '\b':
-               Display_MoveCursor(Term, -1, 0);
+               Display_MoveCursor(Term, 0, -1);
                Display_AddText(Term, 1, " ");
-               Display_MoveCursor(Term, -1, 0);
+               Display_MoveCursor(Term, 0, -1);
                // TODO: Need to handle \t and ^A-Z
                return 1;
        case '\t':
@@ -79,7 +100,7 @@ int Term_HandleVT100(tTerminal *Term, int Len, const char *Buf)
                Display_Newline(Term, 1);
                return 1;
        case '\r':
-               Display_MoveCursor(Term, INT_MIN, 0);
+               Display_MoveCursor(Term, 0, INT_MIN);
                return 1;
        }
 
@@ -140,8 +161,9 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
        // Get Command
        if( !isalpha(c) ) {
                // Bother.
-               _SysDebug("Unexpected char 0x%x in VT100 escape code", c);
-               return 1;
+               _SysDebug("Unexpected char 0x%x in VT100 escape code '\\e[%.*s'", c,
+                       Len, Buffer);
+               return j;
        }
 
        if( bQuestionMark )
@@ -184,15 +206,36 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                        }
                        break;
                case 'J':
-                       if( argc == 0 )
-                               Display_ClearLine(Term, 0);
-                       else if( args[0] == 2 )
-                               Display_ClearLines(Term, 0);    // Entire screen!
-                       else
+                       switch( args[0] )
+                       {
+                       case 0:
+                       case 1:
                                _SysDebug("TODO: VT100 %i J", args[0]);
+                               break;
+                       case 2: // Everything
+                               Display_ClearLines(Term, 0);
+                               break;
+                       default:
+                               _SysDebug("Unknown VT100 %i J", args[0]);
+                               break;
+                       }
                        break;
+               case 'K':
+                       switch( args[0] )
+                       {
+                       case 0: // To EOL
+                       case 1: // To SOL
+                               _SysDebug("TODO: VT100 %i K", args[0]);
+                               break;
+                       case 2:
+                               Display_ClearLine(Term, 0);
+                               break;
+                       default:
+                               _SysDebug("Unknown VT100 %i K", args[0]);
+                               break;
+                       }
                case 'T':       // Scroll down n=1
-                       _SysDebug("TODO: \\x1B[nT - Scroll down");
+                       Display_ScrollDown(Term, 1);
                        break;
                case 'm':
                        if( argc == 0 )
@@ -223,8 +266,14 @@ int Term_HandleVT100_Long(tTerminal *Term, int Len, const char *Buffer)
                        break;
                // Set scrolling region
                case 'r':
-                       _SysDebug("TODO: \\x1B[%i;%ir - Set Scroll Region",
-                               args[0], args[1]);
+                       Display_SetScrollArea(Term, args[0], args[1]);
+                       break;
+               
+               case 's':
+                       Display_SaveCursor(Term);
+                       break;
+               case 'u':
+                       Display_RestoreCursor(Term);
                        break;
                default:
                        _SysDebug("Unknown VT100 long escape char 0x%x '%c'", c, c);

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