better parameter checking
This commit is contained in:
parent
2de946890d
commit
94591dc5f7
@ -225,24 +225,35 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
|||||||
// Cursor directional movement
|
// Cursor directional movement
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
case 'A':
|
case 'A':
|
||||||
assigned = sscanf(escapeseq,"[%dA", ¶meter);
|
consumed = 0;
|
||||||
|
assigned = sscanf(escapeseq,"[%dA%n", ¶meter, &consumed);
|
||||||
if (assigned==0) parameter = 1;
|
if (assigned==0) parameter = 1;
|
||||||
currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter;
|
if (consumed)
|
||||||
|
currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter;
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
case 'B':
|
case 'B':
|
||||||
sscanf(escapeseq,"[%dB", ¶meter);
|
consumed = 0;
|
||||||
currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter;
|
assigned = sscanf(escapeseq,"[%dB%n", ¶meter, &consumed);
|
||||||
|
if (assigned==0) parameter = 1;
|
||||||
|
if (consumed)
|
||||||
|
currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter;
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
case 'C':
|
case 'C':
|
||||||
sscanf(escapeseq,"[%dC", ¶meter);
|
consumed = 0;
|
||||||
currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter;
|
assigned = sscanf(escapeseq,"[%dC%n", ¶meter, &consumed);
|
||||||
|
if (assigned==0) parameter = 1;
|
||||||
|
if (consumed)
|
||||||
|
currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter;
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
case 'D':
|
case 'D':
|
||||||
sscanf(escapeseq,"[%dD", ¶meter);
|
consumed = 0;
|
||||||
currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter;
|
assigned = sscanf(escapeseq,"[%dD%n", ¶meter, &consumed);
|
||||||
|
if (assigned==0) parameter = 1;
|
||||||
|
if (consumed)
|
||||||
|
currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter;
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
@ -250,37 +261,78 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
|||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
case 'H':
|
case 'H':
|
||||||
case 'f':
|
case 'f':
|
||||||
sscanf(escapeseq,"[%d;%df", ¤tConsole->cursorY , ¤tConsole->cursorX );
|
{
|
||||||
|
int x, y;
|
||||||
|
char c;
|
||||||
|
if(sscanf(escapeseq,"[%d;%d%c", &y, &x, &c) == 3 && (c == 'f' || c == 'H')) {
|
||||||
|
currentConsole->cursorX = x;
|
||||||
|
currentConsole->cursorY = y;
|
||||||
|
escaping = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = y = 1;
|
||||||
|
if(sscanf(escapeseq,"[%d;%c", &y, &c) == 2 && (c == 'f' || c == 'H')) {
|
||||||
|
currentConsole->cursorX = x;
|
||||||
|
currentConsole->cursorY = y;
|
||||||
|
escaping = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = y = 1;
|
||||||
|
if(sscanf(escapeseq,"[;%d%c", &x, &c) == 2 && (c == 'f' || c == 'H')) {
|
||||||
|
currentConsole->cursorX = x;
|
||||||
|
currentConsole->cursorY = y;
|
||||||
|
escaping = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
x = y = 1;
|
||||||
|
if(sscanf(escapeseq,"[;%c", &c) == 1 && (c == 'f' || c == 'H')) {
|
||||||
|
currentConsole->cursorX = x;
|
||||||
|
currentConsole->cursorY = y;
|
||||||
|
escaping = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// invalid format
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Screen clear
|
// Screen clear
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
case 'J':
|
case 'J':
|
||||||
consoleCls(escapeseq[escapelen-2]);
|
if(escapelen <= 3)
|
||||||
|
consoleCls(escapeseq[escapelen-2]);
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Line clear
|
// Line clear
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
case 'K':
|
case 'K':
|
||||||
consoleClearLine(escapeseq[escapelen-2]);
|
if(escapelen <= 3)
|
||||||
|
consoleClearLine(escapeseq[escapelen-2]);
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Save cursor position
|
// Save cursor position
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
case 's':
|
case 's':
|
||||||
currentConsole->prevCursorX = currentConsole->cursorX ;
|
if(escapelen == 2) {
|
||||||
currentConsole->prevCursorY = currentConsole->cursorY ;
|
currentConsole->prevCursorX = currentConsole->cursorX ;
|
||||||
|
currentConsole->prevCursorY = currentConsole->cursorY ;
|
||||||
|
}
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
// Load cursor position
|
// Load cursor position
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
case 'u':
|
case 'u':
|
||||||
currentConsole->cursorX = currentConsole->prevCursorX ;
|
if(escapelen == 2) {
|
||||||
currentConsole->cursorY = currentConsole->prevCursorY ;
|
currentConsole->cursorX = currentConsole->prevCursorX ;
|
||||||
|
currentConsole->cursorY = currentConsole->prevCursorY ;
|
||||||
|
}
|
||||||
escaping = false;
|
escaping = false;
|
||||||
break;
|
break;
|
||||||
//---------------------------------------
|
//---------------------------------------
|
||||||
@ -290,11 +342,6 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
|||||||
escapeseq++;
|
escapeseq++;
|
||||||
escapelen--;
|
escapelen--;
|
||||||
|
|
||||||
if (escapelen == 1) {
|
|
||||||
escaping = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
parameter = 0;
|
parameter = 0;
|
||||||
if (escapelen == 1) {
|
if (escapelen == 1) {
|
||||||
@ -308,8 +355,7 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
|||||||
escapeseq += consumed;
|
escapeseq += consumed;
|
||||||
escapelen -= consumed;
|
escapelen -= consumed;
|
||||||
|
|
||||||
switch (parameter) {
|
switch(parameter) {
|
||||||
|
|
||||||
case 0: // reset
|
case 0: // reset
|
||||||
currentConsole->flags = 0;
|
currentConsole->flags = 0;
|
||||||
currentConsole->bg = 0;
|
currentConsole->bg = 0;
|
||||||
@ -344,10 +390,10 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
|||||||
currentConsole->flags |= CONSOLE_BLINK_FAST;
|
currentConsole->flags |= CONSOLE_BLINK_FAST;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 7: // reverse video
|
case 7: // reverse video
|
||||||
currentConsole->flags |= CONSOLE_COLOR_REVERSE;
|
currentConsole->flags |= CONSOLE_COLOR_REVERSE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 8: // conceal
|
case 8: // conceal
|
||||||
currentConsole->flags |= CONSOLE_CONCEAL;
|
currentConsole->flags |= CONSOLE_CONCEAL;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user