summaryrefslogtreecommitdiff
path: root/win32/win32.c
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-18 03:51:19 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2018-04-18 03:51:19 +0000
commit55d3ed4b9d43beff4b905c9c3d853770203dd0b7 (patch)
tree1c057adb498bf4473b70743945e19f99a5ab5fbd /win32/win32.c
parent0f6a6654849b2cfde0cf9eb8a66130b1aa92528d (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/win32.c')
-rw-r--r--win32/win32.c16
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;