aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--c/lex.c42
1 files changed, 15 insertions, 27 deletions
diff --git a/c/lex.c b/c/lex.c
index 4312b15..00aaacc 100644
--- a/c/lex.c
+++ b/c/lex.c
@@ -1089,8 +1089,7 @@ expandfnmacro(struct lexer *lx, struct span *span, struct macro *mac)
.macno = mac - macros.p,
});
} else if (mac->nparam) { /* make new rlist with args replaced */
- struct token lhsargforpaste;
- bool lhsargpaste = 0, rhsargpaste = 0;
+ bool rhsargpaste = 0;
for (int i = 0; i < mac->rlist.n; ++i) {
struct argtks *arg;
tk = mac->rlist.tk[i];
@@ -1103,18 +1102,18 @@ expandfnmacro(struct lexer *lx, struct span *span, struct macro *mac)
/* trivial case should have been handled when defining */
assert(0 && "## ?");
} else if (rhs->t != TKPPMACARG) {
- assert(lhsargpaste);
- if (tokpaste(lx, &new, &lhsargforpaste, rhs)) {
- vpush(&rlist2, new);
+ if (rlist2.n == 0) {
+ vpush(&rlist2, *rhs);
++i;
- continue;
+ } else {
+ lhs = &rlist2.p[rlist2.n-1];
+ if (tokpaste(lx, &new, lhs, rhs)) {
+ rlist2.p[rlist2.n-1] = new;
+ ++i;
+ }
}
- lhsargpaste = 0;
+ continue;
} else {
- if (lhs->t != TKPPMACARG) {
- --rlist2.n;
- lhsargforpaste = *lhs;
- }
rhsargpaste = 1;
continue;
}
@@ -1128,40 +1127,29 @@ expandfnmacro(struct lexer *lx, struct span *span, struct macro *mac)
arg = &args[tk.argidx];
if (tk.t == TKPPMACARG) {
struct macrostack *l;
- lhsargpaste = i < mac->rlist.n-1 && mac->rlist.tk[i+1].t == TKPPCAT;
if (arg->n == 0) {
- if (rhsargpaste) {
- rhsargpaste = 0;
- if (!lhsargpaste && lhsargforpaste.t) {
- vpush(&rlist2, lhsargforpaste);
- }
- } else if (lhsargpaste) {
- lhsargforpaste.t = 0;
- lhsargforpaste.span = tk.span;
- }
+ rhsargpaste = 0;
continue;
}
pushmacstk(lx, &tk.span, &(struct macrostack) {
- .rlist = {argsbuf.p + arg->idx, arg->n - lhsargpaste},
+ .rlist = {argsbuf.p + arg->idx, arg->n},
.macno = -1,
.idx = 0,
.stop = 1,
});
l = lx->macstk;
- if (rhsargpaste) {
+ if (rhsargpaste && rlist2.n > 0) {
struct token new;
rhsargpaste = 0;
- if (tokpaste(lx, &new, &lhsargforpaste, &l->rlist.tk[0])) {
+ if (tokpaste(lx, &new, &rlist2.p[rlist2.n-1], &l->rlist.tk[0])) {
l->idx = 1;
- vpush(&rlist2, new);
+ rlist2.p[rlist2.n-1] = new;
}
}
while (lex(lx, &tk) != TKEOF)
vpush(&rlist2, tk);
assert(lx->macstk == l);
popmac(lx);
- if (lhsargpaste)
- lhsargforpaste = argsbuf.p[arg->idx + arg->n-1];
} else { /* PPMACSTR */
char tmp[100];
struct wbuf buf = MEMBUF(tmp, sizeof tmp);