diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-04-18 03:51:19 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-04-18 03:51:19 +0000 |
commit | 55d3ed4b9d43beff4b905c9c3d853770203dd0b7 (patch) | |
tree | 1c057adb498bf4473b70743945e19f99a5ab5fbd /win32 | |
parent | 0f6a6654849b2cfde0cf9eb8a66130b1aa92528d (diff) |
win32.c: fix CSI sequences to delete
* win32/win32.c (constat_apply): CSI 'J' and 'K' are defaulted to
1, not 0. [ruby-core:86560] [Bug #14691]
* win32/win32.c (constat_apply): "delete before cursor" sequences
include the cursor position.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@63187 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'win32')
-rw-r--r-- | win32/win32.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/win32/win32.c b/win32/win32.c index 0a43ac7118..5af301fee2 100644 --- a/win32/win32.c +++ b/win32/win32.c @@ -6679,11 +6679,11 @@ constat_apply(HANDLE handle, struct constat *s, WCHAR w) CONSOLE_SCREEN_BUFFER_INFO csbi; const int *seq = s->vt100.seq; int count = s->vt100.state; - int arg1 = 1; + int arg0, arg1 = 1; COORD pos; if (!GetConsoleScreenBufferInfo(handle, &csbi)) return; - if (count > 0 && seq[0] > 0) arg1 = seq[0]; + if (arg0 = (count > 0 && seq[0] > 0)) arg1 = seq[0]; switch (w) { case L'm': SetConsoleTextAttribute(handle, constat_attr(count, seq, csbi.wAttributes, s->vt100.attr, &s->vt100.reverse)); @@ -6742,19 +6742,19 @@ constat_apply(HANDLE handle, struct constat *s, WCHAR w) SetConsoleCursorPosition(handle, pos); break; case L'J': - switch (arg1) { + switch (arg0 ? arg1 : 0) { case 0: /* erase after cursor */ constat_clear(handle, csbi.wAttributes, (csbi.dwSize.X * (csbi.srWindow.Bottom - csbi.dwCursorPosition.Y + 1) - csbi.dwCursorPosition.X), csbi.dwCursorPosition); break; - case 1: /* erase before cursor */ + case 1: /* erase before *and* cursor */ pos.X = 0; pos.Y = csbi.srWindow.Top; constat_clear(handle, csbi.wAttributes, (csbi.dwSize.X * (csbi.dwCursorPosition.Y - csbi.srWindow.Top) - + csbi.dwCursorPosition.X), + + csbi.dwCursorPosition.X + 1), pos); break; case 2: /* erase entire screen */ @@ -6774,17 +6774,17 @@ constat_apply(HANDLE handle, struct constat *s, WCHAR w) } break; case L'K': - switch (arg1) { + switch (arg0 ? arg1 : 0) { case 0: /* erase after cursor */ constat_clear(handle, csbi.wAttributes, (csbi.dwSize.X - csbi.dwCursorPosition.X), csbi.dwCursorPosition); break; - case 1: /* erase before cursor */ + case 1: /* erase before *and* cursor */ pos.X = 0; pos.Y = csbi.dwCursorPosition.Y; constat_clear(handle, csbi.wAttributes, - csbi.dwCursorPosition.X, pos); + csbi.dwCursorPosition.X + 1, pos); break; case 2: /* erase entire line */ pos.X = 0; |