mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-11-03 20:53:13 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			126 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Expression parsing and evaluation for plural form selection.
 | 
						|
   Copyright (C) 2000, 2001, 2002, 2005, 2007 Free Software Foundation, Inc.
 | 
						|
   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
 | 
						|
   This file is part of the GNU C Library.
 | 
						|
 | 
						|
   The GNU C Library is free software; you can redistribute it and/or
 | 
						|
   modify it under the terms of the GNU Lesser General Public
 | 
						|
   License as published by the Free Software Foundation; either
 | 
						|
   version 2.1 of the License, or (at your option) any later version.
 | 
						|
 | 
						|
   The GNU C Library is distributed in the hope that it will be useful,
 | 
						|
   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 | 
						|
   Lesser General Public License for more details.
 | 
						|
 | 
						|
   You should have received a copy of the GNU Lesser General Public
 | 
						|
   License along with the GNU C Library; if not, see
 | 
						|
   <http://www.gnu.org/licenses/>.  */
 | 
						|
 | 
						|
#ifndef _PLURAL_EXP_H
 | 
						|
#define _PLURAL_EXP_H
 | 
						|
 | 
						|
#ifndef PARAMS
 | 
						|
# if __STDC__ || defined __GNUC__ || defined __SUNPRO_C || defined __cplusplus || __PROTOTYPES
 | 
						|
#  define PARAMS(args) args
 | 
						|
# else
 | 
						|
#  define PARAMS(args) ()
 | 
						|
# endif
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef internal_function
 | 
						|
# define internal_function
 | 
						|
#endif
 | 
						|
 | 
						|
#ifndef attribute_hidden
 | 
						|
# define attribute_hidden
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
/* This is the representation of the expressions to determine the
 | 
						|
   plural form.  */
 | 
						|
struct expression
 | 
						|
{
 | 
						|
  int nargs;			/* Number of arguments.  */
 | 
						|
  enum operator
 | 
						|
  {
 | 
						|
    /* Without arguments:  */
 | 
						|
    var,			/* The variable "n".  */
 | 
						|
    num,			/* Decimal number.  */
 | 
						|
    /* Unary operators:  */
 | 
						|
    lnot,			/* Logical NOT.  */
 | 
						|
    /* Binary operators:  */
 | 
						|
    mult,			/* Multiplication.  */
 | 
						|
    divide,			/* Division.  */
 | 
						|
    module,			/* Modulo operation.  */
 | 
						|
    plus,			/* Addition.  */
 | 
						|
    minus,			/* Subtraction.  */
 | 
						|
    less_than,			/* Comparison.  */
 | 
						|
    greater_than,		/* Comparison.  */
 | 
						|
    less_or_equal,		/* Comparison.  */
 | 
						|
    greater_or_equal,		/* Comparison.  */
 | 
						|
    equal,			/* Comparison for equality.  */
 | 
						|
    not_equal,			/* Comparison for inequality.  */
 | 
						|
    land,			/* Logical AND.  */
 | 
						|
    lor,			/* Logical OR.  */
 | 
						|
    /* Ternary operators:  */
 | 
						|
    qmop			/* Question mark operator.  */
 | 
						|
  } operation;
 | 
						|
  union
 | 
						|
  {
 | 
						|
    unsigned long int num;	/* Number value for `num'.  */
 | 
						|
    struct expression *args[3];	/* Up to three arguments.  */
 | 
						|
  } val;
 | 
						|
};
 | 
						|
 | 
						|
/* This is the data structure to pass information to the parser and get
 | 
						|
   the result in a thread-safe way.  */
 | 
						|
struct parse_args
 | 
						|
{
 | 
						|
  const char *cp;
 | 
						|
  struct expression *res;
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/* Names for the libintl functions are a problem.  This source code is used
 | 
						|
   1. in the GNU C Library library,
 | 
						|
   2. in the GNU libintl library,
 | 
						|
   3. in the GNU gettext tools.
 | 
						|
   The function names in each situation must be different, to allow for
 | 
						|
   binary incompatible changes in 'struct expression'.  Furthermore,
 | 
						|
   1. in the GNU C Library library, the names have a __ prefix,
 | 
						|
   2.+3. in the GNU libintl library and in the GNU gettext tools, the names
 | 
						|
         must follow ANSI C and not start with __.
 | 
						|
   So we have to distinguish the three cases.  */
 | 
						|
#ifdef _LIBC
 | 
						|
# define FREE_EXPRESSION __gettext_free_exp
 | 
						|
# define PLURAL_PARSE __gettextparse
 | 
						|
# define GERMANIC_PLURAL __gettext_germanic_plural
 | 
						|
# define EXTRACT_PLURAL_EXPRESSION __gettext_extract_plural
 | 
						|
#elif defined (IN_LIBINTL)
 | 
						|
# define FREE_EXPRESSION libintl_gettext_free_exp
 | 
						|
# define PLURAL_PARSE libintl_gettextparse
 | 
						|
# define GERMANIC_PLURAL libintl_gettext_germanic_plural
 | 
						|
# define EXTRACT_PLURAL_EXPRESSION libintl_gettext_extract_plural
 | 
						|
#else
 | 
						|
# define FREE_EXPRESSION free_plural_expression
 | 
						|
# define PLURAL_PARSE parse_plural_expression
 | 
						|
# define GERMANIC_PLURAL germanic_plural
 | 
						|
# define EXTRACT_PLURAL_EXPRESSION extract_plural_expression
 | 
						|
#endif
 | 
						|
 | 
						|
extern void FREE_EXPRESSION PARAMS ((struct expression *exp))
 | 
						|
     internal_function;
 | 
						|
extern int PLURAL_PARSE PARAMS ((void *arg));
 | 
						|
extern const struct expression GERMANIC_PLURAL attribute_hidden;
 | 
						|
extern void EXTRACT_PLURAL_EXPRESSION PARAMS
 | 
						|
  ((const char *nullentry, const struct expression **pluralp,
 | 
						|
    unsigned long int *npluralsp)) internal_function;
 | 
						|
 | 
						|
#if !defined (_LIBC) && !defined (IN_LIBINTL)
 | 
						|
extern unsigned long int plural_eval PARAMS ((const struct expression *pexp,
 | 
						|
					      unsigned long int n));
 | 
						|
#endif
 | 
						|
 | 
						|
#endif /* _PLURAL_EXP_H */
 |