static char *sccsid
= "@(#)exp.c 4.1 %G%";
#define IGNORE 1 /* in ignore, it means to ignore value, just parse */
#define NOGLOB 2 /* in ignore, it means not to globone */
register int p1
= exp1(vp
, ignore
);
etraci("exp0 p1", p1
, vp
);
if (**vp
&& eq(**vp
, "||")) {
p2
= exp0(vp
, (ignore
&IGNORE
) || p1
);
etraci("exp0 p2", p2
, vp
);
register int p1
= exp2(vp
, ignore
);
etraci("exp1 p1", p1
, vp
);
if (**vp
&& eq(**vp
, "&&")) {
p2
= exp1(vp
, (ignore
&IGNORE
) || !p1
);
etraci("exp1 p2", p2
, vp
);
register int p1
= exp2a(vp
, ignore
);
etraci("exp3 p1", p1
, vp
);
if (**vp
&& eq(**vp
, "|")) {
etraci("exp3 p2", p2
, vp
);
register int p1
= exp2b(vp
, ignore
);
etraci("exp2a p1", p1
, vp
);
if (**vp
&& eq(**vp
, "^")) {
etraci("exp2a p2", p2
, vp
);
register int p1
= exp2c(vp
, ignore
);
etraci("exp2b p1", p1
, vp
);
if (**vp
&& eq(**vp
, "&")) {
etraci("exp2b p2", p2
, vp
);
register char *p1
= exp3(vp
, ignore
);
etracc("exp2c p1", p1
, vp
);
if (i
= isa(**vp
, EQOP
)) {
if (i
== EQMATCH
|| i
== NOTEQMATCH
)
etracc("exp2c p2", p2
, vp
);
if (!(ignore
&IGNORE
)) switch (i
) {
etracc("exp3 p1", p1
, vp
);
if (i
= isa(**vp
, RELOP
)) {
if (**vp
&& eq(**vp
, "="))
etracc("exp3 p2", p2
, vp
);
if (!(ignore
&IGNORE
)) switch (i
) {
i
= egetn(p1
) > egetn(p2
);
i
= egetn(p1
) >= egetn(p2
);
i
= egetn(p1
) < egetn(p2
);
i
= egetn(p1
) <= egetn(p2
);
register char *p1
, *p2
, *op
;
etracc("exp3a p1", p1
, vp
);
if (op
&& any(op
[0], "<>") && op
[0] == op
[1]) {
etracc("exp3a p2", p2
, vp
);
i
= egetn(p1
) << egetn(p2
);
i
= egetn(p1
) >> egetn(p2
);
etracc("exp4 p1", p1
, vp
);
register char *op
= *(*vp
)++;
etracc("exp4 p2", p2
, vp
);
if (!(ignore
&IGNORE
)) switch (op
[0]) {
i
= egetn(p1
) + egetn(p2
);
i
= egetn(p1
) - egetn(p2
);
etracc("exp5 p1", p1
, vp
);
register char *op
= *(*vp
)++;
etracc("exp5 p2", p2
, vp
);
if (!(ignore
&IGNORE
)) switch (op
[0]) {
i
= egetn(p1
) * egetn(p2
);
register char *cp
, *dp
, *ep
;
etracc("exp6 ! cp", cp
, vp
);
etracc("exp6 ~ cp", cp
, vp
);
ccode
= exp0(vp
, ignore
);
etraci("exp6 () ccode", ccode
, vp
);
if (*vp
== 0 || **vp
== 0 || ***vp
!= ')')
bferr("Expression syntax");
faket
.t_dcar
= faket
.t_dcdr
= faket
.t_dspr
= (struct command
*)0;
if (pfork(&faket
, -1) == 0) {
etraci("exp6 {} status", egetn(value("status")), vp
);
return (putn(egetn(value("status")) == 0));
if (*cp
== '-' && any(cp
[1], "erwxfdzo")) {
bferr("Missing file name");
i
= (stb
.st_mode
& S_IFMT
) == S_IFREG
;
i
= (stb
.st_mode
& S_IFMT
) == S_IFDIR
;
etraci("exp6 -? i", i
, vp
);
etracc("exp6 default", cp
, vp
);
return (ignore
&NOGLOB
? cp
: globone(cp
));
register struct wordent
*hp
= ¶ml
;
register struct wordent
*wdp
= hp
;
hp
->prev
= hp
->next
= hp
;
register struct wordent
*new = (struct wordent
*) calloc(1, sizeof *wdp
);
wdp
->word
= savestr(*v
++);
t
= syntax(paraml
.next
, ¶ml
, 0);
freelex(¶ml
), freesyn(t
);
return ((what
& RESTOP
) != 0);
if ((what
& ADDOP
) && any(cp
[0], "+-"))
if ((what
& MULOP
) && any(cp
[0], "*/%"))
if ((what
& RESTOP
) && any(cp
[0], "()!~^"))
if ((what
& RESTOP
) && (any(cp
[0], "|&") || eq(cp
, "<<") || eq(cp
, ">>")))
if (*cp
&& *cp
!= '-' && !digit(*cp
))
bferr("Expression syntax");
printf("%s=%d\t", str
, i
);
printf("%s=%s\t", str
, cp
);