From c6f7989176b9da3b977f397ac4f20bc2f86dec1b Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Sun, 26 Apr 2020 09:32:42 -0700 Subject: [PATCH] copy all the tokens from the tokenrows with a paste. if we do 'CAT(foo bar, baz quux)', the resulting token row should have 3 tokens: 'foo', 'barbaz', 'quux'. tested by jonasa, rebuilding /sys/src, perl, netsurf, and nuklear. --- sys/src/cmd/cpp/macro.c | 16 +++++++++++----- sys/src/cmd/cpp/test.c | 5 ++++- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/sys/src/cmd/cpp/macro.c b/sys/src/cmd/cpp/macro.c index 67af0bd0c..89516a77e 100644 --- a/sys/src/cmd/cpp/macro.c +++ b/sys/src/cmd/cpp/macro.c @@ -350,7 +350,7 @@ ispaste(Tokenrow *rtr, Token **ap, Token **an, int *ntok) void substargs(Nlist *np, Tokenrow *rtr, Tokenrow **atr) { - Tokenrow ttr; + Tokenrow ttr, rp, rn; Token *tp, *ap, *an, *pp, *pn; int ntok, argno, hs; @@ -369,19 +369,25 @@ substargs(Nlist *np, Tokenrow *rtr, Tokenrow **atr) insertrow(rtr, ntok, stringify(atr[argno])); } else if (ispaste(rtr, &ap, &an, &ntok)) { /* first token, just do the next one */ pp = ap; + memset(&rp, 0, sizeof(rp)); pn = an; + memset(&rn, 0, sizeof(rp)); if (ap && (argno = lookuparg(np, ap)) >= 0){ pp = nil; - if(atr[argno]->tp != atr[argno]->lp) - pp = atr[argno]->lp - 1; + rp = *atr[argno]; + if(rp.tp != rp.lp) + pp = --rp.lp; } if (an && (argno = lookuparg(np, an)) >= 0) { pn = nil; - if(atr[argno]->tp != atr[argno]->lp) - pn = atr[argno]->lp - 1; + rn = *atr[argno]; + if(rn.tp != rn.lp) + pn = rn.bp++; } glue(&ttr, pp, pn); + insertrow(rtr, 0, &rp); insertrow(rtr, ntok, &ttr); + insertrow(rtr, 0, &rn); free(ttr.bp); } else if (rtr->tp->type==NAME) { if((argno = lookuparg(np, rtr->tp)) >= 0) { diff --git a/sys/src/cmd/cpp/test.c b/sys/src/cmd/cpp/test.c index 451e364f4..510419050 100644 --- a/sys/src/cmd/cpp/test.c +++ b/sys/src/cmd/cpp/test.c @@ -21,6 +21,9 @@ CAT3(blah) #define FOO CAT(BAR, 3) FOO +/* Expected: a bc d */ +CAT(a b, c d) + /* * CURRENTLY BROKEN: * __VA_ARGS__ requires at least one item. @@ -58,4 +61,4 @@ g(x+(3,4)-w) | h 5) & m * It should treat no args as a single empty arg list. p() i[q()] = { q(1), r(2,3), r(4,), r(,5), r(,) }; char c[2][6] = { str(hello), str() }; -*/ \ No newline at end of file +*/