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