for( i = 0; i < Count; i++ )
{
// Handle escape sequences
- if( Buffer[i] == 0x1B && Count - i > 1 )
+ int ret = VT_int_ParseEscape(Term, (const char*)&Buffer[i], Count-i);
+ if( ret > 0 )
{
- int ret = VT_int_ParseEscape(Term, (const char*)&Buffer[i+1], Count-(i+1));
- if( ret > 0 )
- {
- i += ret;
- continue;
- }
+ i += ret;
+ continue;
}
// Fast check for non UTF-8
int argc = 0, j = 0;
int args[6] = {0,0,0,0};
int bQuestionMark = 0;
+ const int ofs = Term->EscapeCodeLen;
+ const int sparespace = sizeof(Term->EscapeCodeCache)-Term->EscapeCodeLen;
+ const int copysize = MIN(Bytes, sparespace);
- if( Bytes == j ) return j;
+ memcpy( Term->EscapeCodeCache + Term->EscapeCodeLen, Buffer, copysize );
+ Term->EscapeCodeLen += copysize;
+
+ Bytes = Term->EscapeCodeLen;
+ Buffer = Term->EscapeCodeCache;
+
+ if( Bytes == j ) return j-ofs;
+ c = Buffer[j++];
+ if(c != '\x1b') {
+ Term->EscapeCodeLen = 0;
+ return 0;
+ }
+
+ if( Bytes == j ) return j-ofs;
c = Buffer[j++];
switch(c)
//Large Code
case '[':
// Get Arguments
- if(Bytes == j) return j;
+ if(Bytes == j) return j-ofs;
c = Buffer[j++];
if(c == '?') {
bQuestionMark = 1;
- if(Bytes == j) return j;
+ if(Bytes == j) return j-ofs;
c = Buffer[j++];
}
if( '0' <= c && c <= '9' )
{
do {
if(c == ';') {
- if(Bytes == j) return j;
+ if(Bytes == j) return j-ofs;
c = Buffer[j++];
}
while('0' <= c && c <= '9') {
args[argc] *= 10;
args[argc] += c-'0';
- if(Bytes == j) return j;
+ if(Bytes == j) return j-ofs;
c = Buffer[j++];
}
argc ++;
// Get Command
if( !('a' <= c && c <= 'z') && !('A' <= c && c <= 'Z') )
{
- // Error
- return j;
+ // Error - eat ESC only?
+ // > j : Entire code skipped
+ Term->EscapeCodeLen = 0;
+ return j-ofs;
}
if( bQuestionMark )
}
//Log_Debug("VTerm", "j = %i, Buffer = '%s'", j, Buffer);
- return j;
+ Term->EscapeCodeLen = 0;
+ return j-ofs;
}