better parameter checking
This commit is contained in:
parent
2de946890d
commit
94591dc5f7
@ -225,23 +225,34 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
||||
// Cursor directional movement
|
||||
//---------------------------------------
|
||||
case 'A':
|
||||
assigned = sscanf(escapeseq,"[%dA", ¶meter);
|
||||
consumed = 0;
|
||||
assigned = sscanf(escapeseq,"[%dA%n", ¶meter, &consumed);
|
||||
if (assigned==0) parameter = 1;
|
||||
if (consumed)
|
||||
currentConsole->cursorY = (currentConsole->cursorY - parameter) < 0 ? 0 : currentConsole->cursorY - parameter;
|
||||
escaping = false;
|
||||
break;
|
||||
case 'B':
|
||||
sscanf(escapeseq,"[%dB", ¶meter);
|
||||
consumed = 0;
|
||||
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;
|
||||
break;
|
||||
case 'C':
|
||||
sscanf(escapeseq,"[%dC", ¶meter);
|
||||
consumed = 0;
|
||||
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;
|
||||
break;
|
||||
case 'D':
|
||||
sscanf(escapeseq,"[%dD", ¶meter);
|
||||
consumed = 0;
|
||||
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;
|
||||
break;
|
||||
@ -250,13 +261,49 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
||||
//---------------------------------------
|
||||
case 'H':
|
||||
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;
|
||||
break;
|
||||
}
|
||||
//---------------------------------------
|
||||
// Screen clear
|
||||
//---------------------------------------
|
||||
case 'J':
|
||||
if(escapelen <= 3)
|
||||
consoleCls(escapeseq[escapelen-2]);
|
||||
escaping = false;
|
||||
break;
|
||||
@ -264,6 +311,7 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
||||
// Line clear
|
||||
//---------------------------------------
|
||||
case 'K':
|
||||
if(escapelen <= 3)
|
||||
consoleClearLine(escapeseq[escapelen-2]);
|
||||
escaping = false;
|
||||
break;
|
||||
@ -271,16 +319,20 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
||||
// Save cursor position
|
||||
//---------------------------------------
|
||||
case 's':
|
||||
if(escapelen == 2) {
|
||||
currentConsole->prevCursorX = currentConsole->cursorX ;
|
||||
currentConsole->prevCursorY = currentConsole->cursorY ;
|
||||
}
|
||||
escaping = false;
|
||||
break;
|
||||
//---------------------------------------
|
||||
// Load cursor position
|
||||
//---------------------------------------
|
||||
case 'u':
|
||||
if(escapelen == 2) {
|
||||
currentConsole->cursorX = currentConsole->prevCursorX ;
|
||||
currentConsole->cursorY = currentConsole->prevCursorY ;
|
||||
}
|
||||
escaping = false;
|
||||
break;
|
||||
//---------------------------------------
|
||||
@ -290,11 +342,6 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
||||
escapeseq++;
|
||||
escapelen--;
|
||||
|
||||
if (escapelen == 1) {
|
||||
escaping = false;
|
||||
break;
|
||||
}
|
||||
|
||||
do {
|
||||
parameter = 0;
|
||||
if (escapelen == 1) {
|
||||
@ -308,8 +355,7 @@ ssize_t con_write(struct _reent *r,int fd,const char *ptr, size_t len) {
|
||||
escapeseq += consumed;
|
||||
escapelen -= consumed;
|
||||
|
||||
switch (parameter) {
|
||||
|
||||
switch(parameter) {
|
||||
case 0: // reset
|
||||
currentConsole->flags = 0;
|
||||
currentConsole->bg = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user