* 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:
Axel Dörfler
2010-08-27 21:36:07 +00:00
parent 882d595fc0
commit 46af4e7787
2 changed files with 171 additions and 126 deletions
+109 -79
View File
@@ -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.
*
* Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
@@ -87,19 +87,19 @@ update_cursor(struct console_desc *console, int x, int y)
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)
new_x = console->columns - 1;
if (new_x < 0)
new_x = 0;
if (new_y >= console->lines)
new_y = console->lines - 1;
if (new_y < 0)
new_y = 0;
if (newX >= console->columns)
newX = console->columns - 1;
if (newX < 0)
newX = 0;
if (newY >= console->lines)
newY = console->lines - 1;
if (newY < 0)
newY = 0;
console->x = new_x;
console->y = new_y;
console->x = newX;
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
scrup(struct console_desc *console)
{
@@ -130,12 +130,14 @@ scrup(struct console_desc *console)
}
// 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
scrdown(struct console_desc *console)
{
@@ -150,7 +152,8 @@ scrdown(struct console_desc *console)
}
// 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) {
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;
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;
case LINE_ERASE_RIGHT:
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);
break;
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;
case SCREEN_ERASE_DOWN:
console->module->fill_glyph(console->y, 0,
console->columns, console->lines - console->y, ' ', console->attr);
console->module->fill_glyph(console->y, 0, console->columns,
console->lines - console->y, ' ', console->attr);
break;
default:
return;
@@ -247,21 +253,23 @@ erase_screen(struct console_desc *console, erase_screen_mode mode)
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_y = console->y;
if (save_attrs)
if (saveAttrs)
console->saved_attr = console->attr;
}
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->y = console->saved_y;
if (restore_attrs)
if (restoreAttrs)
console->attr = console->saved_attr;
}
@@ -273,7 +281,7 @@ console_putch(struct console_desc *console, const char c)
cr(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;
}
@@ -336,7 +344,8 @@ set_vt100_attributes(struct console_desc *console, int32 *args, int32 argCount)
break;
case 7: // reverse
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)
console->attr |= 0x08;
break;
@@ -378,8 +387,9 @@ process_vt100_command(struct console_desc *console, const char c,
if (seenBracket) {
switch(c) {
case 'H': /* set cursor position */
case 'f': {
case 'H': // set cursor position
case 'f':
{
int32 row = argCount > 0 ? args[0] : 1;
int32 col = argCount > 1 ? args[1] : 1;
if (row > 0)
@@ -389,65 +399,73 @@ process_vt100_command(struct console_desc *console, const char c,
gotoxy(console, col, row);
break;
}
case 'A': { /* move up */
int32 deltay = argCount > 0 ? -args[0] : -1;
if (deltay == 0)
deltay = -1;
gotoxy(console, console->x, console->y + deltay);
case 'A': // move up
{
int32 deltaY = argCount > 0 ? -args[0] : -1;
if (deltaY == 0)
deltaY = -1;
gotoxy(console, console->x, console->y + deltaY);
break;
}
case 'e':
case 'B': { /* move down */
int32 deltay = argCount > 0 ? args[0] : 1;
if (deltay == 0)
deltay = 1;
gotoxy(console, console->x, console->y + deltay);
case 'B': // move down
{
int32 deltaY = argCount > 0 ? args[0] : 1;
if (deltaY == 0)
deltaY = 1;
gotoxy(console, console->x, console->y + deltaY);
break;
}
case 'D': { /* move left */
int32 deltax = argCount > 0 ? -args[0] : -1;
if (deltax == 0)
deltax = -1;
gotoxy(console, console->x + deltax, console->y);
case 'D': // move left
{
int32 deltaX = argCount > 0 ? -args[0] : -1;
if (deltaX == 0)
deltaX = -1;
gotoxy(console, console->x + deltaX, console->y);
break;
}
case 'a':
case 'C': { /* move right */
int32 deltax = argCount > 0 ? args[0] : 1;
if (deltax == 0)
deltax = 1;
gotoxy(console, console->x + deltax, console->y);
case 'C': // move right
{
int32 deltaX = argCount > 0 ? args[0] : 1;
if (deltaX == 0)
deltaX = 1;
gotoxy(console, console->x + deltaX, console->y);
break;
}
case '`':
case 'G': { /* set X position */
int32 newx = argCount > 0 ? args[0] : 1;
if (newx > 0)
newx--;
gotoxy(console, newx, console->y);
case 'G': // set X position
{
int32 newX = argCount > 0 ? args[0] : 1;
if (newX > 0)
newX--;
gotoxy(console, newX, console->y);
break;
}
case 'd': { /* set y position */
int32 newy = argCount > 0 ? args[0] : 1;
if (newy > 0)
newy--;
gotoxy(console, console->x, newy);
case 'd': // set y position
{
int32 newY = argCount > 0 ? args[0] : 1;
if (newY > 0)
newY--;
gotoxy(console, console->x, newY);
break;
}
case 's': /* save current cursor */
case 's': // save current cursor
save_cur(console, false);
break;
case 'u': /* restore cursor */
case 'u': // restore cursor
restore_cur(console, false);
break;
case 'r': { /* set scroll region */
case 'r': // set scroll region
{
int32 low = argCount > 0 ? args[0] : 1;
int32 high = argCount > 1 ? args[1] : console->lines;
if (low <= high)
set_scroll_region(console, low - 1, high - 1);
break;
}
case 'L': { /* scroll virtual down at cursor */
case 'L': // scroll virtual down at cursor
{
int32 lines = argCount > 0 ? args[0] : 1;
while (lines > 0) {
scrdown(console);
@@ -455,7 +473,8 @@ process_vt100_command(struct console_desc *console, const char c,
}
break;
}
case 'M': { /* scroll virtual up at cursor */
case 'M': // scroll virtual up at cursor
{
int32 lines = argCount > 0 ? args[0] : 1;
while (lines > 0) {
scrup(console);
@@ -519,13 +538,13 @@ process_vt100_command(struct console_desc *console, const char c,
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;
size_t pos = 0;
while (pos < len) {
c = &((const char *)buf)[pos++];
while (pos < length) {
c = &((const char *)buffer)[pos++];
switch (console->state) {
case CONSOLE_STATE_NORMAL:
@@ -551,7 +570,7 @@ _console_write(struct console_desc *console, const void *buf, size_t len)
break;
case 0x1b:
// escape character
console->arg_count = -1;
console->arg_count = 0;
console->state = CONSOLE_STATE_GOT_ESCAPE;
break;
default:
@@ -559,15 +578,18 @@ _console_write(struct console_desc *console, const void *buf, size_t len)
}
break;
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) {
case '[':
console->state = CONSOLE_STATE_SEEN_BRACKET;
break;
default:
console->args[console->arg_count] = 0;
process_vt100_command(console, *c, false, console->args, console->arg_count + 1);
console->args[0] = 0;
process_vt100_command(console, *c, false, console->args,
0);
console->state = CONSOLE_STATE_NORMAL;
break;
}
break;
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;
break;
case '?':
// private DEC mode parameter follows - we ignore those anyway
// ToDo: check if it was really used in combination with a mode command
// Private DEC mode parameter follows - we ignore those
// anyway
// TODO: check if it was really used in combination with
// a mode command
break;
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;
break;
}
break;
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;
break;
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;
break;
}
break;
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;
break;
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;
break;
}
}
}
@@ -767,7 +797,7 @@ const char **
publish_devices(void)
{
static const char *devices[] = {
DEVICE_NAME,
DEVICE_NAME,
NULL
};
+62 -47
View File
@@ -1,6 +1,9 @@
/*
* Copyright 2005-2008, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
* Copyright 2005-2010, Axel Dörfler, axeld@pinc-software.de.
* 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
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;
@@ -307,8 +311,9 @@ process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCoun
if (seenBracket) {
switch (c) {
case 'H': /* set cursor position */
case 'f': {
case 'H': // set cursor position
case 'f':
{
int32 row = argCount > 0 ? args[0] : 1;
int32 col = argCount > 1 ? args[1] : 1;
if (row > 0)
@@ -318,66 +323,74 @@ process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCoun
move_cursor(col, row);
break;
}
case 'A': { /* move up */
int32 deltay = argCount > 0 ? -args[0] : -1;
if (deltay == 0)
deltay = -1;
move_cursor(sScreen.x, sScreen.y + deltay);
case 'A': // move up
{
int32 deltaY = argCount > 0 ? -args[0] : -1;
if (deltaY == 0)
deltaY = -1;
move_cursor(sScreen.x, sScreen.y + deltaY);
break;
}
case 'e':
case 'B': { /* move down */
int32 deltay = argCount > 0 ? args[0] : 1;
if (deltay == 0)
deltay = 1;
move_cursor(sScreen.x, sScreen.y + deltay);
case 'B': // move down
{
int32 deltaY = argCount > 0 ? args[0] : 1;
if (deltaY == 0)
deltaY = 1;
move_cursor(sScreen.x, sScreen.y + deltaY);
break;
}
case 'D': { /* move left */
int32 deltax = argCount > 0 ? -args[0] : -1;
if (deltax == 0)
deltax = -1;
move_cursor(sScreen.x + deltax, sScreen.y);
case 'D': // move left
{
int32 deltaX = argCount > 0 ? -args[0] : -1;
if (deltaX == 0)
deltaX = -1;
move_cursor(sScreen.x + deltaX, sScreen.y);
break;
}
case 'a':
case 'C': { /* move right */
int32 deltax = argCount > 0 ? args[0] : 1;
if (deltax == 0)
deltax = 1;
move_cursor(sScreen.x + deltax, sScreen.y);
case 'C': // move right
{
int32 deltaX = argCount > 0 ? args[0] : 1;
if (deltaX == 0)
deltaX = 1;
move_cursor(sScreen.x + deltaX, sScreen.y);
break;
}
case '`':
case 'G': { /* set X position */
int32 newx = argCount > 0 ? args[0] : 1;
if (newx > 0)
newx--;
move_cursor(newx, sScreen.y);
case 'G': // set X position
{
int32 newX = argCount > 0 ? args[0] : 1;
if (newX > 0)
newX--;
move_cursor(newX, sScreen.y);
break;
}
case 'd': { /* set y position */
int32 newy = argCount > 0 ? args[0] : 1;
if (newy > 0)
newy--;
move_cursor(sScreen.x, newy);
case 'd': // set y position
{
int32 newY = argCount > 0 ? args[0] : 1;
if (newY > 0)
newY--;
move_cursor(sScreen.x, newY);
break;
}
#if 0
case 's': /* save current cursor */
case 's': // save current cursor
save_cur(console, false);
break;
case 'u': /* restore cursor */
case 'u': // restore cursor
restore_cur(console, false);
break;
case 'r': { /* set scroll region */
case 'r': // set scroll region
{
int32 low = argCount > 0 ? args[0] : 1;
int32 high = argCount > 1 ? args[1] : sScreen.lines;
if (low <= high)
set_scroll_region(console, low - 1, high - 1);
break;
}
case 'L': { /* scroll virtual down at cursor */
case 'L': // scroll virtual down at cursor
{
int32 lines = argCount > 0 ? args[0] : 1;
while (lines > 0) {
scrdown(console);
@@ -385,7 +398,8 @@ process_vt100_command(const char c, bool seenBracket, int32 *args, int32 argCoun
}
break;
}
case 'M': { /* scroll virtual up at cursor */
case 'M': // scroll virtual up at cursor
{
int32 lines = argCount > 0 ? args[0] : 1;
while (lines > 0) {
scrup(console);
@@ -467,7 +481,7 @@ parse_character(char c)
back_space();
break;
case '\t':
// ToDo: real tab...
// TODO: real tab...
sScreen.x = (sScreen.x + 8) & ~7;
if (sScreen.x >= sScreen.columns)
next_line();
@@ -480,7 +494,7 @@ parse_character(char c)
case 0x1b:
// escape character
sScreen.arg_count = -1;
sScreen.arg_count = 0;
sScreen.state = CONSOLE_STATE_GOT_ESCAPE;
break;
default:
@@ -494,9 +508,8 @@ parse_character(char c)
sScreen.state = CONSOLE_STATE_SEEN_BRACKET;
break;
default:
sScreen.args[sScreen.arg_count] = 0;
process_vt100_command(c, false, sScreen.args,
sScreen.arg_count + 1);
sScreen.args[0] = 0;
process_vt100_command(c, false, sScreen.args, 0);
sScreen.state = CONSOLE_STATE_NORMAL;
}
break;
@@ -504,7 +517,7 @@ parse_character(char c)
switch (c) {
case '0'...'9':
sScreen.arg_count = 0;
sScreen.args[sScreen.arg_count] = c - '0';
sScreen.args[0] = c - '0';
sScreen.state = CONSOLE_STATE_PARSING_ARG;
break;
case '?':
@@ -515,13 +528,13 @@ parse_character(char c)
process_vt100_command(c, true, sScreen.args,
sScreen.arg_count + 1);
sScreen.state = CONSOLE_STATE_NORMAL;
break;
}
break;
case CONSOLE_STATE_NEW_ARG:
switch (c) {
case '0'...'9':
sScreen.arg_count++;
if (sScreen.arg_count == MAX_ARGS) {
if (++sScreen.arg_count == MAX_ARGS) {
sScreen.state = CONSOLE_STATE_NORMAL;
break;
}
@@ -532,6 +545,7 @@ parse_character(char c)
process_vt100_command(c, true, sScreen.args,
sScreen.arg_count + 1);
sScreen.state = CONSOLE_STATE_NORMAL;
break;
}
break;
case CONSOLE_STATE_PARSING_ARG:
@@ -548,6 +562,7 @@ parse_character(char c)
process_vt100_command(c, true, sScreen.args,
sScreen.arg_count + 1);
sScreen.state = CONSOLE_STATE_NORMAL;
break;
}
}
}