// Cursor directional movement\r
//---------------------------------------\r
case 'A':\r
- assigned = sscanf(escapeseq,"[%dA", ¶meter);\r
+ consumed = 0;\r
+ assigned = sscanf(escapeseq,"[%dA%n", ¶meter, &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", ¶meter);\r
- currentConsole->cursorY = (currentConsole->cursorY + parameter) > currentConsole->windowHeight - 1 ? currentConsole->windowHeight - 1 : currentConsole->cursorY + parameter;\r
+ consumed = 0;\r
+ assigned = sscanf(escapeseq,"[%dB%n", ¶meter, &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", ¶meter);\r
- currentConsole->cursorX = (currentConsole->cursorX + parameter) > currentConsole->windowWidth - 1 ? currentConsole->windowWidth - 1 : currentConsole->cursorX + parameter;\r
+ consumed = 0;\r
+ assigned = sscanf(escapeseq,"[%dC%n", ¶meter, &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", ¶meter);\r
- currentConsole->cursorX = (currentConsole->cursorX - parameter) < 0 ? 0 : currentConsole->cursorX - parameter;\r
+ consumed = 0;\r
+ assigned = sscanf(escapeseq,"[%dD%n", ¶meter, &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
//---------------------------------------\r
case 'H':\r
case 'f':\r
- sscanf(escapeseq,"[%d;%df", ¤tConsole->cursorY , ¤tConsole->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
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
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
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