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