Merge branch 'master' of git://localhost/acess2
[tpg/acess2.git] / KernelLand / Kernel / drv / vterm_termbuf.c
index 2511048..525f1a4 100644 (file)
  */
 void VT_int_PutString(tVTerm *Term, const Uint8 *Buffer, Uint Count)
 {
-       Uint32  val;
         int    i;
        
        // Iterate
        for( i = 0; i < Count; i++ )
        {
                // Handle escape sequences
-               if( Buffer[i] == 0x1B )
+               if( Buffer[i] == 0x1B && Count - i > 1 )
                {
-                       i ++;
-                       i += VT_int_ParseEscape(Term, (const char*)&Buffer[i]) - 1;
-                       continue;
+                       int ret = VT_int_ParseEscape(Term, (const char*)&Buffer[i+1], Count-(i+1));
+                       if( ret > 0 )
+                       {
+                               i += ret;
+                               continue;
+                       }
                }
                
                // Fast check for non UTF-8
                if( Buffer[i] < 128 )   // Plain ASCII
                        VT_int_PutChar(Term, Buffer[i]);
                else {  // UTF-8
+                       Uint32  val;
                        i += ReadUTF8(&Buffer[i], &val) - 1;
                        VT_int_PutChar(Term, val);
                }
@@ -70,14 +73,15 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
                write_pos -= write_pos % Term->TextWidth;
                break;
        
-       case '\t': { int tmp = write_pos / Term->TextWidth;
+       case '\t': {
+               int line = write_pos / Term->TextWidth;
                write_pos %= Term->TextWidth;
                do {
                        buffer[ write_pos ].Ch = '\0';
                        buffer[ write_pos ].Colour = Term->CurColour;
                        write_pos ++;
                } while(write_pos & 7);
-               write_pos += tmp * Term->TextWidth;
+               write_pos += line * Term->TextWidth;
                break; }
        
        case '\b':
@@ -85,7 +89,7 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
                if(write_pos == 0)      break;
                
                write_pos --;
-               // Singe Character
+               // Single Character
                if(buffer[ write_pos ].Ch != '\0') {
                        buffer[ write_pos ].Ch = 0;
                        buffer[ write_pos ].Colour = Term->CurColour;
@@ -114,7 +118,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
        
        if(Term->Flags & VT_FLAG_ALTBUF)
        {
-               Term->AltBuf = buffer;
                Term->AltWritePos = write_pos;
                
                if(Term->AltWritePos >= Term->TextWidth*Term->TextHeight)
@@ -126,7 +129,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
        }
        else
        {
-               Term->Text = buffer;
                Term->WritePos = write_pos;
                // Move Screen
                // - Check if we need to scroll the entire scrollback buffer
@@ -134,10 +136,6 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
                {
                         int    base;
                        
-                       // Update previous line
-                       Term->WritePos -= Term->TextWidth;
-                       VT_int_UpdateScreen( Term, 0 );
-                       
                        // Update view position
                        base = Term->TextWidth*Term->TextHeight*(giVT_Scrollback);
                        if(Term->ViewPos < base)
@@ -146,16 +144,12 @@ void VT_int_PutChar(tVTerm *Term, Uint32 Ch)
                                Term->ViewPos = base;
                        
                        VT_int_ScrollText(Term, 1);
+                       Term->WritePos -= Term->TextWidth;
                }
                // Ok, so we only need to scroll the screen
                else if(Term->WritePos >= Term->ViewPos + Term->TextWidth*Term->TextHeight)
                {
-                       // Update the last line
-                       Term->WritePos -= Term->TextWidth;
-                       VT_int_UpdateScreen( Term, 0 );
-                       Term->WritePos += Term->TextWidth;
-                       
-                       VT_int_ScrollText(Term, 1);
+                       VT_int_ScrollFramebuffer( Term, 1 );
                        
                        Term->ViewPos += Term->TextWidth;
                }
@@ -189,7 +183,7 @@ void VT_int_ScrollText(tVTerm *Term, int Count)
                scroll_height = height;
        }
 
-       // Scroll text downwards        
+       // Scroll text upwards (more space at bottom)
        if( Count > 0 )
        {
                 int    base;
@@ -370,6 +364,7 @@ void VT_int_ChangeMode(tVTerm *Term, int NewMode, int NewWidth, int NewHeight)
        }
        
        // Debug
+       #if 0
        switch(NewMode)
        {
        case TERM_MODE_TEXT:
@@ -384,6 +379,7 @@ void VT_int_ChangeMode(tVTerm *Term, int NewMode, int NewWidth, int NewHeight)
        //case TERM_MODE_3DACCEL:
        //      return;
        }
+       #endif
 }
 
 

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