ref: 08867b3cec6fbc8bc215a1049055e3c65281751c
parent: 9081feab51c8727b81f938d4eeb0c324c18b7a0f
author: ISSOtm <eldredhabert0@gmail.com>
date: Sat Aug 15 11:26:22 EDT 2020
Enable catching invalid macro arg 0
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -725,7 +725,7 @@
distance++;
lexerState->macroArgScanDistance++;
c = peekInternal(distance);
- if (c == '@' || (c >= '1' && c <= '9')) {+ if (c == '@' || (c >= '0' && c <= '9')) {/* Expand the argument and return its first character */
char const *str = expandMacroArg(c, distance - 1);
@@ -1677,9 +1677,11 @@
*/
static int skipIfBlock(bool toEndc)
{+ dbgPrint("Skipping IF block (toEndc = %s)\n", toEndc ? "true" : "false");lexer_SetMode(LEXER_NORMAL);
int startingDepth = nIFDepth;
int token;
+ bool atLineStart = lexerState->atLineStart;
/* Prevent expanding macro args in this state by enabling capture to nothing */
lexerState->capturing = true;
@@ -1687,23 +1689,65 @@
lexerState->captureBuf = NULL;
for (;;) {- bool atLineStart = lexerState->atLineStart;
+ if (atLineStart) {+ int c;
- token = yylex();
- if (token == 0) { /* Pass EOF through */- break;
- } else if (atLineStart && token == T_POP_IF) { /* Increase nesting */- nIFDepth++;
- } else if (atLineStart && nIFDepth == startingDepth) { /* An occasion to finish? */- if (token == T_POP_ENDC || (!toEndc && (token == T_POP_ELIF
- || token == T_POP_ELSE)))
- break;
- } else if (atLineStart && token == T_POP_ENDC) { /* Decrease nesting */- nIFDepth--;
+ for (;;) {+ c = peek(0);
+ if (!isWhitespace(c))
+ break;
+ shiftChars(1);
+ }
+
+ if (startsIdentifier(c)) {+ shiftChars(1);
+ token = readIdentifier(c);
+ switch (token) {+ case T_POP_IF:
+ nIFDepth++;
+ break;
+
+ case T_POP_ELIF:
+ case T_POP_ELSE:
+ if (toEndc) /* Ignore ELIF and ELSE, go to ENDC */
+ break;
+ /* fallthrough */
+ case T_POP_ENDC:
+ if (nIFDepth == startingDepth)
+ goto finish;
+ if (token == T_POP_ENDC)
+ nIFDepth--;
+ }
+ }
+ atLineStart = false;
}
+
+ /* Read chars until EOL */
+ do {+ int c = nextChar();
+
+ if (c == EOF) {+ token = 0;
+ goto finish;
+ } else if (c == '\\') {+ /* Unconditionally skip the next char, including line conts */
+ c = nextChar();
+ } else if (c == '\r' || c == '\n') {+ atLineStart = true;
+ }
+
+ if (c == '\r' || c == '\n')
+ /* Do this both on line continuations and plain EOLs */
+ lexerState->lineNo++;
+ /* Handle CRLF */
+ if (c == '\r' && peek(0) == '\n')
+ shiftChars(1);
+ } while (!atLineStart);
}
+finish:
lexerState->capturing = false;
+ lexerState->atLineStart = false;
return token;
}
--
⑨