119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Expression parsing and evaluation for plural form selection.
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Copyright (C) 2000-2003 Free Software Foundation, Inc.
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is free software; you can redistribute it and/or modify it
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   under the terms of the GNU Library General Public License as published
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   by the Free Software Foundation; either version 2, or (at your option)
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   any later version.
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is distributed in the hope that it will be useful,
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Library General Public License for more details.
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   You should have received a copy of the GNU Library General Public
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   License along with this program; if not, write to the Free Software
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   USA.  */
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef _PLURAL_EXP_H
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define _PLURAL_EXP_H
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef internal_function
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define internal_function
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef attribute_hidden
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define attribute_hidden
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* This is the representation of the expressions to determine the
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   plural form.  */
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct expression
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int nargs;			/* Number of arguments.  */
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  enum operator
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  {
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    /* Without arguments:  */
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    var,			/* The variable "n".  */
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    num,			/* Decimal number.  */
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    /* Unary operators:  */
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    lnot,			/* Logical NOT.  */
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    /* Binary operators:  */
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    mult,			/* Multiplication.  */
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    divide,			/* Division.  */
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    module,			/* Modulo operation.  */
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    plus,			/* Addition.  */
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    minus,			/* Subtraction.  */
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    less_than,			/* Comparison.  */
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    greater_than,		/* Comparison.  */
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    less_or_equal,		/* Comparison.  */
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    greater_or_equal,		/* Comparison.  */
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    equal,			/* Comparison for equality.  */
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    not_equal,			/* Comparison for inequality.  */
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    land,			/* Logical AND.  */
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    lor,			/* Logical OR.  */
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    /* Ternary operators:  */
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    qmop			/* Question mark operator.  */
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  } operation;
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  union
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  {
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    unsigned long int num;	/* Number value for `num'.  */
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    struct expression *args[3];	/* Up to three arguments.  */
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  } val;
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* This is the data structure to pass information to the parser and get
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   the result in a thread-safe way.  */
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstruct parse_args
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *cp;
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  struct expression *res;
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project};
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Names for the libintl functions are a problem.  This source code is used
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   1. in the GNU C Library library,
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   2. in the GNU libintl library,
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   3. in the GNU gettext tools.
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   The function names in each situation must be different, to allow for
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   binary incompatible changes in 'struct expression'.  Furthermore,
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   1. in the GNU C Library library, the names have a __ prefix,
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   2.+3. in the GNU libintl library and in the GNU gettext tools, the names
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project         must follow ANSI C and not start with __.
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   So we have to distinguish the three cases.  */
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef _LIBC
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define FREE_EXPRESSION __gettext_free_exp
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define PLURAL_PARSE __gettextparse
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define GERMANIC_PLURAL __gettext_germanic_plural
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#elif defined (IN_LIBINTL)
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define FREE_EXPRESSION libintl_gettext_free_exp
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define PLURAL_PARSE libintl_gettextparse
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define GERMANIC_PLURAL libintl_gettext_germanic_plural
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#else
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define FREE_EXPRESSION free_plural_expression
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define PLURAL_PARSE parse_plural_expression
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define GERMANIC_PLURAL germanic_plural
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern void FREE_EXPRESSION (struct expression *exp)
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     internal_function;
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern int PLURAL_PARSE (void *arg);
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern struct expression GERMANIC_PLURAL attribute_hidden;
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern void EXTRACT_PLURAL_EXPRESSION (const char *nullentry,
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       struct expression **pluralp,
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				       unsigned long int *npluralsp)
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project     internal_function;
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if !defined (_LIBC) && !defined (IN_LIBINTL)
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectextern unsigned long int plural_eval (struct expression *pexp,
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project				      unsigned long int n);
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif /* _PLURAL_EXP_H */
119