fix up gfarris's mistaken commit to gnome-common (revert to yesterday's versions)
[platform/upstream/gnome-common.git] / intl / plural.c
1
2 /*  A Bison parser, made from plural.y
3     by GNU Bison version 1.28  */
4
5 #define YYBISON 1  /* Identify Bison output.  */
6
7 #define yyparse __gettextparse
8 #define yylex __gettextlex
9 #define yyerror __gettexterror
10 #define yylval __gettextlval
11 #define yychar __gettextchar
12 #define yydebug __gettextdebug
13 #define yynerrs __gettextnerrs
14 #define EQUOP2  257
15 #define CMPOP2  258
16 #define ADDOP2  259
17 #define MULOP2  260
18 #define NUMBER  261
19
20 #line 1 "plural.y"
21
22 /* Expression parsing for plural form selection.
23    Copyright (C) 2000, 2001 Free Software Foundation, Inc.
24    Written by Ulrich Drepper <drepper@cygnus.com>, 2000.
25
26    This program is free software; you can redistribute it and/or modify
27    it under the terms of the GNU General Public License as published by
28    the Free Software Foundation; either version 2, or (at your option)
29    any later version.
30
31    This program is distributed in the hope that it will be useful,
32    but WITHOUT ANY WARRANTY; without even the implied warranty of
33    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34    GNU General Public License for more details.
35
36    You should have received a copy of the GNU General Public License
37    along with this program; if not, write to the Free Software Foundation,
38    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
39
40 /* The bison generated parser uses alloca.  AIX 3 forces us to put this
41    declaration at the beginning of the file.  The declaration in bison's
42    skeleton file comes too late.  This must come before <config.h>
43    because <config.h> may include arbitrary system headers.  */
44 #if defined _AIX && !defined __GNUC__
45  #pragma alloca
46 #endif
47
48 #ifdef HAVE_CONFIG_H
49 # include <config.h>
50 #endif
51
52 #include <stdlib.h>
53 #include "gettextP.h"
54
55 /* Names for the libintl functions are a problem.  They must not clash
56    with existing names and they should follow ANSI C.  But this source
57    code is also used in GNU C Library where the names have a __
58    prefix.  So we have to make a difference here.  */
59 #ifdef _LIBC
60 # define FREE_EXPRESSION __gettext_free_exp
61 #else
62 # define FREE_EXPRESSION gettext_free_exp__
63 # define __gettextparse gettextparse__
64 #endif
65
66 #define YYLEX_PARAM     &((struct parse_args *) arg)->cp
67 #define YYPARSE_PARAM   arg
68
69 #line 52 "plural.y"
70 typedef union {
71   unsigned long int num;
72   enum operator op;
73   struct expression *exp;
74 } YYSTYPE;
75 #line 58 "plural.y"
76
77 /* Prototypes for local functions.  */
78 static struct expression *new_exp PARAMS ((int nargs, enum operator op,
79                                            struct expression * const *args));
80 static inline struct expression *new_exp_0 PARAMS ((enum operator op));
81 static inline struct expression *new_exp_1 PARAMS ((enum operator op,
82                                                    struct expression *right));
83 static struct expression *new_exp_2 PARAMS ((enum operator op,
84                                              struct expression *left,
85                                              struct expression *right));
86 static inline struct expression *new_exp_3 PARAMS ((enum operator op,
87                                                    struct expression *bexp,
88                                                    struct expression *tbranch,
89                                                    struct expression *fbranch));
90 static int yylex PARAMS ((YYSTYPE *lval, const char **pexp));
91 static void yyerror PARAMS ((const char *str));
92
93 /* Allocation of expressions.  */
94
95 static struct expression *
96 new_exp (nargs, op, args)
97      int nargs;
98      enum operator op;
99      struct expression * const *args;
100 {
101   int i;
102   struct expression *newp;
103
104   /* If any of the argument could not be malloc'ed, just return NULL.  */
105   for (i = nargs - 1; i >= 0; i--)
106     if (args[i] == NULL)
107       goto fail;
108
109   /* Allocate a new expression.  */
110   newp = (struct expression *) malloc (sizeof (*newp));
111   if (newp != NULL)
112     {
113       newp->nargs = nargs;
114       newp->operation = op;
115       for (i = nargs - 1; i >= 0; i--)
116         newp->val.args[i] = args[i];
117       return newp;
118     }
119
120  fail:
121   for (i = nargs - 1; i >= 0; i--)
122     FREE_EXPRESSION (args[i]);
123
124   return NULL;
125 }
126
127 static inline struct expression *
128 new_exp_0 (op)
129      enum operator op;
130 {
131   return new_exp (0, op, NULL);
132 }
133
134 static inline struct expression *
135 new_exp_1 (op, right)
136      enum operator op;
137      struct expression *right;
138 {
139   struct expression *args[1];
140
141   args[0] = right;
142   return new_exp (1, op, args);
143 }
144
145 static struct expression *
146 new_exp_2 (op, left, right)
147      enum operator op;
148      struct expression *left;
149      struct expression *right;
150 {
151   struct expression *args[2];
152
153   args[0] = left;
154   args[1] = right;
155   return new_exp (2, op, args);
156 }
157
158 static inline struct expression *
159 new_exp_3 (op, bexp, tbranch, fbranch)
160      enum operator op;
161      struct expression *bexp;
162      struct expression *tbranch;
163      struct expression *fbranch;
164 {
165   struct expression *args[3];
166
167   args[0] = bexp;
168   args[1] = tbranch;
169   args[2] = fbranch;
170   return new_exp (3, op, args);
171 }
172
173 #include <stdio.h>
174
175 #ifndef __cplusplus
176 #ifndef __STDC__
177 #define const
178 #endif
179 #endif
180
181
182
183 #define YYFINAL         27
184 #define YYFLAG          -32768
185 #define YYNTBASE        16
186
187 #define YYTRANSLATE(x) ((unsigned)(x) <= 261 ? yytranslate[x] : 18)
188
189 static const char yytranslate[] = {     0,
190      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
191      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
192      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
193      2,     2,    10,     2,     2,     2,     2,     5,     2,    14,
194     15,     2,     2,     2,     2,     2,     2,     2,     2,     2,
195      2,     2,     2,     2,     2,     2,     2,    12,     2,     2,
196      2,     2,     3,     2,     2,     2,     2,     2,     2,     2,
197      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
198      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
199      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
200      2,     2,     2,     2,     2,     2,     2,     2,     2,    13,
201      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
202      2,     2,     2,     4,     2,     2,     2,     2,     2,     2,
203      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
204      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
205      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
206      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
207      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
208      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
209      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
210      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
211      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
212      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
213      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
214      2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
215      2,     2,     2,     2,     2,     1,     6,     7,     8,     9,
216     11
217 };
218
219 #if YYDEBUG != 0
220 static const short yyprhs[] = {     0,
221      0,     2,     8,    12,    16,    20,    24,    28,    32,    35,
222     37,    39
223 };
224
225 static const short yyrhs[] = {    17,
226      0,    17,     3,    17,    12,    17,     0,    17,     4,    17,
227      0,    17,     5,    17,     0,    17,     6,    17,     0,    17,
228      7,    17,     0,    17,     8,    17,     0,    17,     9,    17,
229      0,    10,    17,     0,    13,     0,    11,     0,    14,    17,
230     15,     0
231 };
232
233 #endif
234
235 #if YYDEBUG != 0
236 static const short yyrline[] = { 0,
237    177,   185,   189,   193,   197,   201,   205,   209,   213,   217,
238    221,   226
239 };
240 #endif
241
242
243 #if YYDEBUG != 0 || defined (YYERROR_VERBOSE)
244
245 static const char * const yytname[] = {   "$","error","$undefined.","'?'","'|'",
246 "'&'","EQUOP2","CMPOP2","ADDOP2","MULOP2","'!'","NUMBER","':'","'n'","'('","')'",
247 "start","exp", NULL
248 };
249 #endif
250
251 static const short yyr1[] = {     0,
252     16,    17,    17,    17,    17,    17,    17,    17,    17,    17,
253     17,    17
254 };
255
256 static const short yyr2[] = {     0,
257      1,     5,     3,     3,     3,     3,     3,     3,     2,     1,
258      1,     3
259 };
260
261 static const short yydefact[] = {     0,
262      0,    11,    10,     0,     1,     9,     0,     0,     0,     0,
263      0,     0,     0,     0,    12,     0,     3,     4,     5,     6,
264      7,     8,     0,     2,     0,     0,     0
265 };
266
267 static const short yydefgoto[] = {    25,
268      5
269 };
270
271 static const short yypact[] = {    -9,
272     -9,-32768,-32768,    -9,    34,-32768,    11,    -9,    -9,    -9,
273     -9,    -9,    -9,    -9,-32768,    24,    39,    43,    16,    26,
274     -3,-32768,    -9,    34,    21,    53,-32768
275 };
276
277 static const short yypgoto[] = {-32768,
278     -1
279 };
280
281
282 #define YYLAST          53
283
284
285 static const short yytable[] = {     6,
286      1,     2,     7,     3,     4,    14,    16,    17,    18,    19,
287     20,    21,    22,     8,     9,    10,    11,    12,    13,    14,
288     26,    24,    12,    13,    14,    15,     8,     9,    10,    11,
289     12,    13,    14,    13,    14,    23,     8,     9,    10,    11,
290     12,    13,    14,    10,    11,    12,    13,    14,    11,    12,
291     13,    14,    27
292 };
293
294 static const short yycheck[] = {     1,
295     10,    11,     4,    13,    14,     9,     8,     9,    10,    11,
296     12,    13,    14,     3,     4,     5,     6,     7,     8,     9,
297      0,    23,     7,     8,     9,    15,     3,     4,     5,     6,
298      7,     8,     9,     8,     9,    12,     3,     4,     5,     6,
299      7,     8,     9,     5,     6,     7,     8,     9,     6,     7,
300      8,     9,     0
301 };
302 #define YYPURE 1
303
304 /* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
305 #line 3 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple"
306 /* This file comes from bison-1.28.  */
307
308 /* Skeleton output parser for bison,
309    Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc.
310
311    This program is free software; you can redistribute it and/or modify
312    it under the terms of the GNU General Public License as published by
313    the Free Software Foundation; either version 2, or (at your option)
314    any later version.
315
316    This program is distributed in the hope that it will be useful,
317    but WITHOUT ANY WARRANTY; without even the implied warranty of
318    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
319    GNU General Public License for more details.
320
321    You should have received a copy of the GNU General Public License
322    along with this program; if not, write to the Free Software
323    Foundation, Inc., 59 Temple Place - Suite 330,
324    Boston, MA 02111-1307, USA.  */
325
326 /* As a special exception, when this file is copied by Bison into a
327    Bison output file, you may use that output file without restriction.
328    This special exception was added by the Free Software Foundation
329    in version 1.24 of Bison.  */
330
331 /* This is the parser code that is written into each bison parser
332   when the %semantic_parser declaration is not specified in the grammar.
333   It was written by Richard Stallman by simplifying the hairy parser
334   used when %semantic_parser is specified.  */
335
336 #ifndef YYSTACK_USE_ALLOCA
337 #ifdef alloca
338 #define YYSTACK_USE_ALLOCA
339 #else /* alloca not defined */
340 #ifdef __GNUC__
341 #define YYSTACK_USE_ALLOCA
342 #define alloca __builtin_alloca
343 #else /* not GNU C.  */
344 #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386))
345 #define YYSTACK_USE_ALLOCA
346 #include <alloca.h>
347 #else /* not sparc */
348 /* We think this test detects Watcom and Microsoft C.  */
349 /* This used to test MSDOS, but that is a bad idea
350    since that symbol is in the user namespace.  */
351 #if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__)
352 #if 0 /* No need for malloc.h, which pollutes the namespace;
353          instead, just don't use alloca.  */
354 #include <malloc.h>
355 #endif
356 #else /* not MSDOS, or __TURBOC__ */
357 #if defined(_AIX)
358 /* I don't know what this was needed for, but it pollutes the namespace.
359    So I turned it off.   rms, 2 May 1997.  */
360 /* #include <malloc.h>  */
361  #pragma alloca
362 #define YYSTACK_USE_ALLOCA
363 #else /* not MSDOS, or __TURBOC__, or _AIX */
364 #if 0
365 #ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up,
366                  and on HPUX 10.  Eventually we can turn this on.  */
367 #define YYSTACK_USE_ALLOCA
368 #define alloca __builtin_alloca
369 #endif /* __hpux */
370 #endif
371 #endif /* not _AIX */
372 #endif /* not MSDOS, or __TURBOC__ */
373 #endif /* not sparc */
374 #endif /* not GNU C */
375 #endif /* alloca not defined */
376 #endif /* YYSTACK_USE_ALLOCA not defined */
377
378 #ifdef YYSTACK_USE_ALLOCA
379 #define YYSTACK_ALLOC alloca
380 #else
381 #define YYSTACK_ALLOC malloc
382 #endif
383
384 /* Note: there must be only one dollar sign in this file.
385    It is replaced by the list of actions, each action
386    as one case of the switch.  */
387
388 #define yyerrok         (yyerrstatus = 0)
389 #define yyclearin       (yychar = YYEMPTY)
390 #define YYEMPTY         -2
391 #define YYEOF           0
392 #define YYACCEPT        goto yyacceptlab
393 #define YYABORT         goto yyabortlab
394 #define YYERROR         goto yyerrlab1
395 /* Like YYERROR except do call yyerror.
396    This remains here temporarily to ease the
397    transition to the new meaning of YYERROR, for GCC.
398    Once GCC version 2 has supplanted version 1, this can go.  */
399 #define YYFAIL          goto yyerrlab
400 #define YYRECOVERING()  (!!yyerrstatus)
401 #define YYBACKUP(token, value) \
402 do                                                              \
403   if (yychar == YYEMPTY && yylen == 1)                          \
404     { yychar = (token), yylval = (value);                       \
405       yychar1 = YYTRANSLATE (yychar);                           \
406       YYPOPSTACK;                                               \
407       goto yybackup;                                            \
408     }                                                           \
409   else                                                          \
410     { yyerror ("syntax error: cannot back up"); YYERROR; }      \
411 while (0)
412
413 #define YYTERROR        1
414 #define YYERRCODE       256
415
416 #ifndef YYPURE
417 #define YYLEX           yylex()
418 #endif
419
420 #ifdef YYPURE
421 #ifdef YYLSP_NEEDED
422 #ifdef YYLEX_PARAM
423 #define YYLEX           yylex(&yylval, &yylloc, YYLEX_PARAM)
424 #else
425 #define YYLEX           yylex(&yylval, &yylloc)
426 #endif
427 #else /* not YYLSP_NEEDED */
428 #ifdef YYLEX_PARAM
429 #define YYLEX           yylex(&yylval, YYLEX_PARAM)
430 #else
431 #define YYLEX           yylex(&yylval)
432 #endif
433 #endif /* not YYLSP_NEEDED */
434 #endif
435
436 /* If nonreentrant, generate the variables here */
437
438 #ifndef YYPURE
439
440 int     yychar;                 /*  the lookahead symbol                */
441 YYSTYPE yylval;                 /*  the semantic value of the           */
442                                 /*  lookahead symbol                    */
443
444 #ifdef YYLSP_NEEDED
445 YYLTYPE yylloc;                 /*  location data for the lookahead     */
446                                 /*  symbol                              */
447 #endif
448
449 int yynerrs;                    /*  number of parse errors so far       */
450 #endif  /* not YYPURE */
451
452 #if YYDEBUG != 0
453 int yydebug;                    /*  nonzero means print parse trace     */
454 /* Since this is uninitialized, it does not stop multiple parsers
455    from coexisting.  */
456 #endif
457
458 /*  YYINITDEPTH indicates the initial size of the parser's stacks       */
459
460 #ifndef YYINITDEPTH
461 #define YYINITDEPTH 200
462 #endif
463
464 /*  YYMAXDEPTH is the maximum size the stacks can grow to
465     (effective only if the built-in stack extension method is used).  */
466
467 #if YYMAXDEPTH == 0
468 #undef YYMAXDEPTH
469 #endif
470
471 #ifndef YYMAXDEPTH
472 #define YYMAXDEPTH 10000
473 #endif
474 \f
475 /* Define __yy_memcpy.  Note that the size argument
476    should be passed with type unsigned int, because that is what the non-GCC
477    definitions require.  With GCC, __builtin_memcpy takes an arg
478    of type size_t, but it can handle unsigned int.  */
479
480 #if __GNUC__ > 1                /* GNU C and GNU C++ define this.  */
481 #define __yy_memcpy(TO,FROM,COUNT)      __builtin_memcpy(TO,FROM,COUNT)
482 #else                           /* not GNU C or C++ */
483 #ifndef __cplusplus
484
485 /* This is the most reliable way to avoid incompatibilities
486    in available built-in functions on various systems.  */
487 static void
488 __yy_memcpy (to, from, count)
489      char *to;
490      char *from;
491      unsigned int count;
492 {
493   register char *f = from;
494   register char *t = to;
495   register int i = count;
496
497   while (i-- > 0)
498     *t++ = *f++;
499 }
500
501 #else /* __cplusplus */
502
503 /* This is the most reliable way to avoid incompatibilities
504    in available built-in functions on various systems.  */
505 static void
506 __yy_memcpy (char *to, char *from, unsigned int count)
507 {
508   register char *t = to;
509   register char *f = from;
510   register int i = count;
511
512   while (i-- > 0)
513     *t++ = *f++;
514 }
515
516 #endif
517 #endif
518 \f
519 #line 217 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple"
520
521 /* The user can define YYPARSE_PARAM as the name of an argument to be passed
522    into yyparse.  The argument should have type void *.
523    It should actually point to an object.
524    Grammar actions can access the variable by casting it
525    to the proper pointer type.  */
526
527 #ifdef YYPARSE_PARAM
528 #ifdef __cplusplus
529 #define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
530 #define YYPARSE_PARAM_DECL
531 #else /* not __cplusplus */
532 #define YYPARSE_PARAM_ARG YYPARSE_PARAM
533 #define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
534 #endif /* not __cplusplus */
535 #else /* not YYPARSE_PARAM */
536 #define YYPARSE_PARAM_ARG
537 #define YYPARSE_PARAM_DECL
538 #endif /* not YYPARSE_PARAM */
539
540 /* Prevent warning if -Wstrict-prototypes.  */
541 #ifdef __GNUC__
542 #ifdef YYPARSE_PARAM
543 int yyparse (void *);
544 #else
545 int yyparse (void);
546 #endif
547 #endif
548
549 int
550 yyparse(YYPARSE_PARAM_ARG)
551      YYPARSE_PARAM_DECL
552 {
553   register int yystate;
554   register int yyn;
555   register short *yyssp;
556   register YYSTYPE *yyvsp;
557   int yyerrstatus;      /*  number of tokens to shift before error messages enabled */
558   int yychar1 = 0;              /*  lookahead token as an internal (translated) token number */
559
560   short yyssa[YYINITDEPTH];     /*  the state stack                     */
561   YYSTYPE yyvsa[YYINITDEPTH];   /*  the semantic value stack            */
562
563   short *yyss = yyssa;          /*  refer to the stacks thru separate pointers */
564   YYSTYPE *yyvs = yyvsa;        /*  to allow yyoverflow to reallocate them elsewhere */
565
566 #ifdef YYLSP_NEEDED
567   YYLTYPE yylsa[YYINITDEPTH];   /*  the location stack                  */
568   YYLTYPE *yyls = yylsa;
569   YYLTYPE *yylsp;
570
571 #define YYPOPSTACK   (yyvsp--, yyssp--, yylsp--)
572 #else
573 #define YYPOPSTACK   (yyvsp--, yyssp--)
574 #endif
575
576   int yystacksize = YYINITDEPTH;
577   int yyfree_stacks = 0;
578
579 #ifdef YYPURE
580   int yychar;
581   YYSTYPE yylval;
582   int yynerrs;
583 #ifdef YYLSP_NEEDED
584   YYLTYPE yylloc;
585 #endif
586 #endif
587
588   YYSTYPE yyval;                /*  the variable used to return         */
589                                 /*  semantic values from the action     */
590                                 /*  routines                            */
591
592   int yylen;
593
594 #if YYDEBUG != 0
595   if (yydebug)
596     fprintf(stderr, "Starting parse\n");
597 #endif
598
599   yystate = 0;
600   yyerrstatus = 0;
601   yynerrs = 0;
602   yychar = YYEMPTY;             /* Cause a token to be read.  */
603
604   /* Initialize stack pointers.
605      Waste one element of value and location stack
606      so that they stay on the same level as the state stack.
607      The wasted elements are never initialized.  */
608
609   yyssp = yyss - 1;
610   yyvsp = yyvs;
611 #ifdef YYLSP_NEEDED
612   yylsp = yyls;
613 #endif
614
615 /* Push a new state, which is found in  yystate  .  */
616 /* In all cases, when you get here, the value and location stacks
617    have just been pushed. so pushing a state here evens the stacks.  */
618 yynewstate:
619
620   *++yyssp = yystate;
621
622   if (yyssp >= yyss + yystacksize - 1)
623     {
624       /* Give user a chance to reallocate the stack */
625       /* Use copies of these so that the &'s don't force the real ones into memory. */
626       YYSTYPE *yyvs1 = yyvs;
627       short *yyss1 = yyss;
628 #ifdef YYLSP_NEEDED
629       YYLTYPE *yyls1 = yyls;
630 #endif
631
632       /* Get the current used size of the three stacks, in elements.  */
633       int size = yyssp - yyss + 1;
634
635 #ifdef yyoverflow
636       /* Each stack pointer address is followed by the size of
637          the data in use in that stack, in bytes.  */
638 #ifdef YYLSP_NEEDED
639       /* This used to be a conditional around just the two extra args,
640          but that might be undefined if yyoverflow is a macro.  */
641       yyoverflow("parser stack overflow",
642                  &yyss1, size * sizeof (*yyssp),
643                  &yyvs1, size * sizeof (*yyvsp),
644                  &yyls1, size * sizeof (*yylsp),
645                  &yystacksize);
646 #else
647       yyoverflow("parser stack overflow",
648                  &yyss1, size * sizeof (*yyssp),
649                  &yyvs1, size * sizeof (*yyvsp),
650                  &yystacksize);
651 #endif
652
653       yyss = yyss1; yyvs = yyvs1;
654 #ifdef YYLSP_NEEDED
655       yyls = yyls1;
656 #endif
657 #else /* no yyoverflow */
658       /* Extend the stack our own way.  */
659       if (yystacksize >= YYMAXDEPTH)
660         {
661           yyerror("parser stack overflow");
662           if (yyfree_stacks)
663             {
664               free (yyss);
665               free (yyvs);
666 #ifdef YYLSP_NEEDED
667               free (yyls);
668 #endif
669             }
670           return 2;
671         }
672       yystacksize *= 2;
673       if (yystacksize > YYMAXDEPTH)
674         yystacksize = YYMAXDEPTH;
675 #ifndef YYSTACK_USE_ALLOCA
676       yyfree_stacks = 1;
677 #endif
678       yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp));
679       __yy_memcpy ((char *)yyss, (char *)yyss1,
680                    size * (unsigned int) sizeof (*yyssp));
681       yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp));
682       __yy_memcpy ((char *)yyvs, (char *)yyvs1,
683                    size * (unsigned int) sizeof (*yyvsp));
684 #ifdef YYLSP_NEEDED
685       yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp));
686       __yy_memcpy ((char *)yyls, (char *)yyls1,
687                    size * (unsigned int) sizeof (*yylsp));
688 #endif
689 #endif /* no yyoverflow */
690
691       yyssp = yyss + size - 1;
692       yyvsp = yyvs + size - 1;
693 #ifdef YYLSP_NEEDED
694       yylsp = yyls + size - 1;
695 #endif
696
697 #if YYDEBUG != 0
698       if (yydebug)
699         fprintf(stderr, "Stack size increased to %d\n", yystacksize);
700 #endif
701
702       if (yyssp >= yyss + yystacksize - 1)
703         YYABORT;
704     }
705
706 #if YYDEBUG != 0
707   if (yydebug)
708     fprintf(stderr, "Entering state %d\n", yystate);
709 #endif
710
711   goto yybackup;
712  yybackup:
713
714 /* Do appropriate processing given the current state.  */
715 /* Read a lookahead token if we need one and don't already have one.  */
716 /* yyresume: */
717
718   /* First try to decide what to do without reference to lookahead token.  */
719
720   yyn = yypact[yystate];
721   if (yyn == YYFLAG)
722     goto yydefault;
723
724   /* Not known => get a lookahead token if don't already have one.  */
725
726   /* yychar is either YYEMPTY or YYEOF
727      or a valid token in external form.  */
728
729   if (yychar == YYEMPTY)
730     {
731 #if YYDEBUG != 0
732       if (yydebug)
733         fprintf(stderr, "Reading a token: ");
734 #endif
735       yychar = YYLEX;
736     }
737
738   /* Convert token to internal form (in yychar1) for indexing tables with */
739
740   if (yychar <= 0)              /* This means end of input. */
741     {
742       yychar1 = 0;
743       yychar = YYEOF;           /* Don't call YYLEX any more */
744
745 #if YYDEBUG != 0
746       if (yydebug)
747         fprintf(stderr, "Now at end of input.\n");
748 #endif
749     }
750   else
751     {
752       yychar1 = YYTRANSLATE(yychar);
753
754 #if YYDEBUG != 0
755       if (yydebug)
756         {
757           fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]);
758           /* Give the individual parser a way to print the precise meaning
759              of a token, for further debugging info.  */
760 #ifdef YYPRINT
761           YYPRINT (stderr, yychar, yylval);
762 #endif
763           fprintf (stderr, ")\n");
764         }
765 #endif
766     }
767
768   yyn += yychar1;
769   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
770     goto yydefault;
771
772   yyn = yytable[yyn];
773
774   /* yyn is what to do for this token type in this state.
775      Negative => reduce, -yyn is rule number.
776      Positive => shift, yyn is new state.
777        New state is final state => don't bother to shift,
778        just return success.
779      0, or most negative number => error.  */
780
781   if (yyn < 0)
782     {
783       if (yyn == YYFLAG)
784         goto yyerrlab;
785       yyn = -yyn;
786       goto yyreduce;
787     }
788   else if (yyn == 0)
789     goto yyerrlab;
790
791   if (yyn == YYFINAL)
792     YYACCEPT;
793
794   /* Shift the lookahead token.  */
795
796 #if YYDEBUG != 0
797   if (yydebug)
798     fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
799 #endif
800
801   /* Discard the token being shifted unless it is eof.  */
802   if (yychar != YYEOF)
803     yychar = YYEMPTY;
804
805   *++yyvsp = yylval;
806 #ifdef YYLSP_NEEDED
807   *++yylsp = yylloc;
808 #endif
809
810   /* count tokens shifted since error; after three, turn off error status.  */
811   if (yyerrstatus) yyerrstatus--;
812
813   yystate = yyn;
814   goto yynewstate;
815
816 /* Do the default action for the current state.  */
817 yydefault:
818
819   yyn = yydefact[yystate];
820   if (yyn == 0)
821     goto yyerrlab;
822
823 /* Do a reduction.  yyn is the number of a rule to reduce with.  */
824 yyreduce:
825   yylen = yyr2[yyn];
826   if (yylen > 0)
827     yyval = yyvsp[1-yylen]; /* implement default value of the action */
828
829 #if YYDEBUG != 0
830   if (yydebug)
831     {
832       int i;
833
834       fprintf (stderr, "Reducing via rule %d (line %d), ",
835                yyn, yyrline[yyn]);
836
837       /* Print the symbols being reduced, and their result.  */
838       for (i = yyprhs[yyn]; yyrhs[i] > 0; i++)
839         fprintf (stderr, "%s ", yytname[yyrhs[i]]);
840       fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]);
841     }
842 #endif
843
844
845   switch (yyn) {
846
847 case 1:
848 #line 178 "plural.y"
849 {
850             if (yyvsp[0].exp == NULL)
851               YYABORT;
852             ((struct parse_args *) arg)->res = yyvsp[0].exp;
853           ;
854     break;}
855 case 2:
856 #line 186 "plural.y"
857 {
858             yyval.exp = new_exp_3 (qmop, yyvsp[-4].exp, yyvsp[-2].exp, yyvsp[0].exp);
859           ;
860     break;}
861 case 3:
862 #line 190 "plural.y"
863 {
864             yyval.exp = new_exp_2 (lor, yyvsp[-2].exp, yyvsp[0].exp);
865           ;
866     break;}
867 case 4:
868 #line 194 "plural.y"
869 {
870             yyval.exp = new_exp_2 (land, yyvsp[-2].exp, yyvsp[0].exp);
871           ;
872     break;}
873 case 5:
874 #line 198 "plural.y"
875 {
876             yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
877           ;
878     break;}
879 case 6:
880 #line 202 "plural.y"
881 {
882             yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
883           ;
884     break;}
885 case 7:
886 #line 206 "plural.y"
887 {
888             yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
889           ;
890     break;}
891 case 8:
892 #line 210 "plural.y"
893 {
894             yyval.exp = new_exp_2 (yyvsp[-1].op, yyvsp[-2].exp, yyvsp[0].exp);
895           ;
896     break;}
897 case 9:
898 #line 214 "plural.y"
899 {
900             yyval.exp = new_exp_1 (lnot, yyvsp[0].exp);
901           ;
902     break;}
903 case 10:
904 #line 218 "plural.y"
905 {
906             yyval.exp = new_exp_0 (var);
907           ;
908     break;}
909 case 11:
910 #line 222 "plural.y"
911 {
912             if ((yyval.exp = new_exp_0 (num)) != NULL)
913               yyval.exp->val.num = yyvsp[0].num;
914           ;
915     break;}
916 case 12:
917 #line 227 "plural.y"
918 {
919             yyval.exp = yyvsp[-1].exp;
920           ;
921     break;}
922 }
923    /* the action file gets copied in in place of this dollarsign */
924 #line 543 "/home/haible/gnu/arch/linuxlibc6/share/bison.simple"
925 \f
926   yyvsp -= yylen;
927   yyssp -= yylen;
928 #ifdef YYLSP_NEEDED
929   yylsp -= yylen;
930 #endif
931
932 #if YYDEBUG != 0
933   if (yydebug)
934     {
935       short *ssp1 = yyss - 1;
936       fprintf (stderr, "state stack now");
937       while (ssp1 != yyssp)
938         fprintf (stderr, " %d", *++ssp1);
939       fprintf (stderr, "\n");
940     }
941 #endif
942
943   *++yyvsp = yyval;
944
945 #ifdef YYLSP_NEEDED
946   yylsp++;
947   if (yylen == 0)
948     {
949       yylsp->first_line = yylloc.first_line;
950       yylsp->first_column = yylloc.first_column;
951       yylsp->last_line = (yylsp-1)->last_line;
952       yylsp->last_column = (yylsp-1)->last_column;
953       yylsp->text = 0;
954     }
955   else
956     {
957       yylsp->last_line = (yylsp+yylen-1)->last_line;
958       yylsp->last_column = (yylsp+yylen-1)->last_column;
959     }
960 #endif
961
962   /* Now "shift" the result of the reduction.
963      Determine what state that goes to,
964      based on the state we popped back to
965      and the rule number reduced by.  */
966
967   yyn = yyr1[yyn];
968
969   yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
970   if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
971     yystate = yytable[yystate];
972   else
973     yystate = yydefgoto[yyn - YYNTBASE];
974
975   goto yynewstate;
976
977 yyerrlab:   /* here on detecting error */
978
979   if (! yyerrstatus)
980     /* If not already recovering from an error, report this error.  */
981     {
982       ++yynerrs;
983
984 #ifdef YYERROR_VERBOSE
985       yyn = yypact[yystate];
986
987       if (yyn > YYFLAG && yyn < YYLAST)
988         {
989           int size = 0;
990           char *msg;
991           int x, count;
992
993           count = 0;
994           /* Start X at -yyn if nec to avoid negative indexes in yycheck.  */
995           for (x = (yyn < 0 ? -yyn : 0);
996                x < (sizeof(yytname) / sizeof(char *)); x++)
997             if (yycheck[x + yyn] == x)
998               size += strlen(yytname[x]) + 15, count++;
999           msg = (char *) malloc(size + 15);
1000           if (msg != 0)
1001             {
1002               strcpy(msg, "parse error");
1003
1004               if (count < 5)
1005                 {
1006                   count = 0;
1007                   for (x = (yyn < 0 ? -yyn : 0);
1008                        x < (sizeof(yytname) / sizeof(char *)); x++)
1009                     if (yycheck[x + yyn] == x)
1010                       {
1011                         strcat(msg, count == 0 ? ", expecting `" : " or `");
1012                         strcat(msg, yytname[x]);
1013                         strcat(msg, "'");
1014                         count++;
1015                       }
1016                 }
1017               yyerror(msg);
1018               free(msg);
1019             }
1020           else
1021             yyerror ("parse error; also virtual memory exceeded");
1022         }
1023       else
1024 #endif /* YYERROR_VERBOSE */
1025         yyerror("parse error");
1026     }
1027
1028   goto yyerrlab1;
1029 yyerrlab1:   /* here on error raised explicitly by an action */
1030
1031   if (yyerrstatus == 3)
1032     {
1033       /* if just tried and failed to reuse lookahead token after an error, discard it.  */
1034
1035       /* return failure if at end of input */
1036       if (yychar == YYEOF)
1037         YYABORT;
1038
1039 #if YYDEBUG != 0
1040       if (yydebug)
1041         fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
1042 #endif
1043
1044       yychar = YYEMPTY;
1045     }
1046
1047   /* Else will try to reuse lookahead token
1048      after shifting the error token.  */
1049
1050   yyerrstatus = 3;              /* Each real token shifted decrements this */
1051
1052   goto yyerrhandle;
1053
1054 yyerrdefault:  /* current state does not do anything special for the error token. */
1055
1056 #if 0
1057   /* This is wrong; only states that explicitly want error tokens
1058      should shift them.  */
1059   yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
1060   if (yyn) goto yydefault;
1061 #endif
1062
1063 yyerrpop:   /* pop the current state because it cannot handle the error token */
1064
1065   if (yyssp == yyss) YYABORT;
1066   yyvsp--;
1067   yystate = *--yyssp;
1068 #ifdef YYLSP_NEEDED
1069   yylsp--;
1070 #endif
1071
1072 #if YYDEBUG != 0
1073   if (yydebug)
1074     {
1075       short *ssp1 = yyss - 1;
1076       fprintf (stderr, "Error: state stack now");
1077       while (ssp1 != yyssp)
1078         fprintf (stderr, " %d", *++ssp1);
1079       fprintf (stderr, "\n");
1080     }
1081 #endif
1082
1083 yyerrhandle:
1084
1085   yyn = yypact[yystate];
1086   if (yyn == YYFLAG)
1087     goto yyerrdefault;
1088
1089   yyn += YYTERROR;
1090   if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
1091     goto yyerrdefault;
1092
1093   yyn = yytable[yyn];
1094   if (yyn < 0)
1095     {
1096       if (yyn == YYFLAG)
1097         goto yyerrpop;
1098       yyn = -yyn;
1099       goto yyreduce;
1100     }
1101   else if (yyn == 0)
1102     goto yyerrpop;
1103
1104   if (yyn == YYFINAL)
1105     YYACCEPT;
1106
1107 #if YYDEBUG != 0
1108   if (yydebug)
1109     fprintf(stderr, "Shifting error token, ");
1110 #endif
1111
1112   *++yyvsp = yylval;
1113 #ifdef YYLSP_NEEDED
1114   *++yylsp = yylloc;
1115 #endif
1116
1117   yystate = yyn;
1118   goto yynewstate;
1119
1120  yyacceptlab:
1121   /* YYACCEPT comes here.  */
1122   if (yyfree_stacks)
1123     {
1124       free (yyss);
1125       free (yyvs);
1126 #ifdef YYLSP_NEEDED
1127       free (yyls);
1128 #endif
1129     }
1130   return 0;
1131
1132  yyabortlab:
1133   /* YYABORT comes here.  */
1134   if (yyfree_stacks)
1135     {
1136       free (yyss);
1137       free (yyvs);
1138 #ifdef YYLSP_NEEDED
1139       free (yyls);
1140 #endif
1141     }
1142   return 1;
1143 }
1144 #line 232 "plural.y"
1145
1146
1147 void
1148 internal_function
1149 FREE_EXPRESSION (exp)
1150      struct expression *exp;
1151 {
1152   if (exp == NULL)
1153     return;
1154
1155   /* Handle the recursive case.  */
1156   switch (exp->nargs)
1157     {
1158     case 3:
1159       FREE_EXPRESSION (exp->val.args[2]);
1160       /* FALLTHROUGH */
1161     case 2:
1162       FREE_EXPRESSION (exp->val.args[1]);
1163       /* FALLTHROUGH */
1164     case 1:
1165       FREE_EXPRESSION (exp->val.args[0]);
1166       /* FALLTHROUGH */
1167     default:
1168       break;
1169     }
1170
1171   free (exp);
1172 }
1173
1174
1175 static int
1176 yylex (lval, pexp)
1177      YYSTYPE *lval;
1178      const char **pexp;
1179 {
1180   const char *exp = *pexp;
1181   int result;
1182
1183   while (1)
1184     {
1185       if (exp[0] == '\0')
1186         {
1187           *pexp = exp;
1188           return YYEOF;
1189         }
1190
1191       if (exp[0] != ' ' && exp[0] != '\t')
1192         break;
1193
1194       ++exp;
1195     }
1196
1197   result = *exp++;
1198   switch (result)
1199     {
1200     case '0': case '1': case '2': case '3': case '4':
1201     case '5': case '6': case '7': case '8': case '9':
1202       {
1203         unsigned long int n = result - '0';
1204         while (exp[0] >= '0' && exp[0] <= '9')
1205           {
1206             n *= 10;
1207             n += exp[0] - '0';
1208             ++exp;
1209           }
1210         lval->num = n;
1211         result = NUMBER;
1212       }
1213       break;
1214
1215     case '=':
1216       if (exp[0] == '=')
1217         {
1218           ++exp;
1219           lval->op = equal;
1220           result = EQUOP2;
1221         }
1222       else
1223         result = YYERRCODE;
1224       break;
1225
1226     case '!':
1227       if (exp[0] == '=')
1228         {
1229           ++exp;
1230           lval->op = not_equal;
1231           result = EQUOP2;
1232         }
1233       break;
1234
1235     case '&':
1236     case '|':
1237       if (exp[0] == result)
1238         ++exp;
1239       else
1240         result = YYERRCODE;
1241       break;
1242
1243     case '<':
1244       if (exp[0] == '=')
1245         {
1246           ++exp;
1247           lval->op = less_or_equal;
1248         }
1249       else
1250         lval->op = less_than;
1251       result = CMPOP2;
1252       break;
1253
1254     case '>':
1255       if (exp[0] == '=')
1256         {
1257           ++exp;
1258           lval->op = greater_or_equal;
1259         }
1260       else
1261         lval->op = greater_than;
1262       result = CMPOP2;
1263       break;
1264
1265     case '*':
1266       lval->op = mult;
1267       result = MULOP2;
1268       break;
1269
1270     case '/':
1271       lval->op = divide;
1272       result = MULOP2;
1273       break;
1274
1275     case '%':
1276       lval->op = module;
1277       result = MULOP2;
1278       break;
1279
1280     case '+':
1281       lval->op = plus;
1282       result = ADDOP2;
1283       break;
1284
1285     case '-':
1286       lval->op = minus;
1287       result = ADDOP2;
1288       break;
1289
1290     case 'n':
1291     case '?':
1292     case ':':
1293     case '(':
1294     case ')':
1295       /* Nothing, just return the character.  */
1296       break;
1297
1298     case ';':
1299     case '\n':
1300     case '\0':
1301       /* Be safe and let the user call this function again.  */
1302       --exp;
1303       result = YYEOF;
1304       break;
1305
1306     default:
1307       result = YYERRCODE;
1308 #if YYDEBUG != 0
1309       --exp;
1310 #endif
1311       break;
1312     }
1313
1314   *pexp = exp;
1315
1316   return result;
1317 }
1318
1319
1320 static void
1321 yyerror (str)
1322      const char *str;
1323 {
1324   /* Do nothing.  We don't print error messages here.  */
1325 }