source: trunk/third/gaim-encryption/intl/plural.c @ 22512

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