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