Sync usage with man page.
[netbsd-mini2440.git] / gnu / dist / grep / intl / eval-plural.h
blob009de3a84dfe17564740076b0205da5f675f4008
1 /* $NetBSD$ */
3 /* Plural expression evaluation.
4 Copyright (C) 2000, 2001 Free Software Foundation, Inc.
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.
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.
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. */
20 #ifndef STATIC
21 #define STATIC static
22 #endif
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;
29 STATIC
30 unsigned long int
31 internal_function
32 plural_eval (pexp, n)
33 struct expression *pexp;
34 unsigned long int n;
36 switch (pexp->nargs)
38 case 0:
39 switch (pexp->operation)
41 case var:
42 return n;
43 case num:
44 return pexp->val.num;
45 default:
46 break;
48 /* NOTREACHED */
49 break;
50 case 1:
52 /* pexp->operation must be lnot. */
53 unsigned long int arg = plural_eval (pexp->val.args[0], n);
54 return ! arg;
56 case 2:
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
65 unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
67 switch (pexp->operation)
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;
95 /* NOTREACHED */
96 break;
98 case 3:
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);
105 /* NOTREACHED */
106 return 0;