impl: add {pre,post}_assert statements
[m6w6/ext-psi] / src / token_oper_cmp.h
1 /*******************************************************************************
2 Copyright (c) 2016, Michael Wallner <mike@php.net>.
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7
8 * Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *******************************************************************************/
25
26 static inline int psi_token_oper_cmp(token_t op1, token_t op2) {
27 switch (op1) {
28 case PSI_T_NOT:
29 switch (op2) {
30 case PSI_T_NOT: return 0;
31 case PSI_T_TILDE: return 0;
32 case PSI_T_ASTERISK: return -1;
33 case PSI_T_SLASH: return -1;
34 case PSI_T_MODULO: return -1;
35 case PSI_T_PLUS: return -1;
36 case PSI_T_MINUS: return -1;
37 case PSI_T_LSHIFT: return -1;
38 case PSI_T_RSHIFT: return -1;
39 case PSI_T_LCHEVR: return -1;
40 case PSI_T_CMP_LE: return -1;
41 case PSI_T_RCHEVR: return -1;
42 case PSI_T_CMP_GE: return -1;
43 case PSI_T_AMPERSAND: return -1;
44 case PSI_T_CMP_EQ: return -1;
45 case PSI_T_CMP_NE: return -1;
46 case PSI_T_CARET: return -1;
47 case PSI_T_PIPE: return -1;
48 case PSI_T_AND: return -1;
49 case PSI_T_OR: return -1;
50 }
51 assert(0);
52 break;
53 case PSI_T_TILDE:
54 switch (op2) {
55 case PSI_T_NOT: return 0;
56 case PSI_T_TILDE: return 0;
57 case PSI_T_ASTERISK: return -1;
58 case PSI_T_SLASH: return -1;
59 case PSI_T_MODULO: return -1;
60 case PSI_T_PLUS: return -1;
61 case PSI_T_MINUS: return -1;
62 case PSI_T_LSHIFT: return -1;
63 case PSI_T_RSHIFT: return -1;
64 case PSI_T_LCHEVR: return -1;
65 case PSI_T_CMP_LE: return -1;
66 case PSI_T_RCHEVR: return -1;
67 case PSI_T_CMP_GE: return -1;
68 case PSI_T_AMPERSAND: return -1;
69 case PSI_T_CMP_EQ: return -1;
70 case PSI_T_CMP_NE: return -1;
71 case PSI_T_CARET: return -1;
72 case PSI_T_PIPE: return -1;
73 case PSI_T_AND: return -1;
74 case PSI_T_OR: return -1;
75 }
76 assert(0);
77 break;
78 case PSI_T_ASTERISK:
79 switch (op2) {
80 case PSI_T_NOT: return 1;
81 case PSI_T_TILDE: return 1;
82 case PSI_T_ASTERISK: return 0;
83 case PSI_T_SLASH: return 0;
84 case PSI_T_MODULO: return 0;
85 case PSI_T_PLUS: return -1;
86 case PSI_T_MINUS: return -1;
87 case PSI_T_LSHIFT: return -1;
88 case PSI_T_RSHIFT: return -1;
89 case PSI_T_LCHEVR: return -1;
90 case PSI_T_CMP_LE: return -1;
91 case PSI_T_RCHEVR: return -1;
92 case PSI_T_CMP_GE: return -1;
93 case PSI_T_AMPERSAND: return -1;
94 case PSI_T_CMP_EQ: return -1;
95 case PSI_T_CMP_NE: return -1;
96 case PSI_T_CARET: return -1;
97 case PSI_T_PIPE: return -1;
98 case PSI_T_AND: return -1;
99 case PSI_T_OR: return -1;
100 }
101 assert(0);
102 break;
103 case PSI_T_SLASH:
104 switch (op2) {
105 case PSI_T_NOT: return 1;
106 case PSI_T_TILDE: return 1;
107 case PSI_T_ASTERISK: return 0;
108 case PSI_T_SLASH: return 0;
109 case PSI_T_MODULO: return 0;
110 case PSI_T_PLUS: return -1;
111 case PSI_T_MINUS: return -1;
112 case PSI_T_LSHIFT: return -1;
113 case PSI_T_RSHIFT: return -1;
114 case PSI_T_LCHEVR: return -1;
115 case PSI_T_CMP_LE: return -1;
116 case PSI_T_RCHEVR: return -1;
117 case PSI_T_CMP_GE: return -1;
118 case PSI_T_AMPERSAND: return -1;
119 case PSI_T_CMP_EQ: return -1;
120 case PSI_T_CMP_NE: return -1;
121 case PSI_T_CARET: return -1;
122 case PSI_T_PIPE: return -1;
123 case PSI_T_AND: return -1;
124 case PSI_T_OR: return -1;
125 }
126 assert(0);
127 break;
128 case PSI_T_MODULO:
129 switch (op2) {
130 case PSI_T_NOT: return 1;
131 case PSI_T_TILDE: return 1;
132 case PSI_T_ASTERISK: return 0;
133 case PSI_T_SLASH: return 0;
134 case PSI_T_MODULO: return 0;
135 case PSI_T_PLUS: return -1;
136 case PSI_T_MINUS: return -1;
137 case PSI_T_LSHIFT: return -1;
138 case PSI_T_RSHIFT: return -1;
139 case PSI_T_LCHEVR: return -1;
140 case PSI_T_CMP_LE: return -1;
141 case PSI_T_RCHEVR: return -1;
142 case PSI_T_CMP_GE: return -1;
143 case PSI_T_AMPERSAND: return -1;
144 case PSI_T_CMP_EQ: return -1;
145 case PSI_T_CMP_NE: return -1;
146 case PSI_T_CARET: return -1;
147 case PSI_T_PIPE: return -1;
148 case PSI_T_AND: return -1;
149 case PSI_T_OR: return -1;
150 }
151 assert(0);
152 break;
153 case PSI_T_PLUS:
154 switch (op2) {
155 case PSI_T_NOT: return 1;
156 case PSI_T_TILDE: return 1;
157 case PSI_T_ASTERISK: return 1;
158 case PSI_T_SLASH: return 1;
159 case PSI_T_MODULO: return 1;
160 case PSI_T_PLUS: return 0;
161 case PSI_T_MINUS: return 0;
162 case PSI_T_LSHIFT: return -1;
163 case PSI_T_RSHIFT: return -1;
164 case PSI_T_LCHEVR: return -1;
165 case PSI_T_CMP_LE: return -1;
166 case PSI_T_RCHEVR: return -1;
167 case PSI_T_CMP_GE: return -1;
168 case PSI_T_AMPERSAND: return -1;
169 case PSI_T_CMP_EQ: return -1;
170 case PSI_T_CMP_NE: return -1;
171 case PSI_T_CARET: return -1;
172 case PSI_T_PIPE: return -1;
173 case PSI_T_AND: return -1;
174 case PSI_T_OR: return -1;
175 }
176 assert(0);
177 break;
178 case PSI_T_MINUS:
179 switch (op2) {
180 case PSI_T_NOT: return 1;
181 case PSI_T_TILDE: return 1;
182 case PSI_T_ASTERISK: return 1;
183 case PSI_T_SLASH: return 1;
184 case PSI_T_MODULO: return 1;
185 case PSI_T_PLUS: return 0;
186 case PSI_T_MINUS: return 0;
187 case PSI_T_LSHIFT: return -1;
188 case PSI_T_RSHIFT: return -1;
189 case PSI_T_LCHEVR: return -1;
190 case PSI_T_CMP_LE: return -1;
191 case PSI_T_RCHEVR: return -1;
192 case PSI_T_CMP_GE: return -1;
193 case PSI_T_AMPERSAND: return -1;
194 case PSI_T_CMP_EQ: return -1;
195 case PSI_T_CMP_NE: return -1;
196 case PSI_T_CARET: return -1;
197 case PSI_T_PIPE: return -1;
198 case PSI_T_AND: return -1;
199 case PSI_T_OR: return -1;
200 }
201 assert(0);
202 break;
203 case PSI_T_LSHIFT:
204 switch (op2) {
205 case PSI_T_NOT: return 1;
206 case PSI_T_TILDE: return 1;
207 case PSI_T_ASTERISK: return 1;
208 case PSI_T_SLASH: return 1;
209 case PSI_T_MODULO: return 1;
210 case PSI_T_PLUS: return 1;
211 case PSI_T_MINUS: return 1;
212 case PSI_T_LSHIFT: return 0;
213 case PSI_T_RSHIFT: return 0;
214 case PSI_T_LCHEVR: return -1;
215 case PSI_T_CMP_LE: return -1;
216 case PSI_T_RCHEVR: return -1;
217 case PSI_T_CMP_GE: return -1;
218 case PSI_T_AMPERSAND: return -1;
219 case PSI_T_CMP_EQ: return -1;
220 case PSI_T_CMP_NE: return -1;
221 case PSI_T_CARET: return -1;
222 case PSI_T_PIPE: return -1;
223 case PSI_T_AND: return -1;
224 case PSI_T_OR: return -1;
225 }
226 assert(0);
227 break;
228 case PSI_T_RSHIFT:
229 switch (op2) {
230 case PSI_T_NOT: return 1;
231 case PSI_T_TILDE: return 1;
232 case PSI_T_ASTERISK: return 1;
233 case PSI_T_SLASH: return 1;
234 case PSI_T_MODULO: return 1;
235 case PSI_T_PLUS: return 1;
236 case PSI_T_MINUS: return 1;
237 case PSI_T_LSHIFT: return 0;
238 case PSI_T_RSHIFT: return 0;
239 case PSI_T_LCHEVR: return -1;
240 case PSI_T_CMP_LE: return -1;
241 case PSI_T_RCHEVR: return -1;
242 case PSI_T_CMP_GE: return -1;
243 case PSI_T_AMPERSAND: return -1;
244 case PSI_T_CMP_EQ: return -1;
245 case PSI_T_CMP_NE: return -1;
246 case PSI_T_CARET: return -1;
247 case PSI_T_PIPE: return -1;
248 case PSI_T_AND: return -1;
249 case PSI_T_OR: return -1;
250 }
251 assert(0);
252 break;
253 case PSI_T_LCHEVR:
254 switch (op2) {
255 case PSI_T_NOT: return 1;
256 case PSI_T_TILDE: return 1;
257 case PSI_T_ASTERISK: return 1;
258 case PSI_T_SLASH: return 1;
259 case PSI_T_MODULO: return 1;
260 case PSI_T_PLUS: return 1;
261 case PSI_T_MINUS: return 1;
262 case PSI_T_LSHIFT: return 1;
263 case PSI_T_RSHIFT: return 1;
264 case PSI_T_LCHEVR: return 0;
265 case PSI_T_CMP_LE: return 0;
266 case PSI_T_RCHEVR: return 0;
267 case PSI_T_CMP_GE: return 0;
268 case PSI_T_AMPERSAND: return -1;
269 case PSI_T_CMP_EQ: return -1;
270 case PSI_T_CMP_NE: return -1;
271 case PSI_T_CARET: return -1;
272 case PSI_T_PIPE: return -1;
273 case PSI_T_AND: return -1;
274 case PSI_T_OR: return -1;
275 }
276 assert(0);
277 break;
278 case PSI_T_CMP_LE:
279 switch (op2) {
280 case PSI_T_NOT: return 1;
281 case PSI_T_TILDE: return 1;
282 case PSI_T_ASTERISK: return 1;
283 case PSI_T_SLASH: return 1;
284 case PSI_T_MODULO: return 1;
285 case PSI_T_PLUS: return 1;
286 case PSI_T_MINUS: return 1;
287 case PSI_T_LSHIFT: return 1;
288 case PSI_T_RSHIFT: return 1;
289 case PSI_T_LCHEVR: return 0;
290 case PSI_T_CMP_LE: return 0;
291 case PSI_T_RCHEVR: return 0;
292 case PSI_T_CMP_GE: return 0;
293 case PSI_T_AMPERSAND: return -1;
294 case PSI_T_CMP_EQ: return -1;
295 case PSI_T_CMP_NE: return -1;
296 case PSI_T_CARET: return -1;
297 case PSI_T_PIPE: return -1;
298 case PSI_T_AND: return -1;
299 case PSI_T_OR: return -1;
300 }
301 assert(0);
302 break;
303 case PSI_T_RCHEVR:
304 switch (op2) {
305 case PSI_T_NOT: return 1;
306 case PSI_T_TILDE: return 1;
307 case PSI_T_ASTERISK: return 1;
308 case PSI_T_SLASH: return 1;
309 case PSI_T_MODULO: return 1;
310 case PSI_T_PLUS: return 1;
311 case PSI_T_MINUS: return 1;
312 case PSI_T_LSHIFT: return 1;
313 case PSI_T_RSHIFT: return 1;
314 case PSI_T_LCHEVR: return 0;
315 case PSI_T_CMP_LE: return 0;
316 case PSI_T_RCHEVR: return 0;
317 case PSI_T_CMP_GE: return 0;
318 case PSI_T_AMPERSAND: return -1;
319 case PSI_T_CMP_EQ: return -1;
320 case PSI_T_CMP_NE: return -1;
321 case PSI_T_CARET: return -1;
322 case PSI_T_PIPE: return -1;
323 case PSI_T_AND: return -1;
324 case PSI_T_OR: return -1;
325 }
326 assert(0);
327 break;
328 case PSI_T_CMP_GE:
329 switch (op2) {
330 case PSI_T_NOT: return 1;
331 case PSI_T_TILDE: return 1;
332 case PSI_T_ASTERISK: return 1;
333 case PSI_T_SLASH: return 1;
334 case PSI_T_MODULO: return 1;
335 case PSI_T_PLUS: return 1;
336 case PSI_T_MINUS: return 1;
337 case PSI_T_LSHIFT: return 1;
338 case PSI_T_RSHIFT: return 1;
339 case PSI_T_LCHEVR: return 0;
340 case PSI_T_CMP_LE: return 0;
341 case PSI_T_RCHEVR: return 0;
342 case PSI_T_CMP_GE: return 0;
343 case PSI_T_AMPERSAND: return -1;
344 case PSI_T_CMP_EQ: return -1;
345 case PSI_T_CMP_NE: return -1;
346 case PSI_T_CARET: return -1;
347 case PSI_T_PIPE: return -1;
348 case PSI_T_AND: return -1;
349 case PSI_T_OR: return -1;
350 }
351 assert(0);
352 break;
353 case PSI_T_AMPERSAND:
354 switch (op2) {
355 case PSI_T_NOT: return 1;
356 case PSI_T_TILDE: return 1;
357 case PSI_T_ASTERISK: return 1;
358 case PSI_T_SLASH: return 1;
359 case PSI_T_MODULO: return 1;
360 case PSI_T_PLUS: return 1;
361 case PSI_T_MINUS: return 1;
362 case PSI_T_LSHIFT: return 1;
363 case PSI_T_RSHIFT: return 1;
364 case PSI_T_LCHEVR: return 1;
365 case PSI_T_CMP_LE: return 1;
366 case PSI_T_RCHEVR: return 1;
367 case PSI_T_CMP_GE: return 1;
368 case PSI_T_AMPERSAND: return 0;
369 case PSI_T_CMP_EQ: return -1;
370 case PSI_T_CMP_NE: return -1;
371 case PSI_T_CARET: return -1;
372 case PSI_T_PIPE: return -1;
373 case PSI_T_AND: return -1;
374 case PSI_T_OR: return -1;
375 }
376 assert(0);
377 break;
378 case PSI_T_CMP_EQ:
379 switch (op2) {
380 case PSI_T_NOT: return 1;
381 case PSI_T_TILDE: return 1;
382 case PSI_T_ASTERISK: return 1;
383 case PSI_T_SLASH: return 1;
384 case PSI_T_MODULO: return 1;
385 case PSI_T_PLUS: return 1;
386 case PSI_T_MINUS: return 1;
387 case PSI_T_LSHIFT: return 1;
388 case PSI_T_RSHIFT: return 1;
389 case PSI_T_LCHEVR: return 1;
390 case PSI_T_CMP_LE: return 1;
391 case PSI_T_RCHEVR: return 1;
392 case PSI_T_CMP_GE: return 1;
393 case PSI_T_AMPERSAND: return 1;
394 case PSI_T_CMP_EQ: return 0;
395 case PSI_T_CMP_NE: return 0;
396 case PSI_T_CARET: return -1;
397 case PSI_T_PIPE: return -1;
398 case PSI_T_AND: return -1;
399 case PSI_T_OR: return -1;
400 }
401 assert(0);
402 break;
403 case PSI_T_CMP_NE:
404 switch (op2) {
405 case PSI_T_NOT: return 1;
406 case PSI_T_TILDE: return 1;
407 case PSI_T_ASTERISK: return 1;
408 case PSI_T_SLASH: return 1;
409 case PSI_T_MODULO: return 1;
410 case PSI_T_PLUS: return 1;
411 case PSI_T_MINUS: return 1;
412 case PSI_T_LSHIFT: return 1;
413 case PSI_T_RSHIFT: return 1;
414 case PSI_T_LCHEVR: return 1;
415 case PSI_T_CMP_LE: return 1;
416 case PSI_T_RCHEVR: return 1;
417 case PSI_T_CMP_GE: return 1;
418 case PSI_T_AMPERSAND: return 1;
419 case PSI_T_CMP_EQ: return 0;
420 case PSI_T_CMP_NE: return 0;
421 case PSI_T_CARET: return -1;
422 case PSI_T_PIPE: return -1;
423 case PSI_T_AND: return -1;
424 case PSI_T_OR: return -1;
425 }
426 assert(0);
427 break;
428 case PSI_T_CARET:
429 switch (op2) {
430 case PSI_T_NOT: return 1;
431 case PSI_T_TILDE: return 1;
432 case PSI_T_ASTERISK: return 1;
433 case PSI_T_SLASH: return 1;
434 case PSI_T_MODULO: return 1;
435 case PSI_T_PLUS: return 1;
436 case PSI_T_MINUS: return 1;
437 case PSI_T_LSHIFT: return 1;
438 case PSI_T_RSHIFT: return 1;
439 case PSI_T_LCHEVR: return 1;
440 case PSI_T_CMP_LE: return 1;
441 case PSI_T_RCHEVR: return 1;
442 case PSI_T_CMP_GE: return 1;
443 case PSI_T_AMPERSAND: return 1;
444 case PSI_T_CMP_EQ: return 1;
445 case PSI_T_CMP_NE: return 1;
446 case PSI_T_CARET: return 0;
447 case PSI_T_PIPE: return -1;
448 case PSI_T_AND: return -1;
449 case PSI_T_OR: return -1;
450 }
451 assert(0);
452 break;
453 case PSI_T_PIPE:
454 switch (op2) {
455 case PSI_T_NOT: return 1;
456 case PSI_T_TILDE: return 1;
457 case PSI_T_ASTERISK: return 1;
458 case PSI_T_SLASH: return 1;
459 case PSI_T_MODULO: return 1;
460 case PSI_T_PLUS: return 1;
461 case PSI_T_MINUS: return 1;
462 case PSI_T_LSHIFT: return 1;
463 case PSI_T_RSHIFT: return 1;
464 case PSI_T_LCHEVR: return 1;
465 case PSI_T_CMP_LE: return 1;
466 case PSI_T_RCHEVR: return 1;
467 case PSI_T_CMP_GE: return 1;
468 case PSI_T_AMPERSAND: return 1;
469 case PSI_T_CMP_EQ: return 1;
470 case PSI_T_CMP_NE: return 1;
471 case PSI_T_CARET: return 1;
472 case PSI_T_PIPE: return 0;
473 case PSI_T_AND: return -1;
474 case PSI_T_OR: return -1;
475 }
476 assert(0);
477 break;
478 case PSI_T_AND:
479 switch (op2) {
480 case PSI_T_NOT: return 1;
481 case PSI_T_TILDE: return 1;
482 case PSI_T_ASTERISK: return 1;
483 case PSI_T_SLASH: return 1;
484 case PSI_T_MODULO: return 1;
485 case PSI_T_PLUS: return 1;
486 case PSI_T_MINUS: return 1;
487 case PSI_T_LSHIFT: return 1;
488 case PSI_T_RSHIFT: return 1;
489 case PSI_T_LCHEVR: return 1;
490 case PSI_T_CMP_LE: return 1;
491 case PSI_T_RCHEVR: return 1;
492 case PSI_T_CMP_GE: return 1;
493 case PSI_T_AMPERSAND: return 1;
494 case PSI_T_CMP_EQ: return 1;
495 case PSI_T_CMP_NE: return 1;
496 case PSI_T_CARET: return 1;
497 case PSI_T_PIPE: return 1;
498 case PSI_T_AND: return 0;
499 case PSI_T_OR: return -1;
500 }
501 assert(0);
502 break;
503 case PSI_T_OR:
504 switch (op2) {
505 case PSI_T_NOT: return 1;
506 case PSI_T_TILDE: return 1;
507 case PSI_T_ASTERISK: return 1;
508 case PSI_T_SLASH: return 1;
509 case PSI_T_MODULO: return 1;
510 case PSI_T_PLUS: return 1;
511 case PSI_T_MINUS: return 1;
512 case PSI_T_LSHIFT: return 1;
513 case PSI_T_RSHIFT: return 1;
514 case PSI_T_LCHEVR: return 1;
515 case PSI_T_CMP_LE: return 1;
516 case PSI_T_RCHEVR: return 1;
517 case PSI_T_CMP_GE: return 1;
518 case PSI_T_AMPERSAND: return 1;
519 case PSI_T_CMP_EQ: return 1;
520 case PSI_T_CMP_NE: return 1;
521 case PSI_T_CARET: return 1;
522 case PSI_T_PIPE: return 1;
523 case PSI_T_AND: return 1;
524 case PSI_T_OR: return 0;
525 }
526 assert(0);
527 break;
528 }
529 assert(0);
530 return 0;
531 }