* Fixed CID 566 that was duplicated in blue_screen.cpp as well (but was not
discovered by Coverity for some reason): commands without arguments would overwrite memory (in this case the sConsole::arg_count only, though). * Travis's copyright was missing in blue_screen.cpp. * Minor cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38409 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2005, Axel Dörfler, [email protected]. All rights reserved.
|
* Copyright 2005-2010, Axel Dörfler, [email protected].
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
*
|
*
|
||||||
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||||
@@ -87,19 +87,19 @@ update_cursor(struct console_desc *console, int x, int y)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gotoxy(struct console_desc *console, int new_x, int new_y)
|
gotoxy(struct console_desc *console, int newX, int newY)
|
||||||
{
|
{
|
||||||
if (new_x >= console->columns)
|
if (newX >= console->columns)
|
||||||
new_x = console->columns - 1;
|
newX = console->columns - 1;
|
||||||
if (new_x < 0)
|
if (newX < 0)
|
||||||
new_x = 0;
|
newX = 0;
|
||||||
if (new_y >= console->lines)
|
if (newY >= console->lines)
|
||||||
new_y = console->lines - 1;
|
newY = console->lines - 1;
|
||||||
if (new_y < 0)
|
if (newY < 0)
|
||||||
new_y = 0;
|
newY = 0;
|
||||||
|
|
||||||
console->x = new_x;
|
console->x = newX;
|
||||||
console->y = new_y;
|
console->y = newY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -114,8 +114,8 @@ reset_console(struct console_desc *console)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** scroll from the cursor line up to the top of the scroll region up one line */
|
/*! Scroll from the cursor line up to the top of the scroll region up one line.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
scrup(struct console_desc *console)
|
scrup(struct console_desc *console)
|
||||||
{
|
{
|
||||||
@@ -130,12 +130,14 @@ scrup(struct console_desc *console)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// clear the bottom line
|
// clear the bottom line
|
||||||
console->module->fill_glyph(0, console->y, console->columns, 1, ' ', console->attr);
|
console->module->fill_glyph(0, console->y, console->columns, 1, ' ',
|
||||||
|
console->attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/** scroll from the cursor line down to the bottom of the scroll region down one line */
|
/*! Scroll from the cursor line down to the bottom of the scroll region down
|
||||||
|
one line.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
scrdown(struct console_desc *console)
|
scrdown(struct console_desc *console)
|
||||||
{
|
{
|
||||||
@@ -150,7 +152,8 @@ scrdown(struct console_desc *console)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// clear the top line
|
// clear the top line
|
||||||
console->module->fill_glyph(0, console->y, console->columns, 1, ' ', console->attr);
|
console->module->fill_glyph(0, console->y, console->columns, 1, ' ',
|
||||||
|
console->attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -211,10 +214,12 @@ erase_line(struct console_desc *console, erase_line_mode mode)
|
|||||||
{
|
{
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case LINE_ERASE_WHOLE:
|
case LINE_ERASE_WHOLE:
|
||||||
console->module->fill_glyph(0, console->y, console->columns, 1, ' ', console->attr);
|
console->module->fill_glyph(0, console->y, console->columns, 1, ' ',
|
||||||
|
console->attr);
|
||||||
break;
|
break;
|
||||||
case LINE_ERASE_LEFT:
|
case LINE_ERASE_LEFT:
|
||||||
console->module->fill_glyph(0, console->y, console->x+1, 1, ' ', console->attr);
|
console->module->fill_glyph(0, console->y, console->x + 1, 1, ' ',
|
||||||
|
console->attr);
|
||||||
break;
|
break;
|
||||||
case LINE_ERASE_RIGHT:
|
case LINE_ERASE_RIGHT:
|
||||||
console->module->fill_glyph(console->x, console->y,
|
console->module->fill_glyph(console->x, console->y,
|
||||||
@@ -234,11 +239,12 @@ erase_screen(struct console_desc *console, erase_screen_mode mode)
|
|||||||
console->module->clear(console->attr);
|
console->module->clear(console->attr);
|
||||||
break;
|
break;
|
||||||
case SCREEN_ERASE_UP:
|
case SCREEN_ERASE_UP:
|
||||||
console->module->fill_glyph(0, 0, console->columns, console->y + 1, ' ', console->attr);
|
console->module->fill_glyph(0, 0, console->columns, console->y + 1,
|
||||||
|
' ', console->attr);
|
||||||
break;
|
break;
|
||||||
case SCREEN_ERASE_DOWN:
|
case SCREEN_ERASE_DOWN:
|
||||||
console->module->fill_glyph(console->y, 0,
|
console->module->fill_glyph(console->y, 0, console->columns,
|
||||||
console->columns, console->lines - console->y, ' ', console->attr);
|
console->lines - console->y, ' ', console->attr);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
@@ -247,21 +253,23 @@ erase_screen(struct console_desc *console, erase_screen_mode mode)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
save_cur(struct console_desc *console, bool save_attrs)
|
save_cur(struct console_desc *console, bool saveAttrs)
|
||||||
{
|
{
|
||||||
console->saved_x = console->x;
|
console->saved_x = console->x;
|
||||||
console->saved_y = console->y;
|
console->saved_y = console->y;
|
||||||
if (save_attrs)
|
|
||||||
|
if (saveAttrs)
|
||||||
console->saved_attr = console->attr;
|
console->saved_attr = console->attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
restore_cur(struct console_desc *console, bool restore_attrs)
|
restore_cur(struct console_desc *console, bool restoreAttrs)
|
||||||
{
|
{
|
||||||
console->x = console->saved_x;
|
console->x = console->saved_x;
|
||||||
console->y = console->saved_y;
|
console->y = console->saved_y;
|
||||||
if (restore_attrs)
|
|
||||||
|
if (restoreAttrs)
|
||||||
console->attr = console->saved_attr;
|
console->attr = console->saved_attr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,7 +281,7 @@ console_putch(struct console_desc *console, const char c)
|
|||||||
cr(console);
|
cr(console);
|
||||||
lf(console);
|
lf(console);
|
||||||
}
|
}
|
||||||
console->module->put_glyph(console->x-1, console->y, c, console->attr);
|
console->module->put_glyph(console->x - 1, console->y, c, console->attr);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,7 +344,8 @@ set_vt100_attributes(struct console_desc *console, int32 *args, int32 argCount)
|
|||||||
break;
|
break;
|
||||||
case 7: // reverse
|
case 7: // reverse
|
||||||
console->reverse_attr = true;
|
console->reverse_attr = true;
|
||||||
console->attr = ((console->attr & BMASK) >> 4) | ((console->attr & FMASK) << 4);
|
console->attr = ((console->attr & BMASK) >> 4)
|
||||||
|
| ((console->attr & FMASK) << 4);
|
||||||
if (console->bright_attr)
|
if (console->bright_attr)
|
||||||
console->attr |= 0x08;
|
console->attr |= 0x08;
|
||||||
break;
|
break;
|
||||||
@@ -378,8 +387,9 @@ process_vt100_command(struct console_desc *console, const char c,
|
|||||||
|
|
||||||
if (seenBracket) {
|
if (seenBracket) {
|
||||||
switch(c) {
|
switch(c) {
|
||||||
case 'H': /* set cursor position */
|
case 'H': // set cursor position
|
||||||
case 'f': {
|
case 'f':
|
||||||
|
{
|
||||||
int32 row = argCount > 0 ? args[0] : 1;
|
int32 row = argCount > 0 ? args[0] : 1;
|
||||||
int32 col = argCount > 1 ? args[1] : 1;
|
int32 col = argCount > 1 ? args[1] : 1;
|
||||||
if (row > 0)
|
if (row > 0)
|
||||||
@@ -389,65 +399,73 @@ process_vt100_command(struct console_desc *console, const char c,
|
|||||||
gotoxy(console, col, row);
|
gotoxy(console, col, row);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'A': { /* move up */
|
case 'A': // move up
|
||||||
int32 deltay = argCount > 0 ? -args[0] : -1;
|
{
|
||||||
if (deltay == 0)
|
int32 deltaY = argCount > 0 ? -args[0] : -1;
|
||||||
deltay = -1;
|
if (deltaY == 0)
|
||||||
gotoxy(console, console->x, console->y + deltay);
|
deltaY = -1;
|
||||||
|
gotoxy(console, console->x, console->y + deltaY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'B': { /* move down */
|
case 'B': // move down
|
||||||
int32 deltay = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (deltay == 0)
|
int32 deltaY = argCount > 0 ? args[0] : 1;
|
||||||
deltay = 1;
|
if (deltaY == 0)
|
||||||
gotoxy(console, console->x, console->y + deltay);
|
deltaY = 1;
|
||||||
|
gotoxy(console, console->x, console->y + deltaY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'D': { /* move left */
|
case 'D': // move left
|
||||||
int32 deltax = argCount > 0 ? -args[0] : -1;
|
{
|
||||||
if (deltax == 0)
|
int32 deltaX = argCount > 0 ? -args[0] : -1;
|
||||||
deltax = -1;
|
if (deltaX == 0)
|
||||||
gotoxy(console, console->x + deltax, console->y);
|
deltaX = -1;
|
||||||
|
gotoxy(console, console->x + deltaX, console->y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'a':
|
case 'a':
|
||||||
case 'C': { /* move right */
|
case 'C': // move right
|
||||||
int32 deltax = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (deltax == 0)
|
int32 deltaX = argCount > 0 ? args[0] : 1;
|
||||||
deltax = 1;
|
if (deltaX == 0)
|
||||||
gotoxy(console, console->x + deltax, console->y);
|
deltaX = 1;
|
||||||
|
gotoxy(console, console->x + deltaX, console->y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '`':
|
case '`':
|
||||||
case 'G': { /* set X position */
|
case 'G': // set X position
|
||||||
int32 newx = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (newx > 0)
|
int32 newX = argCount > 0 ? args[0] : 1;
|
||||||
newx--;
|
if (newX > 0)
|
||||||
gotoxy(console, newx, console->y);
|
newX--;
|
||||||
|
gotoxy(console, newX, console->y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'd': { /* set y position */
|
case 'd': // set y position
|
||||||
int32 newy = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (newy > 0)
|
int32 newY = argCount > 0 ? args[0] : 1;
|
||||||
newy--;
|
if (newY > 0)
|
||||||
gotoxy(console, console->x, newy);
|
newY--;
|
||||||
|
gotoxy(console, console->x, newY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 's': /* save current cursor */
|
case 's': // save current cursor
|
||||||
save_cur(console, false);
|
save_cur(console, false);
|
||||||
break;
|
break;
|
||||||
case 'u': /* restore cursor */
|
case 'u': // restore cursor
|
||||||
restore_cur(console, false);
|
restore_cur(console, false);
|
||||||
break;
|
break;
|
||||||
case 'r': { /* set scroll region */
|
case 'r': // set scroll region
|
||||||
|
{
|
||||||
int32 low = argCount > 0 ? args[0] : 1;
|
int32 low = argCount > 0 ? args[0] : 1;
|
||||||
int32 high = argCount > 1 ? args[1] : console->lines;
|
int32 high = argCount > 1 ? args[1] : console->lines;
|
||||||
if (low <= high)
|
if (low <= high)
|
||||||
set_scroll_region(console, low - 1, high - 1);
|
set_scroll_region(console, low - 1, high - 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'L': { /* scroll virtual down at cursor */
|
case 'L': // scroll virtual down at cursor
|
||||||
|
{
|
||||||
int32 lines = argCount > 0 ? args[0] : 1;
|
int32 lines = argCount > 0 ? args[0] : 1;
|
||||||
while (lines > 0) {
|
while (lines > 0) {
|
||||||
scrdown(console);
|
scrdown(console);
|
||||||
@@ -455,7 +473,8 @@ process_vt100_command(struct console_desc *console, const char c,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'M': { /* scroll virtual up at cursor */
|
case 'M': // scroll virtual up at cursor
|
||||||
|
{
|
||||||
int32 lines = argCount > 0 ? args[0] : 1;
|
int32 lines = argCount > 0 ? args[0] : 1;
|
||||||
while (lines > 0) {
|
while (lines > 0) {
|
||||||
scrup(console);
|
scrup(console);
|
||||||
@@ -519,13 +538,13 @@ process_vt100_command(struct console_desc *console, const char c,
|
|||||||
|
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
_console_write(struct console_desc *console, const void *buf, size_t len)
|
_console_write(struct console_desc *console, const void *buffer, size_t length)
|
||||||
{
|
{
|
||||||
const char *c;
|
const char *c;
|
||||||
size_t pos = 0;
|
size_t pos = 0;
|
||||||
|
|
||||||
while (pos < len) {
|
while (pos < length) {
|
||||||
c = &((const char *)buf)[pos++];
|
c = &((const char *)buffer)[pos++];
|
||||||
|
|
||||||
switch (console->state) {
|
switch (console->state) {
|
||||||
case CONSOLE_STATE_NORMAL:
|
case CONSOLE_STATE_NORMAL:
|
||||||
@@ -551,7 +570,7 @@ _console_write(struct console_desc *console, const void *buf, size_t len)
|
|||||||
break;
|
break;
|
||||||
case 0x1b:
|
case 0x1b:
|
||||||
// escape character
|
// escape character
|
||||||
console->arg_count = -1;
|
console->arg_count = 0;
|
||||||
console->state = CONSOLE_STATE_GOT_ESCAPE;
|
console->state = CONSOLE_STATE_GOT_ESCAPE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -559,15 +578,18 @@ _console_write(struct console_desc *console, const void *buf, size_t len)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_STATE_GOT_ESCAPE:
|
case CONSOLE_STATE_GOT_ESCAPE:
|
||||||
// look for either commands with no argument, or the '[' character
|
// Look for either commands with no argument, or the '['
|
||||||
|
// character
|
||||||
switch (*c) {
|
switch (*c) {
|
||||||
case '[':
|
case '[':
|
||||||
console->state = CONSOLE_STATE_SEEN_BRACKET;
|
console->state = CONSOLE_STATE_SEEN_BRACKET;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
console->args[console->arg_count] = 0;
|
console->args[0] = 0;
|
||||||
process_vt100_command(console, *c, false, console->args, console->arg_count + 1);
|
process_vt100_command(console, *c, false, console->args,
|
||||||
|
0);
|
||||||
console->state = CONSOLE_STATE_NORMAL;
|
console->state = CONSOLE_STATE_NORMAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_STATE_SEEN_BRACKET:
|
case CONSOLE_STATE_SEEN_BRACKET:
|
||||||
@@ -578,12 +600,16 @@ _console_write(struct console_desc *console, const void *buf, size_t len)
|
|||||||
console->state = CONSOLE_STATE_PARSING_ARG;
|
console->state = CONSOLE_STATE_PARSING_ARG;
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
// private DEC mode parameter follows - we ignore those anyway
|
// Private DEC mode parameter follows - we ignore those
|
||||||
// ToDo: check if it was really used in combination with a mode command
|
// anyway
|
||||||
|
// TODO: check if it was really used in combination with
|
||||||
|
// a mode command
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
process_vt100_command(console, *c, true, console->args, console->arg_count + 1);
|
process_vt100_command(console, *c, true, console->args,
|
||||||
|
console->arg_count + 1);
|
||||||
console->state = CONSOLE_STATE_NORMAL;
|
console->state = CONSOLE_STATE_NORMAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_STATE_NEW_ARG:
|
case CONSOLE_STATE_NEW_ARG:
|
||||||
@@ -598,8 +624,10 @@ _console_write(struct console_desc *console, const void *buf, size_t len)
|
|||||||
console->state = CONSOLE_STATE_PARSING_ARG;
|
console->state = CONSOLE_STATE_PARSING_ARG;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
process_vt100_command(console, *c, true, console->args, console->arg_count + 1);
|
process_vt100_command(console, *c, true, console->args,
|
||||||
|
console->arg_count + 1);
|
||||||
console->state = CONSOLE_STATE_NORMAL;
|
console->state = CONSOLE_STATE_NORMAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_STATE_PARSING_ARG:
|
case CONSOLE_STATE_PARSING_ARG:
|
||||||
@@ -613,8 +641,10 @@ _console_write(struct console_desc *console, const void *buf, size_t len)
|
|||||||
console->state = CONSOLE_STATE_NEW_ARG;
|
console->state = CONSOLE_STATE_NEW_ARG;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
process_vt100_command(console, *c, true, console->args, console->arg_count + 1);
|
process_vt100_command(console, *c, true, console->args,
|
||||||
|
console->arg_count + 1);
|
||||||
console->state = CONSOLE_STATE_NORMAL;
|
console->state = CONSOLE_STATE_NORMAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -767,7 +797,7 @@ const char **
|
|||||||
publish_devices(void)
|
publish_devices(void)
|
||||||
{
|
{
|
||||||
static const char *devices[] = {
|
static const char *devices[] = {
|
||||||
DEVICE_NAME,
|
DEVICE_NAME,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2005-2008, Axel Dörfler, [email protected]. All rights reserved.
|
* Copyright 2005-2010, Axel Dörfler, [email protected].
|
||||||
* Distributed under the terms of the MIT License.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
|
||||||
|
* Distributed under the terms of the NewOS License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@@ -298,7 +301,8 @@ set_vt100_attributes(int32 *args, int32 argCount)
|
|||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCount)
|
process_vt100_command(const char c, bool seenBracket, int32 *args,
|
||||||
|
int32 argCount)
|
||||||
{
|
{
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
|
||||||
@@ -307,8 +311,9 @@ process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCoun
|
|||||||
|
|
||||||
if (seenBracket) {
|
if (seenBracket) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'H': /* set cursor position */
|
case 'H': // set cursor position
|
||||||
case 'f': {
|
case 'f':
|
||||||
|
{
|
||||||
int32 row = argCount > 0 ? args[0] : 1;
|
int32 row = argCount > 0 ? args[0] : 1;
|
||||||
int32 col = argCount > 1 ? args[1] : 1;
|
int32 col = argCount > 1 ? args[1] : 1;
|
||||||
if (row > 0)
|
if (row > 0)
|
||||||
@@ -318,66 +323,74 @@ process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCoun
|
|||||||
move_cursor(col, row);
|
move_cursor(col, row);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'A': { /* move up */
|
case 'A': // move up
|
||||||
int32 deltay = argCount > 0 ? -args[0] : -1;
|
{
|
||||||
if (deltay == 0)
|
int32 deltaY = argCount > 0 ? -args[0] : -1;
|
||||||
deltay = -1;
|
if (deltaY == 0)
|
||||||
move_cursor(sScreen.x, sScreen.y + deltay);
|
deltaY = -1;
|
||||||
|
move_cursor(sScreen.x, sScreen.y + deltaY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'e':
|
case 'e':
|
||||||
case 'B': { /* move down */
|
case 'B': // move down
|
||||||
int32 deltay = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (deltay == 0)
|
int32 deltaY = argCount > 0 ? args[0] : 1;
|
||||||
deltay = 1;
|
if (deltaY == 0)
|
||||||
move_cursor(sScreen.x, sScreen.y + deltay);
|
deltaY = 1;
|
||||||
|
move_cursor(sScreen.x, sScreen.y + deltaY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'D': { /* move left */
|
case 'D': // move left
|
||||||
int32 deltax = argCount > 0 ? -args[0] : -1;
|
{
|
||||||
if (deltax == 0)
|
int32 deltaX = argCount > 0 ? -args[0] : -1;
|
||||||
deltax = -1;
|
if (deltaX == 0)
|
||||||
move_cursor(sScreen.x + deltax, sScreen.y);
|
deltaX = -1;
|
||||||
|
move_cursor(sScreen.x + deltaX, sScreen.y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'a':
|
case 'a':
|
||||||
case 'C': { /* move right */
|
case 'C': // move right
|
||||||
int32 deltax = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (deltax == 0)
|
int32 deltaX = argCount > 0 ? args[0] : 1;
|
||||||
deltax = 1;
|
if (deltaX == 0)
|
||||||
move_cursor(sScreen.x + deltax, sScreen.y);
|
deltaX = 1;
|
||||||
|
move_cursor(sScreen.x + deltaX, sScreen.y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '`':
|
case '`':
|
||||||
case 'G': { /* set X position */
|
case 'G': // set X position
|
||||||
int32 newx = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (newx > 0)
|
int32 newX = argCount > 0 ? args[0] : 1;
|
||||||
newx--;
|
if (newX > 0)
|
||||||
move_cursor(newx, sScreen.y);
|
newX--;
|
||||||
|
move_cursor(newX, sScreen.y);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'd': { /* set y position */
|
case 'd': // set y position
|
||||||
int32 newy = argCount > 0 ? args[0] : 1;
|
{
|
||||||
if (newy > 0)
|
int32 newY = argCount > 0 ? args[0] : 1;
|
||||||
newy--;
|
if (newY > 0)
|
||||||
move_cursor(sScreen.x, newy);
|
newY--;
|
||||||
|
move_cursor(sScreen.x, newY);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
case 's': /* save current cursor */
|
case 's': // save current cursor
|
||||||
save_cur(console, false);
|
save_cur(console, false);
|
||||||
break;
|
break;
|
||||||
case 'u': /* restore cursor */
|
case 'u': // restore cursor
|
||||||
restore_cur(console, false);
|
restore_cur(console, false);
|
||||||
break;
|
break;
|
||||||
case 'r': { /* set scroll region */
|
case 'r': // set scroll region
|
||||||
|
{
|
||||||
int32 low = argCount > 0 ? args[0] : 1;
|
int32 low = argCount > 0 ? args[0] : 1;
|
||||||
int32 high = argCount > 1 ? args[1] : sScreen.lines;
|
int32 high = argCount > 1 ? args[1] : sScreen.lines;
|
||||||
if (low <= high)
|
if (low <= high)
|
||||||
set_scroll_region(console, low - 1, high - 1);
|
set_scroll_region(console, low - 1, high - 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'L': { /* scroll virtual down at cursor */
|
case 'L': // scroll virtual down at cursor
|
||||||
|
{
|
||||||
int32 lines = argCount > 0 ? args[0] : 1;
|
int32 lines = argCount > 0 ? args[0] : 1;
|
||||||
while (lines > 0) {
|
while (lines > 0) {
|
||||||
scrdown(console);
|
scrdown(console);
|
||||||
@@ -385,7 +398,8 @@ process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCoun
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 'M': { /* scroll virtual up at cursor */
|
case 'M': // scroll virtual up at cursor
|
||||||
|
{
|
||||||
int32 lines = argCount > 0 ? args[0] : 1;
|
int32 lines = argCount > 0 ? args[0] : 1;
|
||||||
while (lines > 0) {
|
while (lines > 0) {
|
||||||
scrup(console);
|
scrup(console);
|
||||||
@@ -467,7 +481,7 @@ parse_character(char c)
|
|||||||
back_space();
|
back_space();
|
||||||
break;
|
break;
|
||||||
case '\t':
|
case '\t':
|
||||||
// ToDo: real tab...
|
// TODO: real tab...
|
||||||
sScreen.x = (sScreen.x + 8) & ~7;
|
sScreen.x = (sScreen.x + 8) & ~7;
|
||||||
if (sScreen.x >= sScreen.columns)
|
if (sScreen.x >= sScreen.columns)
|
||||||
next_line();
|
next_line();
|
||||||
@@ -480,7 +494,7 @@ parse_character(char c)
|
|||||||
|
|
||||||
case 0x1b:
|
case 0x1b:
|
||||||
// escape character
|
// escape character
|
||||||
sScreen.arg_count = -1;
|
sScreen.arg_count = 0;
|
||||||
sScreen.state = CONSOLE_STATE_GOT_ESCAPE;
|
sScreen.state = CONSOLE_STATE_GOT_ESCAPE;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@@ -494,9 +508,8 @@ parse_character(char c)
|
|||||||
sScreen.state = CONSOLE_STATE_SEEN_BRACKET;
|
sScreen.state = CONSOLE_STATE_SEEN_BRACKET;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
sScreen.args[sScreen.arg_count] = 0;
|
sScreen.args[0] = 0;
|
||||||
process_vt100_command(c, false, sScreen.args,
|
process_vt100_command(c, false, sScreen.args, 0);
|
||||||
sScreen.arg_count + 1);
|
|
||||||
sScreen.state = CONSOLE_STATE_NORMAL;
|
sScreen.state = CONSOLE_STATE_NORMAL;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -504,7 +517,7 @@ parse_character(char c)
|
|||||||
switch (c) {
|
switch (c) {
|
||||||
case '0'...'9':
|
case '0'...'9':
|
||||||
sScreen.arg_count = 0;
|
sScreen.arg_count = 0;
|
||||||
sScreen.args[sScreen.arg_count] = c - '0';
|
sScreen.args[0] = c - '0';
|
||||||
sScreen.state = CONSOLE_STATE_PARSING_ARG;
|
sScreen.state = CONSOLE_STATE_PARSING_ARG;
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
@@ -515,13 +528,13 @@ parse_character(char c)
|
|||||||
process_vt100_command(c, true, sScreen.args,
|
process_vt100_command(c, true, sScreen.args,
|
||||||
sScreen.arg_count + 1);
|
sScreen.arg_count + 1);
|
||||||
sScreen.state = CONSOLE_STATE_NORMAL;
|
sScreen.state = CONSOLE_STATE_NORMAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_STATE_NEW_ARG:
|
case CONSOLE_STATE_NEW_ARG:
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '0'...'9':
|
case '0'...'9':
|
||||||
sScreen.arg_count++;
|
if (++sScreen.arg_count == MAX_ARGS) {
|
||||||
if (sScreen.arg_count == MAX_ARGS) {
|
|
||||||
sScreen.state = CONSOLE_STATE_NORMAL;
|
sScreen.state = CONSOLE_STATE_NORMAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -532,6 +545,7 @@ parse_character(char c)
|
|||||||
process_vt100_command(c, true, sScreen.args,
|
process_vt100_command(c, true, sScreen.args,
|
||||||
sScreen.arg_count + 1);
|
sScreen.arg_count + 1);
|
||||||
sScreen.state = CONSOLE_STATE_NORMAL;
|
sScreen.state = CONSOLE_STATE_NORMAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONSOLE_STATE_PARSING_ARG:
|
case CONSOLE_STATE_PARSING_ARG:
|
||||||
@@ -548,6 +562,7 @@ parse_character(char c)
|
|||||||
process_vt100_command(c, true, sScreen.args,
|
process_vt100_command(c, true, sScreen.args,
|
||||||
sScreen.arg_count + 1);
|
sScreen.arg_count + 1);
|
||||||
sScreen.state = CONSOLE_STATE_NORMAL;
|
sScreen.state = CONSOLE_STATE_NORMAL;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user