ref: d51ab3520328fe7bd82f37da276180c3d7d4059d
parent: 3a71910312a58fafb497c50795dede0ae7010b06
author: ISSOtm <[email protected]>
date: Wed Jun 8 20:01:19 EDT 2022
Trim macro arg whitespace after line continuations
--- a/src/asm/lexer.c
+++ b/src/asm/lexer.c
@@ -2052,9 +2052,23 @@
size_t i = 0;
int c;
- /* Trim left whitespace (stops at a block comment or line continuation) */
- while (isWhitespace(peek()))
- shiftChar();
+ /* Trim left whitespace (stops at a block comment) */
+ for (;;) {
+ c = peek();
+ if (isWhitespace(c)) {
+ shiftChar();
+ } else if (c == '\\') {
+ shiftChar();
+ c = peek();
+ // If not a line continuation, handle as a normal char
+ if (!isWhitespace(c) && c != '\n' && c != '\r')
+ goto backslash;
+ // Line continuations count as "whitespace"
+ readLineContinuation();
+ } else {
+ break;
+ }
+ }
for (;;) {
c = peek();
@@ -2103,6 +2117,7 @@
shiftChar();
c = peek();
+backslash:
switch (c) {
case ',': /* Escapes only valid inside a macro arg */
case '(':
--- a/test/asm/macro-arguments.out
+++ b/test/asm/macro-arguments.out
@@ -4,8 +4,8 @@
\1: < 1>
\2: <2>
-'mac c,d':
-\1: < c>
+'mac c,d':
+\1: <c>
\2: <d>
'mac 1,2 + 2,3':
--- /dev/null
+++ b/test/asm/trimmed-macro-args.asm
@@ -1,0 +1,19 @@
+MACRO print_all
+ REPT _NARG
+ PRINTLN "{d:_NARG}: \"\1\""
+ SHIFT
+ ENDR
+ENDM
+
+ print_all a, \
+ b \
+ , c
+
+DEF EMPTY equs ""
+ print_all a, \
+ {EMPTY} b \
+ {EMPTY}, c
+
+ print_all a, \
+ /* . */ b \
+ /* . */, c
--- /dev/null
+++ b/test/asm/trimmed-macro-args.out
@@ -1,0 +1,9 @@
+3: "a"
+2: "b"
+1: "c"
+3: "a"
+2: "b"
+1: "c"
+3: "a"
+2: " b"
+1: "c"