xref: /netbsd-src/external/gpl3/gcc/dist/intl/eval-plural.h (revision 4fee23f98c45552038ad6b5bd05124a41302fb01)
1*4fee23f9Smrg /* Plural expression evaluation.
2*4fee23f9Smrg    Copyright (C) 2000-2002 Free Software Foundation, Inc.
3*4fee23f9Smrg 
4*4fee23f9Smrg    This program is free software; you can redistribute it and/or modify it
5*4fee23f9Smrg    under the terms of the GNU Library General Public License as published
6*4fee23f9Smrg    by the Free Software Foundation; either version 2, or (at your option)
7*4fee23f9Smrg    any later version.
8*4fee23f9Smrg 
9*4fee23f9Smrg    This program is distributed in the hope that it will be useful,
10*4fee23f9Smrg    but WITHOUT ANY WARRANTY; without even the implied warranty of
11*4fee23f9Smrg    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12*4fee23f9Smrg    Library General Public License for more details.
13*4fee23f9Smrg 
14*4fee23f9Smrg    You should have received a copy of the GNU Library General Public
15*4fee23f9Smrg    License along with this program; if not, write to the Free Software
16*4fee23f9Smrg    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
17*4fee23f9Smrg    USA.  */
18*4fee23f9Smrg 
19*4fee23f9Smrg #ifndef STATIC
20*4fee23f9Smrg #define STATIC static
21*4fee23f9Smrg #endif
22*4fee23f9Smrg 
23*4fee23f9Smrg /* Evaluate the plural expression and return an index value.  */
24*4fee23f9Smrg STATIC unsigned long int plural_eval PARAMS ((struct expression *pexp,
25*4fee23f9Smrg 					      unsigned long int n))
26*4fee23f9Smrg      internal_function;
27*4fee23f9Smrg 
28*4fee23f9Smrg STATIC
29*4fee23f9Smrg unsigned long int
30*4fee23f9Smrg internal_function
plural_eval(pexp,n)31*4fee23f9Smrg plural_eval (pexp, n)
32*4fee23f9Smrg      struct expression *pexp;
33*4fee23f9Smrg      unsigned long int n;
34*4fee23f9Smrg {
35*4fee23f9Smrg   switch (pexp->nargs)
36*4fee23f9Smrg     {
37*4fee23f9Smrg     case 0:
38*4fee23f9Smrg       switch (pexp->operation)
39*4fee23f9Smrg 	{
40*4fee23f9Smrg 	case var:
41*4fee23f9Smrg 	  return n;
42*4fee23f9Smrg 	case num:
43*4fee23f9Smrg 	  return pexp->val.num;
44*4fee23f9Smrg 	default:
45*4fee23f9Smrg 	  break;
46*4fee23f9Smrg 	}
47*4fee23f9Smrg       /* NOTREACHED */
48*4fee23f9Smrg       break;
49*4fee23f9Smrg     case 1:
50*4fee23f9Smrg       {
51*4fee23f9Smrg 	/* pexp->operation must be lnot.  */
52*4fee23f9Smrg 	unsigned long int arg = plural_eval (pexp->val.args[0], n);
53*4fee23f9Smrg 	return ! arg;
54*4fee23f9Smrg       }
55*4fee23f9Smrg     case 2:
56*4fee23f9Smrg       {
57*4fee23f9Smrg 	unsigned long int leftarg = plural_eval (pexp->val.args[0], n);
58*4fee23f9Smrg 	if (pexp->operation == lor)
59*4fee23f9Smrg 	  return leftarg || plural_eval (pexp->val.args[1], n);
60*4fee23f9Smrg 	else if (pexp->operation == land)
61*4fee23f9Smrg 	  return leftarg && plural_eval (pexp->val.args[1], n);
62*4fee23f9Smrg 	else
63*4fee23f9Smrg 	  {
64*4fee23f9Smrg 	    unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
65*4fee23f9Smrg 
66*4fee23f9Smrg 	    switch (pexp->operation)
67*4fee23f9Smrg 	      {
68*4fee23f9Smrg 	      case mult:
69*4fee23f9Smrg 		return leftarg * rightarg;
70*4fee23f9Smrg 	      case divide:
71*4fee23f9Smrg #if !INTDIV0_RAISES_SIGFPE
72*4fee23f9Smrg 		if (rightarg == 0)
73*4fee23f9Smrg 		  raise (SIGFPE);
74*4fee23f9Smrg #endif
75*4fee23f9Smrg 		return leftarg / rightarg;
76*4fee23f9Smrg 	      case module:
77*4fee23f9Smrg #if !INTDIV0_RAISES_SIGFPE
78*4fee23f9Smrg 		if (rightarg == 0)
79*4fee23f9Smrg 		  raise (SIGFPE);
80*4fee23f9Smrg #endif
81*4fee23f9Smrg 		return leftarg % rightarg;
82*4fee23f9Smrg 	      case plus:
83*4fee23f9Smrg 		return leftarg + rightarg;
84*4fee23f9Smrg 	      case minus:
85*4fee23f9Smrg 		return leftarg - rightarg;
86*4fee23f9Smrg 	      case less_than:
87*4fee23f9Smrg 		return leftarg < rightarg;
88*4fee23f9Smrg 	      case greater_than:
89*4fee23f9Smrg 		return leftarg > rightarg;
90*4fee23f9Smrg 	      case less_or_equal:
91*4fee23f9Smrg 		return leftarg <= rightarg;
92*4fee23f9Smrg 	      case greater_or_equal:
93*4fee23f9Smrg 		return leftarg >= rightarg;
94*4fee23f9Smrg 	      case equal:
95*4fee23f9Smrg 		return leftarg == rightarg;
96*4fee23f9Smrg 	      case not_equal:
97*4fee23f9Smrg 		return leftarg != rightarg;
98*4fee23f9Smrg 	      default:
99*4fee23f9Smrg 		break;
100*4fee23f9Smrg 	      }
101*4fee23f9Smrg 	  }
102*4fee23f9Smrg 	/* NOTREACHED */
103*4fee23f9Smrg 	break;
104*4fee23f9Smrg       }
105*4fee23f9Smrg     case 3:
106*4fee23f9Smrg       {
107*4fee23f9Smrg 	/* pexp->operation must be qmop.  */
108*4fee23f9Smrg 	unsigned long int boolarg = plural_eval (pexp->val.args[0], n);
109*4fee23f9Smrg 	return plural_eval (pexp->val.args[boolarg ? 1 : 2], n);
110*4fee23f9Smrg       }
111*4fee23f9Smrg     }
112*4fee23f9Smrg   /* NOTREACHED */
113*4fee23f9Smrg   return 0;
114*4fee23f9Smrg }
115