66 |
} |
} |
67 |
eval_error; |
eval_error; |
68 |
|
|
69 |
static eval_error logical_or_term (eval_token, number *); |
static eval_error logical_or_term (m4 *, eval_token, number *); |
70 |
static eval_error logical_and_term (eval_token, number *); |
static eval_error logical_and_term (m4 *, eval_token, number *); |
71 |
static eval_error or_term (eval_token, number *); |
static eval_error or_term (m4 *, eval_token, number *); |
72 |
static eval_error xor_term (eval_token, number *); |
static eval_error xor_term (m4 *, eval_token, number *); |
73 |
static eval_error and_term (eval_token, number *); |
static eval_error and_term (m4 *, eval_token, number *); |
74 |
static eval_error not_term (eval_token, number *); |
static eval_error not_term (m4 *, eval_token, number *); |
75 |
static eval_error logical_not_term (eval_token, number *); |
static eval_error logical_not_term (m4 *, eval_token, number *); |
76 |
static eval_error cmp_term (eval_token, number *); |
static eval_error cmp_term (m4 *, eval_token, number *); |
77 |
static eval_error shift_term (eval_token, number *); |
static eval_error shift_term (m4 *, eval_token, number *); |
78 |
static eval_error add_term (eval_token, number *); |
static eval_error add_term (m4 *, eval_token, number *); |
79 |
static eval_error mult_term (eval_token, number *); |
static eval_error mult_term (m4 *, eval_token, number *); |
80 |
static eval_error exp_term (eval_token, number *); |
static eval_error exp_term (m4 *, eval_token, number *); |
81 |
static eval_error unary_term (eval_token, number *); |
static eval_error unary_term (m4 *, eval_token, number *); |
82 |
static eval_error simple_term (eval_token, number *); |
static eval_error simple_term (m4 *, eval_token, number *); |
83 |
static void numb_pow (number *x, const number *y); |
static void numb_pow (number *x, const number *y); |
84 |
|
|
85 |
|
|
280 |
|
|
281 |
/* Recursive descent parser. */ |
/* Recursive descent parser. */ |
282 |
static eval_error |
static eval_error |
283 |
logical_or_term (eval_token et, number *v1) |
logical_or_term (m4 *context, eval_token et, number *v1) |
284 |
{ |
{ |
285 |
number v2; |
number v2; |
286 |
eval_error er; |
eval_error er; |
287 |
|
|
288 |
if ((er = logical_and_term (et, v1)) != NO_ERROR) |
if ((er = logical_and_term (context, et, v1)) != NO_ERROR) |
289 |
return er; |
return er; |
290 |
|
|
291 |
numb_init(v2); |
numb_init(v2); |
295 |
if (et == ERROR) |
if (et == ERROR) |
296 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
297 |
|
|
298 |
if ((er = logical_and_term (et, &v2)) != NO_ERROR) |
if ((er = logical_and_term (context, et, &v2)) != NO_ERROR) |
299 |
return er; |
return er; |
300 |
|
|
301 |
numb_lior(*v1,v2); |
numb_lior(*v1,v2); |
309 |
} |
} |
310 |
|
|
311 |
static eval_error |
static eval_error |
312 |
logical_and_term (eval_token et, number *v1) |
logical_and_term (m4 *context, eval_token et, number *v1) |
313 |
{ |
{ |
314 |
number v2; |
number v2; |
315 |
eval_error er; |
eval_error er; |
316 |
|
|
317 |
if ((er = or_term (et, v1)) != NO_ERROR) |
if ((er = or_term (context, et, v1)) != NO_ERROR) |
318 |
return er; |
return er; |
319 |
|
|
320 |
numb_init(v2); |
numb_init(v2); |
324 |
if (et == ERROR) |
if (et == ERROR) |
325 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
326 |
|
|
327 |
if ((er = or_term (et, &v2)) != NO_ERROR) |
if ((er = or_term (context, et, &v2)) != NO_ERROR) |
328 |
return er; |
return er; |
329 |
|
|
330 |
numb_land(*v1,v2); |
numb_land(*v1,v2); |
338 |
} |
} |
339 |
|
|
340 |
static eval_error |
static eval_error |
341 |
or_term (eval_token et, number *v1) |
or_term (m4 *context, eval_token et, number *v1) |
342 |
{ |
{ |
343 |
number v2; |
number v2; |
344 |
eval_error er; |
eval_error er; |
345 |
|
|
346 |
if ((er = xor_term (et, v1)) != NO_ERROR) |
if ((er = xor_term (context, et, v1)) != NO_ERROR) |
347 |
return er; |
return er; |
348 |
|
|
349 |
numb_init(v2); |
numb_init(v2); |
353 |
if (et == ERROR) |
if (et == ERROR) |
354 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
355 |
|
|
356 |
if ((er = xor_term (et, &v2)) != NO_ERROR) |
if ((er = xor_term (context, et, &v2)) != NO_ERROR) |
357 |
return er; |
return er; |
358 |
|
|
359 |
numb_ior(v1, (const number *)&v2); |
numb_ior(context, v1, (const number *)&v2); |
360 |
} |
} |
361 |
numb_fini(v2); |
numb_fini(v2); |
362 |
if (et == ERROR) |
if (et == ERROR) |
367 |
} |
} |
368 |
|
|
369 |
static eval_error |
static eval_error |
370 |
xor_term (eval_token et, number *v1) |
xor_term (m4 *context, eval_token et, number *v1) |
371 |
{ |
{ |
372 |
number v2; |
number v2; |
373 |
eval_error er; |
eval_error er; |
374 |
|
|
375 |
if ((er = and_term (et, v1)) != NO_ERROR) |
if ((er = and_term (context, et, v1)) != NO_ERROR) |
376 |
return er; |
return er; |
377 |
|
|
378 |
numb_init(v2); |
numb_init(v2); |
382 |
if (et == ERROR) |
if (et == ERROR) |
383 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
384 |
|
|
385 |
if ((er = and_term (et, &v2)) != NO_ERROR) |
if ((er = and_term (context, et, &v2)) != NO_ERROR) |
386 |
return er; |
return er; |
387 |
|
|
388 |
numb_eor(v1, (const number *)&v2); |
numb_eor(context, v1, (const number *)&v2); |
389 |
} |
} |
390 |
numb_fini(v2); |
numb_fini(v2); |
391 |
if (et == ERROR) |
if (et == ERROR) |
396 |
} |
} |
397 |
|
|
398 |
static eval_error |
static eval_error |
399 |
and_term (eval_token et, number *v1) |
and_term (m4 *context, eval_token et, number *v1) |
400 |
{ |
{ |
401 |
number v2; |
number v2; |
402 |
eval_error er; |
eval_error er; |
403 |
|
|
404 |
if ((er = not_term (et, v1)) != NO_ERROR) |
if ((er = not_term (context, et, v1)) != NO_ERROR) |
405 |
return er; |
return er; |
406 |
|
|
407 |
numb_init(v2); |
numb_init(v2); |
411 |
if (et == ERROR) |
if (et == ERROR) |
412 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
413 |
|
|
414 |
if ((er = not_term (et, &v2)) != NO_ERROR) |
if ((er = not_term (context, et, &v2)) != NO_ERROR) |
415 |
return er; |
return er; |
416 |
|
|
417 |
numb_and(v1, (const number *)&v2); |
numb_and(context, v1, (const number *)&v2); |
418 |
} |
} |
419 |
numb_fini(v2); |
numb_fini(v2); |
420 |
if (et == ERROR) |
if (et == ERROR) |
425 |
} |
} |
426 |
|
|
427 |
static eval_error |
static eval_error |
428 |
not_term (eval_token et, number *v1) |
not_term (m4 *context, eval_token et, number *v1) |
429 |
{ |
{ |
430 |
eval_error er; |
eval_error er; |
431 |
|
|
435 |
if (et == ERROR) |
if (et == ERROR) |
436 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
437 |
|
|
438 |
if ((er = not_term (et, v1)) != NO_ERROR) |
if ((er = not_term (context, et, v1)) != NO_ERROR) |
439 |
return er; |
return er; |
440 |
numb_not(v1); |
numb_not(context, v1); |
441 |
} |
} |
442 |
else |
else |
443 |
if ((er = logical_not_term (et, v1)) != NO_ERROR) |
if ((er = logical_not_term (context, et, v1)) != NO_ERROR) |
444 |
return er; |
return er; |
445 |
|
|
446 |
return NO_ERROR; |
return NO_ERROR; |
447 |
} |
} |
448 |
|
|
449 |
static eval_error |
static eval_error |
450 |
logical_not_term (eval_token et, number *v1) |
logical_not_term (m4 *context, eval_token et, number *v1) |
451 |
{ |
{ |
452 |
eval_error er; |
eval_error er; |
453 |
|
|
457 |
if (et == ERROR) |
if (et == ERROR) |
458 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
459 |
|
|
460 |
if ((er = logical_not_term (et, v1)) != NO_ERROR) |
if ((er = logical_not_term (context, et, v1)) != NO_ERROR) |
461 |
return er; |
return er; |
462 |
numb_lnot(*v1); |
numb_lnot(*v1); |
463 |
} |
} |
464 |
else |
else |
465 |
if ((er = cmp_term (et, v1)) != NO_ERROR) |
if ((er = cmp_term (context, et, v1)) != NO_ERROR) |
466 |
return er; |
return er; |
467 |
|
|
468 |
return NO_ERROR; |
return NO_ERROR; |
469 |
} |
} |
470 |
|
|
471 |
static eval_error |
static eval_error |
472 |
cmp_term (eval_token et, number *v1) |
cmp_term (m4 *context, eval_token et, number *v1) |
473 |
{ |
{ |
474 |
eval_token op; |
eval_token op; |
475 |
number v2; |
number v2; |
476 |
eval_error er; |
eval_error er; |
477 |
|
|
478 |
if ((er = shift_term (et, v1)) != NO_ERROR) |
if ((er = shift_term (context, et, v1)) != NO_ERROR) |
479 |
return er; |
return er; |
480 |
|
|
481 |
numb_init(v2); |
numb_init(v2); |
488 |
if (et == ERROR) |
if (et == ERROR) |
489 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
490 |
|
|
491 |
if ((er = shift_term (et, &v2)) != NO_ERROR) |
if ((er = shift_term (context, et, &v2)) != NO_ERROR) |
492 |
return er; |
return er; |
493 |
|
|
494 |
switch (op) |
switch (op) |
518 |
break; |
break; |
519 |
|
|
520 |
default: |
default: |
521 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
522 |
"INTERNAL ERROR: Bad comparison operator in cmp_term ()")); |
"INTERNAL ERROR: Bad comparison operator in cmp_term ()")); |
523 |
abort (); |
abort (); |
524 |
} |
} |
532 |
} |
} |
533 |
|
|
534 |
static eval_error |
static eval_error |
535 |
shift_term (eval_token et, number *v1) |
shift_term (m4 *context, eval_token et, number *v1) |
536 |
{ |
{ |
537 |
eval_token op; |
eval_token op; |
538 |
number v2; |
number v2; |
539 |
eval_error er; |
eval_error er; |
540 |
|
|
541 |
if ((er = add_term (et, v1)) != NO_ERROR) |
if ((er = add_term (context, et, v1)) != NO_ERROR) |
542 |
return er; |
return er; |
543 |
|
|
544 |
numb_init(v2); |
numb_init(v2); |
549 |
if (et == ERROR) |
if (et == ERROR) |
550 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
551 |
|
|
552 |
if ((er = add_term (et, &v2)) != NO_ERROR) |
if ((er = add_term (context, et, &v2)) != NO_ERROR) |
553 |
return er; |
return er; |
554 |
|
|
555 |
switch (op) |
switch (op) |
556 |
{ |
{ |
557 |
case LSHIFT: |
case LSHIFT: |
558 |
numb_lshift(v1, (const number *)&v2); |
numb_lshift(context, v1, (const number *)&v2); |
559 |
break; |
break; |
560 |
|
|
561 |
case RSHIFT: |
case RSHIFT: |
562 |
numb_rshift(v1, (const number *)&v2); |
numb_rshift(context, v1, (const number *)&v2); |
563 |
break; |
break; |
564 |
|
|
565 |
default: |
default: |
566 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
567 |
"INTERNAL ERROR: Bad shift operator in shift_term ()")); |
"INTERNAL ERROR: Bad shift operator in shift_term ()")); |
568 |
abort (); |
abort (); |
569 |
} |
} |
577 |
} |
} |
578 |
|
|
579 |
static eval_error |
static eval_error |
580 |
add_term (eval_token et, number *v1) |
add_term (m4 *context, eval_token et, number *v1) |
581 |
{ |
{ |
582 |
eval_token op; |
eval_token op; |
583 |
number v2; |
number v2; |
584 |
eval_error er; |
eval_error er; |
585 |
|
|
586 |
if ((er = mult_term (et, v1)) != NO_ERROR) |
if ((er = mult_term (context, et, v1)) != NO_ERROR) |
587 |
return er; |
return er; |
588 |
|
|
589 |
numb_init(v2); |
numb_init(v2); |
593 |
if (et == ERROR) |
if (et == ERROR) |
594 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
595 |
|
|
596 |
if ((er = mult_term (et, &v2)) != NO_ERROR) |
if ((er = mult_term (context, et, &v2)) != NO_ERROR) |
597 |
return er; |
return er; |
598 |
|
|
599 |
if (op == PLUS) { |
if (op == PLUS) { |
611 |
} |
} |
612 |
|
|
613 |
static eval_error |
static eval_error |
614 |
mult_term (eval_token et, number *v1) |
mult_term (m4 *context, eval_token et, number *v1) |
615 |
{ |
{ |
616 |
eval_token op; |
eval_token op; |
617 |
number v2; |
number v2; |
618 |
eval_error er; |
eval_error er; |
619 |
|
|
620 |
if ((er = exp_term (et, v1)) != NO_ERROR) |
if ((er = exp_term (context, et, v1)) != NO_ERROR) |
621 |
return er; |
return er; |
622 |
|
|
623 |
numb_init(v2); |
numb_init(v2); |
631 |
if (et == ERROR) |
if (et == ERROR) |
632 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
633 |
|
|
634 |
if ((er = exp_term (et, &v2)) != NO_ERROR) |
if ((er = exp_term (context, et, &v2)) != NO_ERROR) |
635 |
return er; |
return er; |
636 |
|
|
637 |
switch (op) |
switch (op) |
660 |
if (numb_zerop(v2)) |
if (numb_zerop(v2)) |
661 |
return MODULO_ZERO; |
return MODULO_ZERO; |
662 |
else { |
else { |
663 |
numb_modulo(v1, (const number *)&v2); |
numb_modulo(context, v1, (const number *)&v2); |
664 |
} |
} |
665 |
break; |
break; |
666 |
|
|
667 |
default: |
default: |
668 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
669 |
"INTERNAL ERROR: Bad operator in mult_term ()")); |
"INTERNAL ERROR: Bad operator in mult_term ()")); |
670 |
abort (); |
abort (); |
671 |
} |
} |
679 |
} |
} |
680 |
|
|
681 |
static eval_error |
static eval_error |
682 |
exp_term (eval_token et, number *v1) |
exp_term (m4 *context, eval_token et, number *v1) |
683 |
{ |
{ |
684 |
number result; |
number result; |
685 |
number v2; |
number v2; |
686 |
eval_error er; |
eval_error er; |
687 |
|
|
688 |
if ((er = unary_term (et, v1)) != NO_ERROR) |
if ((er = unary_term (context, et, v1)) != NO_ERROR) |
689 |
return er; |
return er; |
690 |
memcpy(&result, v1, sizeof(number)); |
memcpy(&result, v1, sizeof(number)); |
691 |
|
|
696 |
if (et == ERROR) |
if (et == ERROR) |
697 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
698 |
|
|
699 |
if ((er = exp_term (et, &v2)) != NO_ERROR) |
if ((er = exp_term (context, et, &v2)) != NO_ERROR) |
700 |
return er; |
return er; |
701 |
|
|
702 |
numb_pow(v1, (const number *)&v2); |
numb_pow(v1, (const number *)&v2); |
710 |
} |
} |
711 |
|
|
712 |
static eval_error |
static eval_error |
713 |
unary_term (eval_token et, number *v1) |
unary_term (m4 *context, eval_token et, number *v1) |
714 |
{ |
{ |
715 |
eval_token et2 = et; |
eval_token et2 = et; |
716 |
eval_error er; |
eval_error er; |
721 |
if (et2 == ERROR) |
if (et2 == ERROR) |
722 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
723 |
|
|
724 |
if ((er = simple_term (et2, v1)) != NO_ERROR) |
if ((er = simple_term (context, et2, v1)) != NO_ERROR) |
725 |
return er; |
return er; |
726 |
|
|
727 |
if (et == MINUS) |
if (et == MINUS) |
728 |
numb_negate(*v1); |
numb_negate(*v1); |
729 |
} |
} |
730 |
else |
else |
731 |
if ((er = simple_term (et, v1)) != NO_ERROR) |
if ((er = simple_term (context, et, v1)) != NO_ERROR) |
732 |
return er; |
return er; |
733 |
|
|
734 |
return NO_ERROR; |
return NO_ERROR; |
735 |
} |
} |
736 |
|
|
737 |
static eval_error |
static eval_error |
738 |
simple_term (eval_token et, number *v1) |
simple_term (m4 *context, eval_token et, number *v1) |
739 |
{ |
{ |
740 |
number v2; |
number v2; |
741 |
eval_error er; |
eval_error er; |
747 |
if (et == ERROR) |
if (et == ERROR) |
748 |
return UNKNOWN_INPUT; |
return UNKNOWN_INPUT; |
749 |
|
|
750 |
if ((er = logical_or_term (et, v1)) != NO_ERROR) |
if ((er = logical_or_term (context, et, v1)) != NO_ERROR) |
751 |
return er; |
return er; |
752 |
|
|
753 |
et = eval_lex (&v2); |
et = eval_lex (&v2); |
778 |
eval_token et; |
eval_token et; |
779 |
eval_error err; |
eval_error err; |
780 |
|
|
781 |
if (argc >= 3 && !m4_numeric_arg (argc, argv, 2, &radix)) |
if (argc >= 3 && !m4_numeric_arg (context, argc, argv, 2, &radix)) |
782 |
return; |
return; |
783 |
|
|
784 |
if (radix <= 1 || radix > 36) |
if (radix <= 1 || radix > 36) |
785 |
{ |
{ |
786 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
787 |
_("Warning: %s: radix out of range: %d"), |
_("Warning: %s: radix out of range: %d"), |
788 |
M4ARG(0), radix)); |
M4ARG(0), radix)); |
789 |
return; |
return; |
790 |
} |
} |
791 |
|
|
792 |
if (argc >= 4 && !m4_numeric_arg (argc, argv, 3, &min)) |
if (argc >= 4 && !m4_numeric_arg (context, argc, argv, 3, &min)) |
793 |
return; |
return; |
794 |
|
|
795 |
if (min <= 0) |
if (min <= 0) |
796 |
{ |
{ |
797 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
798 |
_("Warning: %s: negative width: %d"), |
_("Warning: %s: negative width: %d"), |
799 |
M4ARG(0), min)); |
M4ARG(0), min)); |
800 |
return; |
return; |
805 |
|
|
806 |
numb_init(val); |
numb_init(val); |
807 |
et = eval_lex (&val); |
et = eval_lex (&val); |
808 |
err = logical_or_term (et, &val); |
err = logical_or_term (context, et, &val); |
809 |
|
|
810 |
if (err == NO_ERROR && *eval_text != '\0') |
if (err == NO_ERROR && *eval_text != '\0') |
811 |
err = EXCESS_INPUT; |
err = EXCESS_INPUT; |
816 |
break; |
break; |
817 |
|
|
818 |
case MISSING_RIGHT: |
case MISSING_RIGHT: |
819 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
820 |
_("Warning: %s: missing right parenthesis: %s"), |
_("Warning: %s: missing right parenthesis: %s"), |
821 |
M4ARG (0), M4ARG (1))); |
M4ARG (0), M4ARG (1))); |
822 |
break; |
break; |
823 |
|
|
824 |
case SYNTAX_ERROR: |
case SYNTAX_ERROR: |
825 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
826 |
_("Warning: %s: bad expression: %s"), |
_("Warning: %s: bad expression: %s"), |
827 |
M4ARG (0), M4ARG (1))); |
M4ARG (0), M4ARG (1))); |
828 |
break; |
break; |
829 |
|
|
830 |
case UNKNOWN_INPUT: |
case UNKNOWN_INPUT: |
831 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
832 |
_("Warning: %s: bad input: %s"), |
_("Warning: %s: bad input: %s"), |
833 |
M4ARG (0), M4ARG (1))); |
M4ARG (0), M4ARG (1))); |
834 |
break; |
break; |
835 |
|
|
836 |
case EXCESS_INPUT: |
case EXCESS_INPUT: |
837 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
838 |
_("Warning: %s: excess input: %s"), |
_("Warning: %s: excess input: %s"), |
839 |
M4ARG (0), M4ARG (1))); |
M4ARG (0), M4ARG (1))); |
840 |
break; |
break; |
841 |
|
|
842 |
case DIVIDE_ZERO: |
case DIVIDE_ZERO: |
843 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
844 |
_("Warning: %s: divide by zero: %s"), |
_("Warning: %s: divide by zero: %s"), |
845 |
M4ARG (0), M4ARG (1))); |
M4ARG (0), M4ARG (1))); |
846 |
break; |
break; |
847 |
|
|
848 |
case MODULO_ZERO: |
case MODULO_ZERO: |
849 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
850 |
_("Warning: %s: modulo by zero: %s"), |
_("Warning: %s: modulo by zero: %s"), |
851 |
M4ARG (0), M4ARG (1))); |
M4ARG (0), M4ARG (1))); |
852 |
break; |
break; |
853 |
|
|
854 |
default: |
default: |
855 |
M4ERROR ((warning_status, 0, |
M4ERROR ((m4_get_warning_status_opt (context), 0, |
856 |
"INTERNAL ERROR: Bad error code in evaluate ()")); |
"INTERNAL ERROR: Bad error code in evaluate ()")); |
857 |
abort (); |
abort (); |
858 |
} |
} |