119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%{
219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Expression parsing for plural form selection.
319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Copyright (C) 2000-2001, 2003 Free Software Foundation, Inc.
419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is free software; you can redistribute it and/or modify it
719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   under the terms of the GNU Library General Public License as published
819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   by the Free Software Foundation; either version 2, or (at your option)
919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   any later version.
1019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   This program is distributed in the hope that it will be useful,
1219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   but WITHOUT ANY WARRANTY; without even the implied warranty of
1319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Library General Public License for more details.
1519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
1619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   You should have received a copy of the GNU Library General Public
1719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   License along with this program; if not, write to the Free Software
1819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
1919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   USA.  */
2019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* The bison generated parser uses alloca.  AIX 3 forces us to put this
2219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   declaration at the beginning of the file.  The declaration in bison's
2319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   skeleton file comes too late.  This must come before <config.h>
2419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   because <config.h> may include arbitrary system headers.  */
2519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if defined _AIX && !defined __GNUC__
2619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project #pragma alloca
2719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
2819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
2919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifdef HAVE_CONFIG_H
3019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# include <config.h>
3119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
3219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stddef.h>
3419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include <stdlib.h>
3519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#include "plural-exp.h"
3619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
3719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* The main function generated by the parser is called __gettextparse,
3819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   but we want it to be called PLURAL_PARSE.  */
3919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#ifndef _LIBC
4019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project# define __gettextparse PLURAL_PARSE
4119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
4219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define YYLEX_PARAM	&((struct parse_args *) arg)->cp
4419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#define YYPARSE_PARAM	arg
4519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%}
4619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%pure_parser
4719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%expect 7
4819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
4919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%union {
5019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  unsigned long int num;
5119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  enum operator op;
5219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  struct expression *exp;
5319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
5419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
5519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%{
5619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Prototypes for local functions.  */
5719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int yylex (YYSTYPE *lval, const char **pexp);
5819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void yyerror (const char *str);
5919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* Allocation of expressions.  */
6119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct expression *
6319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnew_exp (int nargs, enum operator op, struct expression * const *args)
6419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
6519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int i;
6619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  struct expression *newp;
6719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
6819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* If any of the argument could not be malloc'ed, just return NULL.  */
6919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  for (i = nargs - 1; i >= 0; i--)
7019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    if (args[i] == NULL)
7119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      goto fail;
7219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
7319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Allocate a new expression.  */
7419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  newp = (struct expression *) malloc (sizeof (*newp));
7519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (newp != NULL)
7619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
7719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      newp->nargs = nargs;
7819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      newp->operation = op;
7919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      for (i = nargs - 1; i >= 0; i--)
8019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	newp->val.args[i] = args[i];
8119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      return newp;
8219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
8319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project fail:
8519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  for (i = nargs - 1; i >= 0; i--)
8619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    FREE_EXPRESSION (args[i]);
8719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
8819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return NULL;
8919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
9019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic inline struct expression *
9219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnew_exp_0 (enum operator op)
9319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
9419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return new_exp (0, op, NULL);
9519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
9619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
9719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic inline struct expression *
9819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnew_exp_1 (enum operator op, struct expression *right)
9919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
10019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  struct expression *args[1];
10119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  args[0] = right;
10319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return new_exp (1, op, args);
10419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
10519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
10619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic struct expression *
10719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnew_exp_2 (enum operator op, struct expression *left, struct expression *right)
10819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
10919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  struct expression *args[2];
11019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  args[0] = left;
11219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  args[1] = right;
11319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return new_exp (2, op, args);
11419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
11519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
11619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic inline struct expression *
11719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectnew_exp_3 (enum operator op, struct expression *bexp,
11819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	   struct expression *tbranch, struct expression *fbranch)
11919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
12019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  struct expression *args[3];
12119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  args[0] = bexp;
12319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  args[1] = tbranch;
12419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  args[2] = fbranch;
12519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return new_exp (3, op, args);
12619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
12719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
12819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%}
12919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
13019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project/* This declares that all operators have the same associativity and the
13119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   precedence order as in C.  See [Harbison, Steele: C, A Reference Manual].
13219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   There is no unary minus and no bitwise operators.
13319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   Operators with the same syntactic behaviour have been merged into a single
13419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project   token, to save space in the array generated by bison.  */
13519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%right '?'		/*   ?		*/
13619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%left '|'		/*   ||		*/
13719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%left '&'		/*   &&		*/
13819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%left EQUOP2		/*   == !=	*/
13919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%left CMPOP2		/*   < > <= >=	*/
14019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%left ADDOP2		/*   + -	*/
14119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%left MULOP2		/*   * / %	*/
14219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%right '!'		/*   !		*/
14319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
14419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%token <op> EQUOP2 CMPOP2 ADDOP2 MULOP2
14519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%token <num> NUMBER
14619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%type <exp> exp
14719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
14819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%%
14919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
15019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstart:	  exp
15119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
15219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    if ($1 == NULL)
15319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      YYABORT;
15419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    ((struct parse_args *) arg)->res = $1;
15519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
15619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	;
15719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
15819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectexp:	  exp '?' exp ':' exp
15919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
16019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_3 (qmop, $1, $3, $5);
16119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
16219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| exp '|' exp
16319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
16419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_2 (lor, $1, $3);
16519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
16619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| exp '&' exp
16719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
16819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_2 (land, $1, $3);
16919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
17019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| exp EQUOP2 exp
17119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
17219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_2 ($2, $1, $3);
17319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
17419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| exp CMPOP2 exp
17519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
17619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_2 ($2, $1, $3);
17719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
17819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| exp ADDOP2 exp
17919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
18019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_2 ($2, $1, $3);
18119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
18219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| exp MULOP2 exp
18319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
18419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_2 ($2, $1, $3);
18519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
18619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| '!' exp
18719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
18819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_1 (lnot, $2);
18919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
19019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| 'n'
19119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
19219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = new_exp_0 (var);
19319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
19419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| NUMBER
19519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
19619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    if (($$ = new_exp_0 (num)) != NULL)
19719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	      $$->val.num = $1;
19819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
19919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	| '(' exp ')'
20019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
20119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    $$ = $2;
20219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
20319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	;
20419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project%%
20619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
20719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectvoid
20819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectinternal_function
20919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source ProjectFREE_EXPRESSION (struct expression *exp)
21019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
21119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  if (exp == NULL)
21219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    return;
21319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
21419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Handle the recursive case.  */
21519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  switch (exp->nargs)
21619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
21719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case 3:
21819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      FREE_EXPRESSION (exp->val.args[2]);
21919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* FALLTHROUGH */
22019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case 2:
22119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      FREE_EXPRESSION (exp->val.args[1]);
22219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* FALLTHROUGH */
22319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case 1:
22419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      FREE_EXPRESSION (exp->val.args[0]);
22519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* FALLTHROUGH */
22619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    default:
22719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
22819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
22919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
23019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  free (exp);
23119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
23219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
23319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
23419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic int
23519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectyylex (YYSTYPE *lval, const char **pexp)
23619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
23719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  const char *exp = *pexp;
23819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  int result;
23919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
24019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  while (1)
24119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
24219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (exp[0] == '\0')
24319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
24419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  *pexp = exp;
24519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  return YYEOF;
24619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
24719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
24819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (exp[0] != ' ' && exp[0] != '\t')
24919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	break;
25019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      ++exp;
25219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
25319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
25419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  result = *exp++;
25519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  switch (result)
25619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    {
25719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '0': case '1': case '2': case '3': case '4':
25819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '5': case '6': case '7': case '8': case '9':
25919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      {
26019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	unsigned long int n = result - '0';
26119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	while (exp[0] >= '0' && exp[0] <= '9')
26219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  {
26319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    n *= 10;
26419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    n += exp[0] - '0';
26519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	    ++exp;
26619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  }
26719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	lval->num = n;
26819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	result = NUMBER;
26919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      }
27019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
27119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
27219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '=':
27319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (exp[0] == '=')
27419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
27519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  ++exp;
27619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  lval->op = equal;
27719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  result = EQUOP2;
27819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
27919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
28019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	result = YYERRCODE;
28119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
28219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
28319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '!':
28419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (exp[0] == '=')
28519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
28619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  ++exp;
28719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  lval->op = not_equal;
28819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  result = EQUOP2;
28919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
29019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
29119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
29219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '&':
29319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '|':
29419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (exp[0] == result)
29519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	++exp;
29619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
29719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	result = YYERRCODE;
29819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
29919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
30019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '<':
30119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (exp[0] == '=')
30219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
30319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  ++exp;
30419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  lval->op = less_or_equal;
30519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
30619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
30719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	lval->op = less_than;
30819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = CMPOP2;
30919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
31019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
31119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '>':
31219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      if (exp[0] == '=')
31319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	{
31419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  ++exp;
31519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	  lval->op = greater_or_equal;
31619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	}
31719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      else
31819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project	lval->op = greater_than;
31919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = CMPOP2;
32019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
32119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '*':
32319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      lval->op = mult;
32419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = MULOP2;
32519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
32619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
32719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '/':
32819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      lval->op = divide;
32919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = MULOP2;
33019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
33119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
33219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '%':
33319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      lval->op = module;
33419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = MULOP2;
33519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
33619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
33719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '+':
33819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      lval->op = plus;
33919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = ADDOP2;
34019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
34119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
34219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '-':
34319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      lval->op = minus;
34419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = ADDOP2;
34519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
34619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
34719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case 'n':
34819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '?':
34919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case ':':
35019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '(':
35119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case ')':
35219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* Nothing, just return the character.  */
35319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
35419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
35519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case ';':
35619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '\n':
35719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    case '\0':
35819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      /* Be safe and let the user call this function again.  */
35919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      --exp;
36019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = YYEOF;
36119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
36219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
36319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    default:
36419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      result = YYERRCODE;
36519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#if YYDEBUG != 0
36619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      --exp;
36719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project#endif
36819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project      break;
36919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project    }
37019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  *pexp = exp;
37219dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37319dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  return result;
37419dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
37519dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37619dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project
37719dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectstatic void
37819dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Projectyyerror (const char *str)
37919dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project{
38019dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project  /* Do nothing.  We don't print error messages here.  */
38119dacda2b02bb08c0ffb649f84526b249c749279The Android Open Source Project}
382