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