/[m4]/m4/modules/evalparse.c
ViewVC logotype

Diff of /m4/modules/evalparse.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.8 by gary, Wed Jun 18 16:21:55 2003 UTC revision 1.9 by gary, Fri Jun 20 15:43:20 2003 UTC
# Line 66  typedef enum eval_error Line 66  typedef enum eval_error
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    
# Line 280  eval_lex (number *val) Line 280  eval_lex (number *val)
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);
# Line 295  logical_or_term (eval_token et, number * Line 295  logical_or_term (eval_token et, number *
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);
# Line 309  logical_or_term (eval_token et, number * Line 309  logical_or_term (eval_token et, number *
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);
# Line 324  logical_and_term (eval_token et, number Line 324  logical_and_term (eval_token et, number
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);
# Line 338  logical_and_term (eval_token et, number Line 338  logical_and_term (eval_token et, number
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);
# Line 353  or_term (eval_token et, number *v1) Line 353  or_term (eval_token et, number *v1)
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)
# Line 367  or_term (eval_token et, number *v1) Line 367  or_term (eval_token et, number *v1)
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);
# Line 382  xor_term (eval_token et, number *v1) Line 382  xor_term (eval_token et, number *v1)
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)
# Line 396  xor_term (eval_token et, number *v1) Line 396  xor_term (eval_token et, number *v1)
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);
# Line 411  and_term (eval_token et, number *v1) Line 411  and_term (eval_token et, number *v1)
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)
# Line 425  and_term (eval_token et, number *v1) Line 425  and_term (eval_token et, number *v1)
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    
# Line 435  not_term (eval_token et, number *v1) Line 435  not_term (eval_token et, number *v1)
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    
# Line 457  logical_not_term (eval_token et, number Line 457  logical_not_term (eval_token et, number
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);
# Line 488  cmp_term (eval_token et, number *v1) Line 488  cmp_term (eval_token et, number *v1)
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)
# Line 518  cmp_term (eval_token et, number *v1) Line 518  cmp_term (eval_token et, number *v1)
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          }          }
# Line 532  cmp_term (eval_token et, number *v1) Line 532  cmp_term (eval_token et, number *v1)
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);
# Line 549  shift_term (eval_token et, number *v1) Line 549  shift_term (eval_token et, number *v1)
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          }          }
# Line 577  shift_term (eval_token et, number *v1) Line 577  shift_term (eval_token et, number *v1)
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);
# Line 593  add_term (eval_token et, number *v1) Line 593  add_term (eval_token et, number *v1)
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) {
# Line 611  add_term (eval_token et, number *v1) Line 611  add_term (eval_token et, number *v1)
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);
# Line 631  mult_term (eval_token et, number *v1) Line 631  mult_term (eval_token et, number *v1)
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)
# Line 660  mult_term (eval_token et, number *v1) Line 660  mult_term (eval_token et, number *v1)
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          }          }
# Line 679  mult_term (eval_token et, number *v1) Line 679  mult_term (eval_token et, number *v1)
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    
# Line 696  exp_term (eval_token et, number *v1) Line 696  exp_term (eval_token et, number *v1)
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);
# Line 710  exp_term (eval_token et, number *v1) Line 710  exp_term (eval_token et, number *v1)
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;
# Line 721  unary_term (eval_token et, number *v1) Line 721  unary_term (eval_token et, number *v1)
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;
# Line 747  simple_term (eval_token et, number *v1) Line 747  simple_term (eval_token et, number *v1)
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);
# Line 778  m4_evaluate (m4 *context, struct obstack Line 778  m4_evaluate (m4 *context, struct obstack
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;
# Line 805  m4_evaluate (m4 *context, struct obstack Line 805  m4_evaluate (m4 *context, struct obstack
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;
# Line 816  m4_evaluate (m4 *context, struct obstack Line 816  m4_evaluate (m4 *context, struct obstack
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      }      }

Legend:
Removed from v.1.8  
changed lines
  Added in v.1.9

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26