static char sccsid
[] = "@(#)macro.c 4.4 %G%";
* Bell Telephone Laboratories
LOCAL CHAR quote
; /* used locally */
LOCAL CHAR quoted
; /* used locally */
LOCAL STRING
copyto(endch
)
WHILE (c
=getch(endch
))!=endch ANDF c
IF c
!=endch THEN
error(badsub
) FI
WHILE (c
=readc()) ANDF c
!=endch
case SQUOTE
: skipto(SQUOTE
); break;
case DQUOTE
: skipto(DQUOTE
); break;
case DOLLAR
: IF
readc()==BRACE
IF c
!=endch THEN
error(badsub
) FI
IF (c
=readc(), dolchar(c
))
IF bra
=(c
==BRACE
) THEN c
=readc() FI
WHILE
alphanum(c
) DO
pushstak(c
); c
=readc() OD
n
=lookup(absstak(argp
)); setstak(argp
);
v
= n
->namval
; id
= n
->namid
;
v
=((c
==0) ? cmdadr
: (c
<=dolc
) ? dolv
[c
] : (STRING
)(dolg
=0));
ELIF bra THEN
error(badsub
);
ELSE peekc
= c
|MARK
; c
= 0;
IF dolg
==0 ORF (++dolg
>dolc
)
ELSE v
=dolv
[dolg
]; pushstak(SP
|(*id
=='*' ? quote
: 0));
THEN
failed(id
,*argp
?argp
:badparam
);
THEN
failed(id
,badparam
);
THEN
comsubst(); goto retry
;
THEN quoted
++; quote
^=QUOTE
; goto retry
;
/* Strip "" and do $ substitution
* Leaves result on top of stack
IF quoted
ANDF (stakbot
==staktop
) THEN
pushstak(QUOTE
) FI
quote
=savq
; quoted
=savqu
;
REG STKPTR savptr
= fixstak();
WHILE (d
=readc())!=SQUOTE ANDF d
REG TREPTR t
= makefork(FPOU
,cmd(EOFSYM
,MTFLG
|NLFLG
));
/* this is done like this so that the pipe
* is open only when needed
tdystak(savptr
); staktop
=movstr(savptr
,stakbot
);
WHILE d
=readc() DO
locstak(); pushstak(d
|quote
) OD
DO
IF (*--staktop
&STRIP
)!=NL
/* DQUOTE used to stop it from quoting */
WHILE c
=(getch(DQUOTE
)&STRIP
)
THEN
flush(ot
); count
=CPYSIZ
;
write(ot
,stakbot
,staktop
-stakbot
);
IF flags
&execpr THEN
write(output
,stakbot
,staktop
-stakbot
) FI