]> Chaos Git - corbenik/ctrulib.git/commitdiff
better parameter checking
authorDave Murphy <davem@devkitpro.org>
Sat, 13 Dec 2014 02:58:07 +0000 (02:58 +0000)
committerDave Murphy <davem@devkitpro.org>
Sat, 13 Dec 2014 02:58:07 +0000 (02:58 +0000)
libctru/source/console.c

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