Blame intl/eval-plural.h

Packit bbfece
/* Plural expression evaluation.
Packit bbfece
   Copyright (C) 2000-2002 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify it
Packit bbfece
   under the terms of the GNU Library General Public License as published
Packit bbfece
   by the Free Software Foundation; either version 2, or (at your option)
Packit bbfece
   any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit bbfece
   Library General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU Library General Public
Packit bbfece
   License along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
Packit bbfece
   USA.  */
Packit bbfece
Packit bbfece
#ifndef STATIC
Packit bbfece
#define STATIC static
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* Evaluate the plural expression and return an index value.  */
Packit bbfece
STATIC unsigned long int plural_eval PARAMS ((struct expression *pexp,
Packit bbfece
					      unsigned long int n))
Packit bbfece
     internal_function;
Packit bbfece
Packit bbfece
STATIC
Packit bbfece
unsigned long int
Packit bbfece
internal_function
Packit bbfece
plural_eval (pexp, n)
Packit bbfece
     struct expression *pexp;
Packit bbfece
     unsigned long int n;
Packit bbfece
{
Packit bbfece
  switch (pexp->nargs)
Packit bbfece
    {
Packit bbfece
    case 0:
Packit bbfece
      switch (pexp->operation)
Packit bbfece
	{
Packit bbfece
	case var:
Packit bbfece
	  return n;
Packit bbfece
	case num:
Packit bbfece
	  return pexp->val.num;
Packit bbfece
	default:
Packit bbfece
	  break;
Packit bbfece
	}
Packit bbfece
      /* NOTREACHED */
Packit bbfece
      break;
Packit bbfece
    case 1:
Packit bbfece
      {
Packit bbfece
	/* pexp->operation must be lnot.  */
Packit bbfece
	unsigned long int arg = plural_eval (pexp->val.args[0], n);
Packit bbfece
	return ! arg;
Packit bbfece
      }
Packit bbfece
    case 2:
Packit bbfece
      {
Packit bbfece
	unsigned long int leftarg = plural_eval (pexp->val.args[0], n);
Packit bbfece
	if (pexp->operation == lor)
Packit bbfece
	  return leftarg || plural_eval (pexp->val.args[1], n);
Packit bbfece
	else if (pexp->operation == land)
Packit bbfece
	  return leftarg && plural_eval (pexp->val.args[1], n);
Packit bbfece
	else
Packit bbfece
	  {
Packit bbfece
	    unsigned long int rightarg = plural_eval (pexp->val.args[1], n);
Packit bbfece
Packit bbfece
	    switch (pexp->operation)
Packit bbfece
	      {
Packit bbfece
	      case mult:
Packit bbfece
		return leftarg * rightarg;
Packit bbfece
	      case divide:
Packit bbfece
#if !INTDIV0_RAISES_SIGFPE
Packit bbfece
		if (rightarg == 0)
Packit bbfece
		  raise (SIGFPE);
Packit bbfece
#endif
Packit bbfece
		return leftarg / rightarg;
Packit bbfece
	      case module:
Packit bbfece
#if !INTDIV0_RAISES_SIGFPE
Packit bbfece
		if (rightarg == 0)
Packit bbfece
		  raise (SIGFPE);
Packit bbfece
#endif
Packit bbfece
		return leftarg % rightarg;
Packit bbfece
	      case plus:
Packit bbfece
		return leftarg + rightarg;
Packit bbfece
	      case minus:
Packit bbfece
		return leftarg - rightarg;
Packit bbfece
	      case less_than:
Packit bbfece
		return leftarg < rightarg;
Packit bbfece
	      case greater_than:
Packit bbfece
		return leftarg > rightarg;
Packit bbfece
	      case less_or_equal:
Packit bbfece
		return leftarg <= rightarg;
Packit bbfece
	      case greater_or_equal:
Packit bbfece
		return leftarg >= rightarg;
Packit bbfece
	      case equal:
Packit bbfece
		return leftarg == rightarg;
Packit bbfece
	      case not_equal:
Packit bbfece
		return leftarg != rightarg;
Packit bbfece
	      default:
Packit bbfece
		break;
Packit bbfece
	      }
Packit bbfece
	  }
Packit bbfece
	/* NOTREACHED */
Packit bbfece
	break;
Packit bbfece
      }
Packit bbfece
    case 3:
Packit bbfece
      {
Packit bbfece
	/* pexp->operation must be qmop.  */
Packit bbfece
	unsigned long int boolarg = plural_eval (pexp->val.args[0], n);
Packit bbfece
	return plural_eval (pexp->val.args[boolarg ? 1 : 2], n);
Packit bbfece
      }
Packit bbfece
    }
Packit bbfece
  /* NOTREACHED */
Packit bbfece
  return 0;
Packit bbfece
}