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.
This commit is contained in:
Ori Bernstein 2020-04-26 09:32:42 -07:00
parent 8ebe958ddf
commit c6f7989176
2 changed files with 15 additions and 6 deletions

View file

@ -350,7 +350,7 @@ ispaste(Tokenrow *rtr, Token **ap, Token **an, int *ntok)
void void
substargs(Nlist *np, Tokenrow *rtr, Tokenrow **atr) substargs(Nlist *np, Tokenrow *rtr, Tokenrow **atr)
{ {
Tokenrow ttr; Tokenrow ttr, rp, rn;
Token *tp, *ap, *an, *pp, *pn; Token *tp, *ap, *an, *pp, *pn;
int ntok, argno, hs; int ntok, argno, hs;
@ -369,19 +369,25 @@ substargs(Nlist *np, Tokenrow *rtr, Tokenrow **atr)
insertrow(rtr, ntok, stringify(atr[argno])); insertrow(rtr, ntok, stringify(atr[argno]));
} else if (ispaste(rtr, &ap, &an, &ntok)) { /* first token, just do the next one */ } else if (ispaste(rtr, &ap, &an, &ntok)) { /* first token, just do the next one */
pp = ap; pp = ap;
memset(&rp, 0, sizeof(rp));
pn = an; pn = an;
memset(&rn, 0, sizeof(rp));
if (ap && (argno = lookuparg(np, ap)) >= 0){ if (ap && (argno = lookuparg(np, ap)) >= 0){
pp = nil; pp = nil;
if(atr[argno]->tp != atr[argno]->lp) rp = *atr[argno];
pp = atr[argno]->lp - 1; if(rp.tp != rp.lp)
pp = --rp.lp;
} }
if (an && (argno = lookuparg(np, an)) >= 0) { if (an && (argno = lookuparg(np, an)) >= 0) {
pn = nil; pn = nil;
if(atr[argno]->tp != atr[argno]->lp) rn = *atr[argno];
pn = atr[argno]->lp - 1; if(rn.tp != rn.lp)
pn = rn.bp++;
} }
glue(&ttr, pp, pn); glue(&ttr, pp, pn);
insertrow(rtr, 0, &rp);
insertrow(rtr, ntok, &ttr); insertrow(rtr, ntok, &ttr);
insertrow(rtr, 0, &rn);
free(ttr.bp); free(ttr.bp);
} else if (rtr->tp->type==NAME) { } else if (rtr->tp->type==NAME) {
if((argno = lookuparg(np, rtr->tp)) >= 0) { if((argno = lookuparg(np, rtr->tp)) >= 0) {

View file

@ -21,6 +21,9 @@ CAT3(blah)
#define FOO CAT(BAR, 3) #define FOO CAT(BAR, 3)
FOO FOO
/* Expected: a bc d */
CAT(a b, c d)
/* /*
* CURRENTLY BROKEN: * CURRENTLY BROKEN:
* __VA_ARGS__ requires at least one item. * __VA_ARGS__ requires at least one item.