Having CR go back to the beginning of a wrapped line is not a good idea
when it's followed by LF.
This commit is contained in:
Jason Hood 2017-12-24 23:44:26 +10:00
parent 75f707fc20
commit 2120ff3efa

29
ANSI.c
View File

@ -688,9 +688,9 @@ void FlushBuffer( void )
// width) and contains sufficient lines. // width) and contains sufficient lines.
GetConsoleScreenBufferInfo( hConOut, &Info ); GetConsoleScreenBufferInfo( hConOut, &Info );
if (WIN.Right - WIN.Left + 1 != WIDTH || if (WIN.Right - WIN.Left + 1 != WIDTH ||
BOTTOM - TOP < 2 * nCharInBuffer % WIDTH) BOTTOM - TOP < 2 * nCharInBuffer / WIDTH)
{ {
HEIGHT = 2 * nCharInBuffer % WIDTH + 1; HEIGHT = 2 * nCharInBuffer / WIDTH + 1;
SetConsoleScreenBufferSize( hConWrap, Info.dwSize ); SetConsoleScreenBufferSize( hConWrap, Info.dwSize );
} }
// Put the cursor on the top line, in the same column. // Put the cursor on the top line, in the same column.
@ -896,8 +896,9 @@ void PushBuffer( WCHAR c )
if (nl) if (nl)
MoveDown( TRUE ); MoveDown( TRUE );
} }
return;
} }
else if (c == '\r') if (nCharInBuffer > 0 && ChBuffer[nCharInBuffer-1] == '\r')
{ {
FlushBuffer(); FlushBuffer();
if (nWrapped) if (nWrapped)
@ -908,12 +909,9 @@ void PushBuffer( WCHAR c )
if (pState->tb_margins && CUR.Y < TOP) CUR.Y = TOP; if (pState->tb_margins && CUR.Y < TOP) CUR.Y = TOP;
set_pos( LEFT, CUR.Y ); set_pos( LEFT, CUR.Y );
} }
else
ChBuffer[nCharInBuffer++] = c;
} }
else if (c == '\b') if (c == '\b')
{ {
BOOL bs = FALSE;
FlushBuffer(); FlushBuffer();
if (nWrapped) if (nWrapped)
{ {
@ -924,20 +922,15 @@ void PushBuffer( WCHAR c )
CUR.Y--; CUR.Y--;
SetConsoleCursorPos( hConOut, CUR ); SetConsoleCursorPos( hConOut, CUR );
--nWrapped; --nWrapped;
bs = TRUE; return;
} }
} }
if (!bs)
ChBuffer[nCharInBuffer++] = c;
}
else
{
if (shifted && c >= FIRST_G1 && c <= LAST_G1)
c = G1[c-FIRST_G1];
ChBuffer[nCharInBuffer] = c;
if (++nCharInBuffer == BUFFER_SIZE)
FlushBuffer();
} }
if (shifted && c >= FIRST_G1 && c <= LAST_G1)
c = G1[c-FIRST_G1];
ChBuffer[nCharInBuffer] = c;
if (++nCharInBuffer == BUFFER_SIZE)
FlushBuffer();
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------