X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Fdrv%2Fvterm_vt100.c;h=6d123e5cc7bbde6b3795fbbf2d5f16ab359ba6d3;hb=2db551c69841b4fb5a70ae05e08d54b1a016364b;hp=fb152a3079f7fd5a90682256a9b5a2354fd6d11e;hpb=51ab5f489bc356940c95cc936fd0508e8f07ea97;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/drv/vterm_vt100.c b/KernelLand/Kernel/drv/vterm_vt100.c index fb152a30..6d123e5c 100644 --- a/KernelLand/Kernel/drv/vterm_vt100.c +++ b/KernelLand/Kernel/drv/vterm_vt100.c @@ -188,6 +188,18 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int Term->CurColour &= 0xFFFF8000; Term->CurColour |= caVT100Colours[ colour_idx ]; } + // Foreground Colour - bright + else if(90 <= args[argc] && args[argc] <= 97 ) { + colour_idx = args[argc]-90 + 8; + Term->CurColour &= 0x8000FFFF; + Term->CurColour |= (Uint32)caVT100Colours[ colour_idx ] << 16; + } + // Background Colour - bright + else if(100 <= args[argc] && args[argc] <= 107 ) { + colour_idx = args[argc]-100 + 8; + Term->CurColour &= 0xFFFF8000; + Term->CurColour |= (Uint32)caVT100Colours[ colour_idx ]; + } else { Log_Warning("VTerm", "Unknown font flag %i", args[argc]); } @@ -211,30 +223,39 @@ void VT_int_ParseEscape_StandardLarge(tVTerm *Term, char CmdChar, int argc, int * \fn int VT_int_ParseEscape(tVTerm *Term, const char *Buffer) * \brief Parses a VT100 Escape code */ -int VT_int_ParseEscape(tVTerm *Term, const char *Buffer) +int VT_int_ParseEscape(tVTerm *Term, const char *Buffer, size_t Bytes) { char c; - int argc = 0, j = 1; + int argc = 0, j = 0; int args[6] = {0,0,0,0}; int bQuestionMark = 0; - - switch(Buffer[0]) + + if( Bytes == j ) return j; + c = Buffer[j++]; + + switch(c) { //Large Code case '[': // Get Arguments + if(Bytes == j) return j; c = Buffer[j++]; if(c == '?') { bQuestionMark = 1; + if(Bytes == j) return j; c = Buffer[j++]; } if( '0' <= c && c <= '9' ) { do { - if(c == ';') c = Buffer[j++]; + if(c == ';') { + if(Bytes == j) return j; + c = Buffer[j++]; + } while('0' <= c && c <= '9') { args[argc] *= 10; args[argc] += c-'0'; + if(Bytes == j) return j; c = Buffer[j++]; } argc ++; @@ -242,51 +263,64 @@ int VT_int_ParseEscape(tVTerm *Term, const char *Buffer) } // Get Command - if( ('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) + if( !('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z') ) { - if( bQuestionMark ) + // Error + return j; + } + + if( bQuestionMark ) + { + switch(c) { - switch(c) + // DEC Private Mode Set + case 'h': + if(argc != 1) break; + switch(args[0]) { - // DEC Private Mode Set - case 'h': - if(argc != 1) break; - switch(args[0]) - { - case 25: - Term->Flags &= ~VT_FLAG_HIDECSR; - break; - case 1047: - VT_int_ToggleAltBuffer(Term, 1); - break; - } + case 25: + Term->Flags &= ~VT_FLAG_HIDECSR; + break; + case 1047: + VT_int_ToggleAltBuffer(Term, 1); break; - case 'l': - if(argc != 1) break; - switch(args[0]) - { - case 25: - Term->Flags |= VT_FLAG_HIDECSR; - break; - case 1047: - VT_int_ToggleAltBuffer(Term, 0); - break; - } + } + break; + case 'l': + if(argc != 1) break; + switch(args[0]) + { + case 25: + Term->Flags |= VT_FLAG_HIDECSR; break; - default: - Log_Warning("VTerm", "Unknown control sequence '\\x1B[?%c'", c); + case 1047: + VT_int_ToggleAltBuffer(Term, 0); break; } - } - else - { - VT_int_ParseEscape_StandardLarge(Term, c, argc, args); + break; + default: + Log_Warning("VTerm", "Unknown control sequence '\\x1B[?%c'", c); + break; } } + else + { + VT_int_ParseEscape_StandardLarge(Term, c, argc, args); + } + break; + case '\0': + // Ignore \0 break; - default: - Log_Notice("VTerm", "TODO: Handle short escape codes"); + //Log_Notice("VTerm", "TODO: Handle short escape codes"); + { + static volatile int tmp = 0; + if(tmp == 0) { + tmp = 1; + Debug("VTerm: Unknown short 0x%x", c); + tmp = 0; + } + } break; }