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:
parent
8ebe958ddf
commit
c6f7989176
2 changed files with 15 additions and 6 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue