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 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