better parameter checking

This commit is contained in:
Dave Murphy 2014-12-13 02:58:07 +00:00
parent 2de946890d
commit 94591dc5f7

View File

@ -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", &parameter); consumed = 0;
assigned = sscanf(escapeseq,"[%dA%n", &parameter, &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", &parameter); consumed = 0;
currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter; assigned = sscanf(escapeseq,"[%dB%n", &parameter, &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", &parameter); consumed = 0;
currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter; assigned = sscanf(escapeseq,"[%dC%n", &parameter, &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", &parameter); consumed = 0;
currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter; assigned = sscanf(escapeseq,"[%dD%n", &parameter, &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", &currentConsole->cursorY , &currentConsole->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;