11 #define UNSMARK 0x1000
18 /* conversion types */
26 /* operator priority, arity, and conversion type, indexed by tokentype */
32 { 0, 0, 0 }, /* END */
33 { 0, 0, 0 }, /* UNCLASS */
34 { 0, 0, 0 }, /* NAME */
35 { 0, 0, 0 }, /* NUMBER */
36 { 0, 0, 0 }, /* STRING */
37 { 0, 0, 0 }, /* CCON */
40 { 0, 0, 0 }, /* DSHARP */
41 { 11, 2, RELAT
}, /* EQ */
42 { 11, 2, RELAT
}, /* NEQ */
43 { 12, 2, RELAT
}, /* LEQ */
44 { 12, 2, RELAT
}, /* GEQ */
45 { 13, 2, SHIFT
}, /* LSH */
46 { 13, 2, SHIFT
}, /* RSH */
47 { 7, 2, LOGIC
}, /* LAND */
48 { 6, 2, LOGIC
}, /* LOR */
49 { 0, 0, 0 }, /* PPLUS */
50 { 0, 0, 0 }, /* MMINUS */
51 { 0, 0, 0 }, /* ARROW */
52 { 0, 0, 0 }, /* SBRA */
53 { 0, 0, 0 }, /* SKET */
56 { 0, 0, 0 }, /* DOT */
57 { 10, 2, ARITH
}, /* AND */
58 { 15, 2, ARITH
}, /* STAR */
59 { 14, 2, ARITH
}, /* PLUS */
60 { 14, 2, ARITH
}, /* MINUS */
61 { 16, 1, UNARY
}, /* TILDE */
62 { 16, 1, UNARY
}, /* NOT */
63 { 15, 2, ARITH
}, /* SLASH */
64 { 15, 2, ARITH
}, /* PCT */
65 { 12, 2, RELAT
}, /* LT */
66 { 12, 2, RELAT
}, /* GT */
67 { 9, 2, ARITH
}, /* CIRC */
68 { 8, 2, ARITH
}, /* OR */
69 { 5, 2, SPCL
}, /* QUEST */
70 { 5, 2, SPCL
}, /* COLON */
71 { 0, 0, 0 }, /* ASGN */
72 { 4, 2, 0 }, /* COMMA */
73 { 0, 0, 0 }, /* SHARP */
74 { 0, 0, 0 }, /* SEMIC */
75 { 0, 0, 0 }, /* CBRA */
76 { 0, 0, 0 }, /* CKET */
77 { 0, 0, 0 }, /* ASPLUS */
78 { 0, 0, 0 }, /* ASMINUS */
79 { 0, 0, 0 }, /* ASSTAR */
80 { 0, 0, 0 }, /* ASSLASH */
81 { 0, 0, 0 }, /* ASPCT */
82 { 0, 0, 0 }, /* ASCIRC */
83 { 0, 0, 0 }, /* ASLSH */
84 { 0, 0, 0 }, /* ASRSH */
85 { 0, 0, 0 }, /* ASOR */
86 { 0, 0, 0 }, /* ASAND */
87 { 0, 0, 0 }, /* ELLIPS */
88 { 0, 0, 0 }, /* DSHARP1 */
89 { 0, 0, 0 }, /* NAME1 */
90 { 16, 1, UNARY
}, /* DEFINED */
91 { 16, 0, UNARY
}, /* UMINUS */
94 int evalop(struct pri
);
95 struct value
tokval(Token
*);
96 struct value vals
[NSTAK
], *vp
;
97 enum toktype ops
[NSTAK
], *op
;
100 * Evaluate an #if #elif #ifdef #ifndef line. trp->tp points to the keyword.
103 eval(Tokenrow
*trp
, int kw
)
110 if (kw
==KIFDEF
|| kw
==KIFNDEF
) {
111 if (trp
->lp
- trp
->bp
!= 4 || trp
->tp
->type
!=NAME
) {
112 error(ERROR
, "Syntax error in #ifdef/#ifndef");
115 np
= lookup(trp
->tp
, 0);
116 return (kw
==KIFDEF
) == (np
&& np
->flag
&(ISDEFINED
|ISMAC
));
118 ntok
= trp
->tp
- trp
->bp
;
119 kwdefined
->val
= KDEFINED
; /* activate special meaning of defined */
120 expandrow(trp
, "<if>");
121 kwdefined
->val
= NAME
;
125 for (rand
=0, tp
= trp
->bp
+ntok
; tp
< trp
->lp
; tp
++) {
139 if (vp
== &vals
[NSTAK
]) {
140 error(ERROR
, "Eval botch (stack overflow)");
157 case PLUS
: case MINUS
: case STAR
: case AND
:
161 if (tp
->type
==STAR
|| tp
->type
==AND
) {
162 error(ERROR
, "Illegal operator * or & in #if/#elsif");
170 case EQ
: case NEQ
: case LEQ
: case GEQ
: case LSH
: case RSH
:
171 case LAND
: case LOR
: case SLASH
: case PCT
:
172 case LT
: case GT
: case CIRC
: case OR
: case QUEST
:
173 case COLON
: case COMMA
:
176 if (evalop(priority
[tp
->type
])!=0)
191 if (evalop(priority
[RP
])!=0)
193 if (op
<=ops
|| op
[-1]!=LP
) {
200 error(ERROR
,"Bad operator (%t) in #if/#elsif", tp
);
206 if (evalop(priority
[END
])!=0)
208 if (op
!=&ops
[1] || vp
!=&vals
[1]) {
209 error(ERROR
, "Botch in #if/#elsif");
212 if (vals
[0].type
==UND
)
213 error(ERROR
, "Undefined expression value");
216 error(ERROR
, "Syntax error in #if/#elsif");
221 evalop(struct pri pri
)
229 while (pri
.pri
< priority
[op
[-1]].pri
) {
231 if (priority
[oper
].arity
==2) {
237 /*lint -e574 -e644 */
238 switch (priority
[oper
].ctype
) {
241 error(WARNING
, "Syntax error in #if/#endif");
245 if (v1
.type
==UNS
|| v2
.type
==UNS
)
249 if (v1
.type
==UND
|| v2
.type
==UND
)
251 if (priority
[oper
].ctype
==RELAT
&& rtype
==UNS
) {
257 if (v1
.type
==UND
|| v2
.type
==UND
)
272 case EQ
: case EQ
|UNSMARK
:
273 rv1
= rv1
==rv2
; break;
274 case NEQ
: case NEQ
|UNSMARK
:
275 rv1
= rv1
!=rv2
; break;
277 rv1
= rv1
<=rv2
; break;
279 rv1
= rv1
>=rv2
; break;
281 rv1
= rv1
<rv2
; break;
283 rv1
= rv1
>rv2
; break;
285 rv1
= (unsigned long)rv1
<=rv2
; break;
287 rv1
= (unsigned long)rv1
>=rv2
; break;
289 rv1
= (unsigned long)rv1
<rv2
; break;
291 rv1
= (unsigned long)rv1
>rv2
; break;
295 rv1
= (unsigned long)rv1
<<rv2
; break;
299 rv1
= (unsigned long)rv1
>>rv2
; break;
343 rv1
= !rv1
; if (rtype
!=UND
) rtype
= SGN
; break;
350 rv1
/= (unsigned long)rv2
;
360 rv1
%= (unsigned long)rv2
;
366 error(ERROR
, "Bad ?: in #if/endif");
378 error(ERROR
, "Eval botch (unknown operator)");
381 /*lint +e574 +e644 */
384 if (vp
== &vals
[NSTAK
]) {
385 error(ERROR
, "Eval botch (stack overflow)");
411 if ((np
= lookup(tp
, 0)) != NULL
&& np
->flag
&(ISDEFINED
|ISMAC
))
423 if (p
[1]=='x' || p
[1]=='X') {
430 if ((i
= digit(*p
)) < 0)
434 "Bad digit in number %t", tp
);
438 if (n
>=0x80000000 && base
!=10)
441 if (*p
=='u' || *p
=='U')
443 else if (*p
=='l' || *p
=='L')
447 "Bad number %t in #if/#elsif", tp
);
460 error(WARNING
, "Wide char constant value undefined");
465 if ((i
= digit(*p
))>=0 && i
<=7) {
468 if ((i
= digit(*p
))>=0 && i
<=7) {
472 if ((i
= digit(*p
))>=0 && i
<=7) {
478 } else if (*p
=='x') {
480 while ((i
= digit(*p
))>=0 && i
<=15) {
487 = "b\bf\fn\nr\rt\tv\v''\"\"??\\\\";
488 for (i
=0; i
<sizeof(cvcon
); i
+=2) {
489 if (*p
== cvcon
[i
]) {
495 if (i
>=sizeof(cvcon
))
497 "Undefined escape in character constant");
500 error(ERROR
, "Empty character constant");
504 error(WARNING
, "Multibyte character constant undefined");
506 error(WARNING
, "Character constant taken as not signed");
511 error(ERROR
, "String in #if/#elsif");
520 if ('0'<=i
&& i
<='9')
522 else if ('a'<=i
&& i
<='f')
524 else if ('A'<=i
&& i
<='F')