Initial revision
[openwrt.git] / package / config / zconf.tab.c_shipped
1 /* A Bison parser, made by GNU Bison 1.875a.  */
2
3 /* Skeleton parser for Yacc-like parsing with Bison,
4    Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
5
6    This program is free software; you can redistribute it and/or modify
7    it under the terms of the GNU General Public License as published by
8    the Free Software Foundation; either version 2, or (at your option)
9    any later version.
10
11    This program is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14    GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330,
19    Boston, MA 02111-1307, USA.  */
20
21 /* As a special exception, when this file is copied by Bison into a
22    Bison output file, you may use that output file without restriction.
23    This special exception was added by the Free Software Foundation
24    in version 1.24 of Bison.  */
25
26 /* Written by Richard Stallman by simplifying the original so called
27    ``semantic'' parser.  */
28
29 /* All symbols defined below should begin with yy or YY, to avoid
30    infringing on user name space.  This should be done even for local
31    variables, as they might otherwise be expanded by user macros.
32    There are some unavoidable exceptions within include files to
33    define necessary library symbols; they are noted "INFRINGES ON
34    USER NAME SPACE" below.  */
35
36 /* Identify Bison output.  */
37 #define YYBISON 1
38
39 /* Skeleton name.  */
40 #define YYSKELETON_NAME "yacc.c"
41
42 /* Pure parsers.  */
43 #define YYPURE 0
44
45 /* Using locations.  */
46 #define YYLSP_NEEDED 0
47
48 /* If NAME_PREFIX is specified substitute the variables and functions
49    names.  */
50 #define yyparse zconfparse
51 #define yylex   zconflex
52 #define yyerror zconferror
53 #define yylval  zconflval
54 #define yychar  zconfchar
55 #define yydebug zconfdebug
56 #define yynerrs zconfnerrs
57
58
59 /* Tokens.  */
60 #ifndef YYTOKENTYPE
61 # define YYTOKENTYPE
62    /* Put the tokens into the symbol table, so that GDB and other debuggers
63       know about them.  */
64    enum yytokentype {
65      T_MAINMENU = 258,
66      T_MENU = 259,
67      T_ENDMENU = 260,
68      T_SOURCE = 261,
69      T_CHOICE = 262,
70      T_ENDCHOICE = 263,
71      T_COMMENT = 264,
72      T_CONFIG = 265,
73      T_MENUCONFIG = 266,
74      T_HELP = 267,
75      T_HELPTEXT = 268,
76      T_IF = 269,
77      T_ENDIF = 270,
78      T_DEPENDS = 271,
79      T_REQUIRES = 272,
80      T_OPTIONAL = 273,
81      T_PROMPT = 274,
82      T_DEFAULT = 275,
83      T_TRISTATE = 276,
84      T_DEF_TRISTATE = 277,
85      T_BOOLEAN = 278,
86      T_DEF_BOOLEAN = 279,
87      T_STRING = 280,
88      T_INT = 281,
89      T_HEX = 282,
90      T_WORD = 283,
91      T_WORD_QUOTE = 284,
92      T_UNEQUAL = 285,
93      T_EOF = 286,
94      T_EOL = 287,
95      T_CLOSE_PAREN = 288,
96      T_OPEN_PAREN = 289,
97      T_ON = 290,
98      T_SELECT = 291,
99      T_RANGE = 292,
100      T_OR = 293,
101      T_AND = 294,
102      T_EQUAL = 295,
103      T_NOT = 296
104    };
105 #endif
106 #define T_MAINMENU 258
107 #define T_MENU 259
108 #define T_ENDMENU 260
109 #define T_SOURCE 261
110 #define T_CHOICE 262
111 #define T_ENDCHOICE 263
112 #define T_COMMENT 264
113 #define T_CONFIG 265
114 #define T_MENUCONFIG 266
115 #define T_HELP 267
116 #define T_HELPTEXT 268
117 #define T_IF 269
118 #define T_ENDIF 270
119 #define T_DEPENDS 271
120 #define T_REQUIRES 272
121 #define T_OPTIONAL 273
122 #define T_PROMPT 274
123 #define T_DEFAULT 275
124 #define T_TRISTATE 276
125 #define T_DEF_TRISTATE 277
126 #define T_BOOLEAN 278
127 #define T_DEF_BOOLEAN 279
128 #define T_STRING 280
129 #define T_INT 281
130 #define T_HEX 282
131 #define T_WORD 283
132 #define T_WORD_QUOTE 284
133 #define T_UNEQUAL 285
134 #define T_EOF 286
135 #define T_EOL 287
136 #define T_CLOSE_PAREN 288
137 #define T_OPEN_PAREN 289
138 #define T_ON 290
139 #define T_SELECT 291
140 #define T_RANGE 292
141 #define T_OR 293
142 #define T_AND 294
143 #define T_EQUAL 295
144 #define T_NOT 296
145
146
147
148
149 /* Copy the first part of user declarations.  */
150
151
152 /*
153  * Copyright (C) 2002 Roman Zippel <zippel@linux-m68k.org>
154  * Released under the terms of the GNU GPL v2.0.
155  */
156
157 #include <ctype.h>
158 #include <stdarg.h>
159 #include <stdio.h>
160 #include <stdlib.h>
161 #include <string.h>
162 #include <stdbool.h>
163
164 #define printd(mask, fmt...) if (cdebug & (mask)) printf(fmt)
165
166 #define PRINTD          0x0001
167 #define DEBUG_PARSE     0x0002
168
169 int cdebug = PRINTD;
170
171 extern int zconflex(void);
172 static void zconfprint(const char *err, ...);
173 static void zconferror(const char *err);
174 static bool zconf_endtoken(int token, int starttoken, int endtoken);
175
176 struct symbol *symbol_hash[257];
177
178 #define YYERROR_VERBOSE
179
180
181 /* Enabling traces.  */
182 #ifndef YYDEBUG
183 # define YYDEBUG 0
184 #endif
185
186 /* Enabling verbose error messages.  */
187 #ifdef YYERROR_VERBOSE
188 # undef YYERROR_VERBOSE
189 # define YYERROR_VERBOSE 1
190 #else
191 # define YYERROR_VERBOSE 0
192 #endif
193
194 #if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
195
196 typedef union YYSTYPE {
197         int token;
198         char *string;
199         struct symbol *symbol;
200         struct expr *expr;
201         struct menu *menu;
202 } YYSTYPE;
203 /* Line 191 of yacc.c.  */
204
205 # define yystype YYSTYPE /* obsolescent; will be withdrawn */
206 # define YYSTYPE_IS_DECLARED 1
207 # define YYSTYPE_IS_TRIVIAL 1
208 #endif
209
210
211
212 /* Copy the second part of user declarations.  */
213
214
215 #define LKC_DIRECT_LINK
216 #include "lkc.h"
217
218
219 /* Line 214 of yacc.c.  */
220
221
222 #if ! defined (yyoverflow) || YYERROR_VERBOSE
223
224 /* The parser invokes alloca or malloc; define the necessary symbols.  */
225
226 # if YYSTACK_USE_ALLOCA
227 #  define YYSTACK_ALLOC alloca
228 # else
229 #  ifndef YYSTACK_USE_ALLOCA
230 #   if defined (alloca) || defined (_ALLOCA_H)
231 #    define YYSTACK_ALLOC alloca
232 #   else
233 #    ifdef __GNUC__
234 #     define YYSTACK_ALLOC __builtin_alloca
235 #    endif
236 #   endif
237 #  endif
238 # endif
239
240 # ifdef YYSTACK_ALLOC
241    /* Pacify GCC's `empty if-body' warning. */
242 #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
243 # else
244 #  if defined (__STDC__) || defined (__cplusplus)
245 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
246 #   define YYSIZE_T size_t
247 #  endif
248 #  define YYSTACK_ALLOC malloc
249 #  define YYSTACK_FREE free
250 # endif
251 #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
252
253
254 #if (! defined (yyoverflow) \
255      && (! defined (__cplusplus) \
256          || (YYSTYPE_IS_TRIVIAL)))
257
258 /* A type that is properly aligned for any stack member.  */
259 union yyalloc
260 {
261   short yyss;
262   YYSTYPE yyvs;
263   };
264
265 /* The size of the maximum gap between one aligned stack and the next.  */
266 # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
267
268 /* The size of an array large to enough to hold all stacks, each with
269    N elements.  */
270 # define YYSTACK_BYTES(N) \
271      ((N) * (sizeof (short) + sizeof (YYSTYPE))                         \
272       + YYSTACK_GAP_MAXIMUM)
273
274 /* Copy COUNT objects from FROM to TO.  The source and destination do
275    not overlap.  */
276 # ifndef YYCOPY
277 #  if 1 < __GNUC__
278 #   define YYCOPY(To, From, Count) \
279       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
280 #  else
281 #   define YYCOPY(To, From, Count)              \
282       do                                        \
283         {                                       \
284           register YYSIZE_T yyi;                \
285           for (yyi = 0; yyi < (Count); yyi++)   \
286             (To)[yyi] = (From)[yyi];            \
287         }                                       \
288       while (0)
289 #  endif
290 # endif
291
292 /* Relocate STACK from its old location to the new one.  The
293    local variables YYSIZE and YYSTACKSIZE give the old and new number of
294    elements in the stack, and YYPTR gives the new location of the
295    stack.  Advance YYPTR to a properly aligned location for the next
296    stack.  */
297 # define YYSTACK_RELOCATE(Stack)                                        \
298     do                                                                  \
299       {                                                                 \
300         YYSIZE_T yynewbytes;                                            \
301         YYCOPY (&yyptr->Stack, Stack, yysize);                          \
302         Stack = &yyptr->Stack;                                          \
303         yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
304         yyptr += yynewbytes / sizeof (*yyptr);                          \
305       }                                                                 \
306     while (0)
307
308 #endif
309
310 #if defined (__STDC__) || defined (__cplusplus)
311    typedef signed char yysigned_char;
312 #else
313    typedef short yysigned_char;
314 #endif
315
316 /* YYFINAL -- State number of the termination state. */
317 #define YYFINAL  2
318 /* YYLAST -- Last index in YYTABLE.  */
319 #define YYLAST   201
320
321 /* YYNTOKENS -- Number of terminals. */
322 #define YYNTOKENS  42
323 /* YYNNTS -- Number of nonterminals. */
324 #define YYNNTS  41
325 /* YYNRULES -- Number of rules. */
326 #define YYNRULES  104
327 /* YYNRULES -- Number of states. */
328 #define YYNSTATES  182
329
330 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
331 #define YYUNDEFTOK  2
332 #define YYMAXUTOK   296
333
334 #define YYTRANSLATE(YYX)                                                \
335   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
336
337 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
338 static const unsigned char yytranslate[] =
339 {
340        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
341        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
342        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
343        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
344        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
345        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
346        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
347        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
348        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
349        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
350        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
351        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
352        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
353        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
354        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
355        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
356        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
357        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
358        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
359        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
360        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
361        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
362        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
363        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
364        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
365        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
366        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
367       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
368       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
369       35,    36,    37,    38,    39,    40,    41
370 };
371
372 #if YYDEBUG
373 /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
374    YYRHS.  */
375 static const unsigned short yyprhs[] =
376 {
377        0,     0,     3,     4,     7,     9,    11,    13,    17,    19,
378       21,    23,    26,    28,    30,    32,    34,    36,    38,    42,
379       45,    49,    52,    53,    56,    59,    62,    65,    69,    74,
380       78,    83,    87,    91,    95,   100,   105,   110,   116,   119,
381      122,   124,   128,   131,   132,   135,   138,   141,   144,   149,
382      153,   157,   160,   165,   166,   169,   173,   175,   179,   182,
383      183,   186,   189,   192,   196,   199,   201,   205,   208,   209,
384      212,   215,   218,   222,   226,   228,   232,   235,   238,   241,
385      242,   245,   248,   253,   257,   261,   262,   265,   267,   269,
386      272,   275,   278,   280,   282,   283,   286,   288,   292,   296,
387      300,   303,   307,   311,   313
388 };
389
390 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
391 static const yysigned_char yyrhs[] =
392 {
393       43,     0,    -1,    -1,    43,    44,    -1,    45,    -1,    55,
394       -1,    66,    -1,     3,    77,    79,    -1,     5,    -1,    15,
395       -1,     8,    -1,     1,    79,    -1,    61,    -1,    71,    -1,
396       47,    -1,    49,    -1,    69,    -1,    79,    -1,    10,    28,
397       32,    -1,    46,    50,    -1,    11,    28,    32,    -1,    48,
398       50,    -1,    -1,    50,    51,    -1,    50,    75,    -1,    50,
399       73,    -1,    50,    32,    -1,    21,    76,    32,    -1,    22,
400       81,    80,    32,    -1,    23,    76,    32,    -1,    24,    81,
401       80,    32,    -1,    26,    76,    32,    -1,    27,    76,    32,
402       -1,    25,    76,    32,    -1,    19,    77,    80,    32,    -1,
403       20,    81,    80,    32,    -1,    36,    28,    80,    32,    -1,
404       37,    82,    82,    80,    32,    -1,     7,    32,    -1,    52,
405       56,    -1,    78,    -1,    53,    58,    54,    -1,    53,    58,
406       -1,    -1,    56,    57,    -1,    56,    75,    -1,    56,    73,
407       -1,    56,    32,    -1,    19,    77,    80,    32,    -1,    21,
408       76,    32,    -1,    23,    76,    32,    -1,    18,    32,    -1,
409       20,    28,    80,    32,    -1,    -1,    58,    45,    -1,    14,
410       81,    32,    -1,    78,    -1,    59,    62,    60,    -1,    59,
411       62,    -1,    -1,    62,    45,    -1,    62,    66,    -1,    62,
412       55,    -1,     4,    77,    32,    -1,    63,    74,    -1,    78,
413       -1,    64,    67,    65,    -1,    64,    67,    -1,    -1,    67,
414       45,    -1,    67,    66,    -1,    67,    55,    -1,    67,     1,
415       32,    -1,     6,    77,    32,    -1,    68,    -1,     9,    77,
416       32,    -1,    70,    74,    -1,    12,    32,    -1,    72,    13,
417       -1,    -1,    74,    75,    -1,    74,    32,    -1,    16,    35,
418       81,    32,    -1,    16,    81,    32,    -1,    17,    81,    32,
419       -1,    -1,    77,    80,    -1,    28,    -1,    29,    -1,     5,
420       79,    -1,     8,    79,    -1,    15,    79,    -1,    32,    -1,
421       31,    -1,    -1,    14,    81,    -1,    82,    -1,    82,    40,
422       82,    -1,    82,    30,    82,    -1,    34,    81,    33,    -1,
423       41,    81,    -1,    81,    38,    81,    -1,    81,    39,    81,
424       -1,    28,    -1,    29,    -1
425 };
426
427 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
428 static const unsigned short yyrline[] =
429 {
430        0,    94,    94,    95,    98,    99,   100,   101,   102,   103,
431      104,   105,   109,   110,   111,   112,   113,   114,   120,   128,
432      134,   142,   152,   154,   155,   156,   157,   160,   166,   173,
433      179,   186,   192,   198,   204,   210,   216,   222,   230,   239,
434      245,   254,   255,   261,   263,   264,   265,   266,   269,   275,
435      281,   287,   293,   299,   301,   306,   315,   324,   325,   331,
436      333,   334,   335,   340,   347,   353,   362,   363,   369,   371,
437      372,   373,   374,   377,   383,   390,   397,   404,   410,   417,
438      418,   419,   422,   427,   432,   440,   442,   447,   448,   451,
439      452,   453,   457,   457,   459,   460,   463,   464,   465,   466,
440      467,   468,   469,   472,   473
441 };
442 #endif
443
444 #if YYDEBUG || YYERROR_VERBOSE
445 /* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
446    First, the terminals, then, starting at YYNTOKENS, nonterminals. */
447 static const char *const yytname[] =
448 {
449   "$end", "error", "$undefined", "T_MAINMENU", "T_MENU", "T_ENDMENU",
450   "T_SOURCE", "T_CHOICE", "T_ENDCHOICE", "T_COMMENT", "T_CONFIG",
451   "T_MENUCONFIG", "T_HELP", "T_HELPTEXT", "T_IF", "T_ENDIF", "T_DEPENDS",
452   "T_REQUIRES", "T_OPTIONAL", "T_PROMPT", "T_DEFAULT", "T_TRISTATE",
453   "T_DEF_TRISTATE", "T_BOOLEAN", "T_DEF_BOOLEAN", "T_STRING", "T_INT",
454   "T_HEX", "T_WORD", "T_WORD_QUOTE", "T_UNEQUAL", "T_EOF", "T_EOL",
455   "T_CLOSE_PAREN", "T_OPEN_PAREN", "T_ON", "T_SELECT", "T_RANGE", "T_OR",
456   "T_AND", "T_EQUAL", "T_NOT", "$accept", "input", "block",
457   "common_block", "config_entry_start", "config_stmt",
458   "menuconfig_entry_start", "menuconfig_stmt", "config_option_list",
459   "config_option", "choice", "choice_entry", "choice_end", "choice_stmt",
460   "choice_option_list", "choice_option", "choice_block", "if", "if_end",
461   "if_stmt", "if_block", "menu", "menu_entry", "menu_end", "menu_stmt",
462   "menu_block", "source", "source_stmt", "comment", "comment_stmt",
463   "help_start", "help", "depends_list", "depends", "prompt_stmt_opt",
464   "prompt", "end", "nl_or_eof", "if_expr", "expr", "symbol", 0
465 };
466 #endif
467
468 # ifdef YYPRINT
469 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
470    token YYLEX-NUM.  */
471 static const unsigned short yytoknum[] =
472 {
473        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
474      265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
475      275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
476      285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
477      295,   296
478 };
479 # endif
480
481 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
482 static const unsigned char yyr1[] =
483 {
484        0,    42,    43,    43,    44,    44,    44,    44,    44,    44,
485       44,    44,    45,    45,    45,    45,    45,    45,    46,    47,
486       48,    49,    50,    50,    50,    50,    50,    51,    51,    51,
487       51,    51,    51,    51,    51,    51,    51,    51,    52,    53,
488       54,    55,    55,    56,    56,    56,    56,    56,    57,    57,
489       57,    57,    57,    58,    58,    59,    60,    61,    61,    62,
490       62,    62,    62,    63,    64,    65,    66,    66,    67,    67,
491       67,    67,    67,    68,    69,    70,    71,    72,    73,    74,
492       74,    74,    75,    75,    75,    76,    76,    77,    77,    78,
493       78,    78,    79,    79,    80,    80,    81,    81,    81,    81,
494       81,    81,    81,    82,    82
495 };
496
497 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
498 static const unsigned char yyr2[] =
499 {
500        0,     2,     0,     2,     1,     1,     1,     3,     1,     1,
501        1,     2,     1,     1,     1,     1,     1,     1,     3,     2,
502        3,     2,     0,     2,     2,     2,     2,     3,     4,     3,
503        4,     3,     3,     3,     4,     4,     4,     5,     2,     2,
504        1,     3,     2,     0,     2,     2,     2,     2,     4,     3,
505        3,     2,     4,     0,     2,     3,     1,     3,     2,     0,
506        2,     2,     2,     3,     2,     1,     3,     2,     0,     2,
507        2,     2,     3,     3,     1,     3,     2,     2,     2,     0,
508        2,     2,     4,     3,     3,     0,     2,     1,     1,     2,
509        2,     2,     1,     1,     0,     2,     1,     3,     3,     3,
510        2,     3,     3,     1,     1
511 };
512
513 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
514    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
515    means the default is an error.  */
516 static const unsigned char yydefact[] =
517 {
518        2,     0,     1,     0,     0,     0,     8,     0,     0,    10,
519        0,     0,     0,     0,     9,    93,    92,     3,     4,    22,
520       14,    22,    15,    43,    53,     5,    59,    12,    79,    68,
521        6,    74,    16,    79,    13,    17,    11,    87,    88,     0,
522        0,     0,    38,     0,     0,     0,   103,   104,     0,     0,
523        0,    96,    19,    21,    39,    42,    58,    64,     0,    76,
524        7,    63,    73,    75,    18,    20,     0,   100,    55,     0,
525        0,     0,     0,     0,     0,     0,     0,     0,    85,     0,
526       85,     0,    85,    85,    85,    26,     0,     0,    23,     0,
527       25,    24,     0,     0,     0,    85,    85,    47,    44,    46,
528       45,     0,     0,     0,    54,    41,    40,    60,    62,    57,
529       61,    56,    81,    80,     0,    69,    71,    66,    70,    65,
530       99,   101,   102,    98,    97,    77,     0,     0,     0,    94,
531       94,     0,    94,    94,     0,    94,     0,     0,     0,    94,
532        0,    78,    51,    94,    94,     0,     0,    89,    90,    91,
533       72,     0,    83,    84,     0,     0,     0,    27,    86,     0,
534       29,     0,    33,    31,    32,     0,    94,     0,     0,    49,
535       50,    82,    95,    34,    35,    28,    30,    36,     0,    48,
536       52,    37
537 };
538
539 /* YYDEFGOTO[NTERM-NUM]. */
540 static const short yydefgoto[] =
541 {
542       -1,     1,    17,    18,    19,    20,    21,    22,    52,    88,
543       23,    24,   105,    25,    54,    98,    55,    26,   109,    27,
544       56,    28,    29,   117,    30,    58,    31,    32,    33,    34,
545       89,    90,    57,    91,   131,   132,   106,    35,   155,    50,
546       51
547 };
548
549 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
550    STATE-NUM.  */
551 #define YYPACT_NINF -99
552 static const short yypact[] =
553 {
554      -99,    48,   -99,    38,    46,    46,   -99,    46,   -29,   -99,
555       46,   -17,    -3,   -11,   -99,   -99,   -99,   -99,   -99,   -99,
556      -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,
557      -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,   -99,    38,
558       12,    15,   -99,    18,    51,    62,   -99,   -99,   -11,   -11,
559        4,   -24,   138,   138,   160,   121,   110,    -4,    81,    -4,
560      -99,   -99,   -99,   -99,   -99,   -99,   -19,   -99,   -99,   -11,
561      -11,    70,    70,    73,    32,   -11,    46,   -11,    46,   -11,
562       46,   -11,    46,    46,    46,   -99,    36,    70,   -99,    95,
563      -99,   -99,    96,    46,   106,    46,    46,   -99,   -99,   -99,
564      -99,    38,    38,    38,   -99,   -99,   -99,   -99,   -99,   -99,
565      -99,   -99,   -99,   -99,   112,   -99,   -99,   -99,   -99,   -99,
566      -99,   117,   -99,   -99,   -99,   -99,   -11,    33,    65,   131,
567        1,   119,   131,     1,   136,     1,   153,   154,   155,   131,
568       70,   -99,   -99,   131,   131,   156,   157,   -99,   -99,   -99,
569      -99,   101,   -99,   -99,   -11,   158,   159,   -99,   -99,   161,
570      -99,   162,   -99,   -99,   -99,   163,   131,   164,   165,   -99,
571      -99,   -99,    99,   -99,   -99,   -99,   -99,   -99,   166,   -99,
572      -99,   -99
573 };
574
575 /* YYPGOTO[NTERM-NUM].  */
576 static const short yypgoto[] =
577 {
578      -99,   -99,   -99,   111,   -99,   -99,   -99,   -99,   178,   -99,
579      -99,   -99,   -99,    91,   -99,   -99,   -99,   -99,   -99,   -99,
580      -99,   -99,   -99,   -99,   115,   -99,   -99,   -99,   -99,   -99,
581      -99,   146,   168,    89,    27,     0,   126,    -1,   -98,   -48,
582      -63
583 };
584
585 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
586    positive, shift that token.  If negative, reduce the rule which
587    number is the opposite.  If zero, do what YYDEFACT says.
588    If YYTABLE_NINF, syntax error.  */
589 #define YYTABLE_NINF -68
590 static const short yytable[] =
591 {
592       66,    67,    36,    42,    39,    40,    71,    41,   123,   124,
593       43,    44,    74,    75,   120,   154,    72,    46,    47,    69,
594       70,   121,   122,    48,   140,    45,   127,   128,   112,   130,
595       49,   133,   156,   135,   158,   159,    68,   161,    60,    69,
596       70,   165,    69,    70,    61,   167,   168,    62,     2,     3,
597       63,     4,     5,     6,     7,     8,     9,    10,    11,    12,
598       46,    47,    13,    14,   139,   152,    48,   126,   178,    15,
599       16,    69,    70,    49,    37,    38,   129,   166,   151,    15,
600       16,   -67,   114,    64,   -67,     5,   101,     7,     8,   102,
601       10,    11,    12,   143,    65,    13,   103,   153,    46,    47,
602      147,   148,   149,    69,    70,   125,   172,   134,   141,   136,
603      137,   138,    15,    16,     5,   101,     7,     8,   102,    10,
604       11,    12,   145,   146,    13,   103,   101,     7,   142,   102,
605       10,    11,    12,   171,   144,    13,   103,    69,    70,    69,
606       70,    15,    16,   100,   150,   154,   113,   108,   113,   116,
607       73,   157,    15,    16,    74,    75,    70,    76,    77,    78,
608       79,    80,    81,    82,    83,    84,   104,   107,   160,   115,
609       85,   110,    73,   118,    86,    87,    74,    75,    92,    93,
610       94,    95,   111,    96,   119,   162,   163,   164,   169,   170,
611      173,   174,    97,   175,   176,   177,   179,   180,   181,    53,
612       99,    59
613 };
614
615 static const unsigned char yycheck[] =
616 {
617       48,    49,     3,    32,     4,     5,    30,     7,    71,    72,
618       10,    28,    16,    17,    33,    14,    40,    28,    29,    38,
619       39,    69,    70,    34,    87,    28,    74,    75,    32,    77,
620       41,    79,   130,    81,   132,   133,    32,   135,    39,    38,
621       39,   139,    38,    39,    32,   143,   144,    32,     0,     1,
622       32,     3,     4,     5,     6,     7,     8,     9,    10,    11,
623       28,    29,    14,    15,    28,    32,    34,    35,   166,    31,
624       32,    38,    39,    41,    28,    29,    76,   140,   126,    31,
625       32,     0,     1,    32,     3,     4,     5,     6,     7,     8,
626        9,    10,    11,    93,    32,    14,    15,    32,    28,    29,
627      101,   102,   103,    38,    39,    32,   154,    80,    13,    82,
628       83,    84,    31,    32,     4,     5,     6,     7,     8,     9,
629       10,    11,    95,    96,    14,    15,     5,     6,    32,     8,
630        9,    10,    11,    32,    28,    14,    15,    38,    39,    38,
631       39,    31,    32,    54,    32,    14,    57,    56,    59,    58,
632       12,    32,    31,    32,    16,    17,    39,    19,    20,    21,
633       22,    23,    24,    25,    26,    27,    55,    56,    32,    58,
634       32,    56,    12,    58,    36,    37,    16,    17,    18,    19,
635       20,    21,    56,    23,    58,    32,    32,    32,    32,    32,
636       32,    32,    32,    32,    32,    32,    32,    32,    32,    21,
637       54,    33
638 };
639
640 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
641    symbol of state STATE-NUM.  */
642 static const unsigned char yystos[] =
643 {
644        0,    43,     0,     1,     3,     4,     5,     6,     7,     8,
645        9,    10,    11,    14,    15,    31,    32,    44,    45,    46,
646       47,    48,    49,    52,    53,    55,    59,    61,    63,    64,
647       66,    68,    69,    70,    71,    79,    79,    28,    29,    77,
648       77,    77,    32,    77,    28,    28,    28,    29,    34,    41,
649       81,    82,    50,    50,    56,    58,    62,    74,    67,    74,
650       79,    32,    32,    32,    32,    32,    81,    81,    32,    38,
651       39,    30,    40,    12,    16,    17,    19,    20,    21,    22,
652       23,    24,    25,    26,    27,    32,    36,    37,    51,    72,
653       73,    75,    18,    19,    20,    21,    23,    32,    57,    73,
654       75,     5,     8,    15,    45,    54,    78,    45,    55,    60,
655       66,    78,    32,    75,     1,    45,    55,    65,    66,    78,
656       33,    81,    81,    82,    82,    32,    35,    81,    81,    77,
657       81,    76,    77,    81,    76,    81,    76,    76,    76,    28,
658       82,    13,    32,    77,    28,    76,    76,    79,    79,    79,
659       32,    81,    32,    32,    14,    80,    80,    32,    80,    80,
660       32,    80,    32,    32,    32,    80,    82,    80,    80,    32,
661       32,    32,    81,    32,    32,    32,    32,    32,    80,    32,
662       32,    32
663 };
664
665 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
666 # define YYSIZE_T __SIZE_TYPE__
667 #endif
668 #if ! defined (YYSIZE_T) && defined (size_t)
669 # define YYSIZE_T size_t
670 #endif
671 #if ! defined (YYSIZE_T)
672 # if defined (__STDC__) || defined (__cplusplus)
673 #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
674 #  define YYSIZE_T size_t
675 # endif
676 #endif
677 #if ! defined (YYSIZE_T)
678 # define YYSIZE_T unsigned int
679 #endif
680
681 #define yyerrok         (yyerrstatus = 0)
682 #define yyclearin       (yychar = YYEMPTY)
683 #define YYEMPTY         (-2)
684 #define YYEOF           0
685
686 #define YYACCEPT        goto yyacceptlab
687 #define YYABORT         goto yyabortlab
688 #define YYERROR         goto yyerrlab1
689
690
691 /* Like YYERROR except do call yyerror.  This remains here temporarily
692    to ease the transition to the new meaning of YYERROR, for GCC.
693    Once GCC version 2 has supplanted version 1, this can go.  */
694
695 #define YYFAIL          goto yyerrlab
696
697 #define YYRECOVERING()  (!!yyerrstatus)
698
699 #define YYBACKUP(Token, Value)                                  \
700 do                                                              \
701   if (yychar == YYEMPTY && yylen == 1)                          \
702     {                                                           \
703       yychar = (Token);                                         \
704       yylval = (Value);                                         \
705       yytoken = YYTRANSLATE (yychar);                           \
706       YYPOPSTACK;                                               \
707       goto yybackup;                                            \
708     }                                                           \
709   else                                                          \
710     {                                                           \
711       yyerror ("syntax error: cannot back up");\
712       YYERROR;                                                  \
713     }                                                           \
714 while (0)
715
716 #define YYTERROR        1
717 #define YYERRCODE       256
718
719 /* YYLLOC_DEFAULT -- Compute the default location (before the actions
720    are run).  */
721
722 #ifndef YYLLOC_DEFAULT
723 # define YYLLOC_DEFAULT(Current, Rhs, N)         \
724   Current.first_line   = Rhs[1].first_line;      \
725   Current.first_column = Rhs[1].first_column;    \
726   Current.last_line    = Rhs[N].last_line;       \
727   Current.last_column  = Rhs[N].last_column;
728 #endif
729
730 /* YYLEX -- calling `yylex' with the right arguments.  */
731
732 #ifdef YYLEX_PARAM
733 # define YYLEX yylex (YYLEX_PARAM)
734 #else
735 # define YYLEX yylex ()
736 #endif
737
738 /* Enable debugging if requested.  */
739 #if YYDEBUG
740
741 # ifndef YYFPRINTF
742 #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
743 #  define YYFPRINTF fprintf
744 # endif
745
746 # define YYDPRINTF(Args)                        \
747 do {                                            \
748   if (yydebug)                                  \
749     YYFPRINTF Args;                             \
750 } while (0)
751
752 # define YYDSYMPRINT(Args)                      \
753 do {                                            \
754   if (yydebug)                                  \
755     yysymprint Args;                            \
756 } while (0)
757
758 # define YYDSYMPRINTF(Title, Token, Value, Location)            \
759 do {                                                            \
760   if (yydebug)                                                  \
761     {                                                           \
762       YYFPRINTF (stderr, "%s ", Title);                         \
763       yysymprint (stderr,                                       \
764                   Token, Value);        \
765       YYFPRINTF (stderr, "\n");                                 \
766     }                                                           \
767 } while (0)
768
769 /*------------------------------------------------------------------.
770 | yy_stack_print -- Print the state stack from its BOTTOM up to its |
771 | TOP (cinluded).                                                   |
772 `------------------------------------------------------------------*/
773
774 #if defined (__STDC__) || defined (__cplusplus)
775 static void
776 yy_stack_print (short *bottom, short *top)
777 #else
778 static void
779 yy_stack_print (bottom, top)
780     short *bottom;
781     short *top;
782 #endif
783 {
784   YYFPRINTF (stderr, "Stack now");
785   for (/* Nothing. */; bottom <= top; ++bottom)
786     YYFPRINTF (stderr, " %d", *bottom);
787   YYFPRINTF (stderr, "\n");
788 }
789
790 # define YY_STACK_PRINT(Bottom, Top)                            \
791 do {                                                            \
792   if (yydebug)                                                  \
793     yy_stack_print ((Bottom), (Top));                           \
794 } while (0)
795
796
797 /*------------------------------------------------.
798 | Report that the YYRULE is going to be reduced.  |
799 `------------------------------------------------*/
800
801 #if defined (__STDC__) || defined (__cplusplus)
802 static void
803 yy_reduce_print (int yyrule)
804 #else
805 static void
806 yy_reduce_print (yyrule)
807     int yyrule;
808 #endif
809 {
810   int yyi;
811   unsigned int yylineno = yyrline[yyrule];
812   YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
813              yyrule - 1, yylineno);
814   /* Print the symbols being reduced, and their result.  */
815   for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
816     YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
817   YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
818 }
819
820 # define YY_REDUCE_PRINT(Rule)          \
821 do {                                    \
822   if (yydebug)                          \
823     yy_reduce_print (Rule);             \
824 } while (0)
825
826 /* Nonzero means print parse trace.  It is left uninitialized so that
827    multiple parsers can coexist.  */
828 int yydebug;
829 #else /* !YYDEBUG */
830 # define YYDPRINTF(Args)
831 # define YYDSYMPRINT(Args)
832 # define YYDSYMPRINTF(Title, Token, Value, Location)
833 # define YY_STACK_PRINT(Bottom, Top)
834 # define YY_REDUCE_PRINT(Rule)
835 #endif /* !YYDEBUG */
836
837
838 /* YYINITDEPTH -- initial size of the parser's stacks.  */
839 #ifndef YYINITDEPTH
840 # define YYINITDEPTH 200
841 #endif
842
843 /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
844    if the built-in stack extension method is used).
845
846    Do not make this value too large; the results are undefined if
847    SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
848    evaluated with infinite-precision integer arithmetic.  */
849
850 #if YYMAXDEPTH == 0
851 # undef YYMAXDEPTH
852 #endif
853
854 #ifndef YYMAXDEPTH
855 # define YYMAXDEPTH 10000
856 #endif
857
858 \f
859
860 #if YYERROR_VERBOSE
861
862 # ifndef yystrlen
863 #  if defined (__GLIBC__) && defined (_STRING_H)
864 #   define yystrlen strlen
865 #  else
866 /* Return the length of YYSTR.  */
867 static YYSIZE_T
868 #   if defined (__STDC__) || defined (__cplusplus)
869 yystrlen (const char *yystr)
870 #   else
871 yystrlen (yystr)
872      const char *yystr;
873 #   endif
874 {
875   register const char *yys = yystr;
876
877   while (*yys++ != '\0')
878     continue;
879
880   return yys - yystr - 1;
881 }
882 #  endif
883 # endif
884
885 # ifndef yystpcpy
886 #  if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE)
887 #   define yystpcpy stpcpy
888 #  else
889 /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
890    YYDEST.  */
891 static char *
892 #   if defined (__STDC__) || defined (__cplusplus)
893 yystpcpy (char *yydest, const char *yysrc)
894 #   else
895 yystpcpy (yydest, yysrc)
896      char *yydest;
897      const char *yysrc;
898 #   endif
899 {
900   register char *yyd = yydest;
901   register const char *yys = yysrc;
902
903   while ((*yyd++ = *yys++) != '\0')
904     continue;
905
906   return yyd - 1;
907 }
908 #  endif
909 # endif
910
911 #endif /* !YYERROR_VERBOSE */
912
913 \f
914
915 #if YYDEBUG
916 /*--------------------------------.
917 | Print this symbol on YYOUTPUT.  |
918 `--------------------------------*/
919
920 #if defined (__STDC__) || defined (__cplusplus)
921 static void
922 yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
923 #else
924 static void
925 yysymprint (yyoutput, yytype, yyvaluep)
926     FILE *yyoutput;
927     int yytype;
928     YYSTYPE *yyvaluep;
929 #endif
930 {
931   /* Pacify ``unused variable'' warnings.  */
932   (void) yyvaluep;
933
934   if (yytype < YYNTOKENS)
935     {
936       YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
937 # ifdef YYPRINT
938       YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
939 # endif
940     }
941   else
942     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
943
944   switch (yytype)
945     {
946       default:
947         break;
948     }
949   YYFPRINTF (yyoutput, ")");
950 }
951
952 #endif /* ! YYDEBUG */
953 /*-----------------------------------------------.
954 | Release the memory associated to this symbol.  |
955 `-----------------------------------------------*/
956
957 #if defined (__STDC__) || defined (__cplusplus)
958 static void
959 yydestruct (int yytype, YYSTYPE *yyvaluep)
960 #else
961 static void
962 yydestruct (yytype, yyvaluep)
963     int yytype;
964     YYSTYPE *yyvaluep;
965 #endif
966 {
967   /* Pacify ``unused variable'' warnings.  */
968   (void) yyvaluep;
969
970   switch (yytype)
971     {
972
973       default:
974         break;
975     }
976 }
977 \f
978
979 /* Prevent warnings from -Wmissing-prototypes.  */
980
981 #ifdef YYPARSE_PARAM
982 # if defined (__STDC__) || defined (__cplusplus)
983 int yyparse (void *YYPARSE_PARAM);
984 # else
985 int yyparse ();
986 # endif
987 #else /* ! YYPARSE_PARAM */
988 #if defined (__STDC__) || defined (__cplusplus)
989 int yyparse (void);
990 #else
991 int yyparse ();
992 #endif
993 #endif /* ! YYPARSE_PARAM */
994
995
996
997 /* The lookahead symbol.  */
998 int yychar;
999
1000 /* The semantic value of the lookahead symbol.  */
1001 YYSTYPE yylval;
1002
1003 /* Number of syntax errors so far.  */
1004 int yynerrs;
1005
1006
1007
1008 /*----------.
1009 | yyparse.  |
1010 `----------*/
1011
1012 #ifdef YYPARSE_PARAM
1013 # if defined (__STDC__) || defined (__cplusplus)
1014 int yyparse (void *YYPARSE_PARAM)
1015 # else
1016 int yyparse (YYPARSE_PARAM)
1017   void *YYPARSE_PARAM;
1018 # endif
1019 #else /* ! YYPARSE_PARAM */
1020 #if defined (__STDC__) || defined (__cplusplus)
1021 int
1022 yyparse (void)
1023 #else
1024 int
1025 yyparse ()
1026
1027 #endif
1028 #endif
1029 {
1030
1031   register int yystate;
1032   register int yyn;
1033   int yyresult;
1034   /* Number of tokens to shift before error messages enabled.  */
1035   int yyerrstatus;
1036   /* Lookahead token as an internal (translated) token number.  */
1037   int yytoken = 0;
1038
1039   /* Three stacks and their tools:
1040      `yyss': related to states,
1041      `yyvs': related to semantic values,
1042      `yyls': related to locations.
1043
1044      Refer to the stacks thru separate pointers, to allow yyoverflow
1045      to reallocate them elsewhere.  */
1046
1047   /* The state stack.  */
1048   short yyssa[YYINITDEPTH];
1049   short *yyss = yyssa;
1050   register short *yyssp;
1051
1052   /* The semantic value stack.  */
1053   YYSTYPE yyvsa[YYINITDEPTH];
1054   YYSTYPE *yyvs = yyvsa;
1055   register YYSTYPE *yyvsp;
1056
1057
1058
1059 #define YYPOPSTACK   (yyvsp--, yyssp--)
1060
1061   YYSIZE_T yystacksize = YYINITDEPTH;
1062
1063   /* The variables used to return semantic value and location from the
1064      action routines.  */
1065   YYSTYPE yyval;
1066
1067
1068   /* When reducing, the number of symbols on the RHS of the reduced
1069      rule.  */
1070   int yylen;
1071
1072   YYDPRINTF ((stderr, "Starting parse\n"));
1073
1074   yystate = 0;
1075   yyerrstatus = 0;
1076   yynerrs = 0;
1077   yychar = YYEMPTY;             /* Cause a token to be read.  */
1078
1079   /* Initialize stack pointers.
1080      Waste one element of value and location stack
1081      so that they stay on the same level as the state stack.
1082      The wasted elements are never initialized.  */
1083
1084   yyssp = yyss;
1085   yyvsp = yyvs;
1086
1087   goto yysetstate;
1088
1089 /*------------------------------------------------------------.
1090 | yynewstate -- Push a new state, which is found in yystate.  |
1091 `------------------------------------------------------------*/
1092  yynewstate:
1093   /* In all cases, when you get here, the value and location stacks
1094      have just been pushed. so pushing a state here evens the stacks.
1095      */
1096   yyssp++;
1097
1098  yysetstate:
1099   *yyssp = yystate;
1100
1101   if (yyss + yystacksize - 1 <= yyssp)
1102     {
1103       /* Get the current used size of the three stacks, in elements.  */
1104       YYSIZE_T yysize = yyssp - yyss + 1;
1105
1106 #ifdef yyoverflow
1107       {
1108         /* Give user a chance to reallocate the stack. Use copies of
1109            these so that the &'s don't force the real ones into
1110            memory.  */
1111         YYSTYPE *yyvs1 = yyvs;
1112         short *yyss1 = yyss;
1113
1114
1115         /* Each stack pointer address is followed by the size of the
1116            data in use in that stack, in bytes.  This used to be a
1117            conditional around just the two extra args, but that might
1118            be undefined if yyoverflow is a macro.  */
1119         yyoverflow ("parser stack overflow",
1120                     &yyss1, yysize * sizeof (*yyssp),
1121                     &yyvs1, yysize * sizeof (*yyvsp),
1122
1123                     &yystacksize);
1124
1125         yyss = yyss1;
1126         yyvs = yyvs1;
1127       }
1128 #else /* no yyoverflow */
1129 # ifndef YYSTACK_RELOCATE
1130       goto yyoverflowlab;
1131 # else
1132       /* Extend the stack our own way.  */
1133       if (YYMAXDEPTH <= yystacksize)
1134         goto yyoverflowlab;
1135       yystacksize *= 2;
1136       if (YYMAXDEPTH < yystacksize)
1137         yystacksize = YYMAXDEPTH;
1138
1139       {
1140         short *yyss1 = yyss;
1141         union yyalloc *yyptr =
1142           (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1143         if (! yyptr)
1144           goto yyoverflowlab;
1145         YYSTACK_RELOCATE (yyss);
1146         YYSTACK_RELOCATE (yyvs);
1147
1148 #  undef YYSTACK_RELOCATE
1149         if (yyss1 != yyssa)
1150           YYSTACK_FREE (yyss1);
1151       }
1152 # endif
1153 #endif /* no yyoverflow */
1154
1155       yyssp = yyss + yysize - 1;
1156       yyvsp = yyvs + yysize - 1;
1157
1158
1159       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1160                   (unsigned long int) yystacksize));
1161
1162       if (yyss + yystacksize - 1 <= yyssp)
1163         YYABORT;
1164     }
1165
1166   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1167
1168   goto yybackup;
1169
1170 /*-----------.
1171 | yybackup.  |
1172 `-----------*/
1173 yybackup:
1174
1175 /* Do appropriate processing given the current state.  */
1176 /* Read a lookahead token if we need one and don't already have one.  */
1177 /* yyresume: */
1178
1179   /* First try to decide what to do without reference to lookahead token.  */
1180
1181   yyn = yypact[yystate];
1182   if (yyn == YYPACT_NINF)
1183     goto yydefault;
1184
1185   /* Not known => get a lookahead token if don't already have one.  */
1186
1187   /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
1188   if (yychar == YYEMPTY)
1189     {
1190       YYDPRINTF ((stderr, "Reading a token: "));
1191       yychar = YYLEX;
1192     }
1193
1194   if (yychar <= YYEOF)
1195     {
1196       yychar = yytoken = YYEOF;
1197       YYDPRINTF ((stderr, "Now at end of input.\n"));
1198     }
1199   else
1200     {
1201       yytoken = YYTRANSLATE (yychar);
1202       YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
1203     }
1204
1205   /* If the proper action on seeing token YYTOKEN is to reduce or to
1206      detect an error, take that action.  */
1207   yyn += yytoken;
1208   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1209     goto yydefault;
1210   yyn = yytable[yyn];
1211   if (yyn <= 0)
1212     {
1213       if (yyn == 0 || yyn == YYTABLE_NINF)
1214         goto yyerrlab;
1215       yyn = -yyn;
1216       goto yyreduce;
1217     }
1218
1219   if (yyn == YYFINAL)
1220     YYACCEPT;
1221
1222   /* Shift the lookahead token.  */
1223   YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
1224
1225   /* Discard the token being shifted unless it is eof.  */
1226   if (yychar != YYEOF)
1227     yychar = YYEMPTY;
1228
1229   *++yyvsp = yylval;
1230
1231
1232   /* Count tokens shifted since error; after three, turn off error
1233      status.  */
1234   if (yyerrstatus)
1235     yyerrstatus--;
1236
1237   yystate = yyn;
1238   goto yynewstate;
1239
1240
1241 /*-----------------------------------------------------------.
1242 | yydefault -- do the default action for the current state.  |
1243 `-----------------------------------------------------------*/
1244 yydefault:
1245   yyn = yydefact[yystate];
1246   if (yyn == 0)
1247     goto yyerrlab;
1248   goto yyreduce;
1249
1250
1251 /*-----------------------------.
1252 | yyreduce -- Do a reduction.  |
1253 `-----------------------------*/
1254 yyreduce:
1255   /* yyn is the number of a rule to reduce with.  */
1256   yylen = yyr2[yyn];
1257
1258   /* If YYLEN is nonzero, implement the default value of the action:
1259      `$$ = $1'.
1260
1261      Otherwise, the following line sets YYVAL to garbage.
1262      This behavior is undocumented and Bison
1263      users should not rely upon it.  Assigning to YYVAL
1264      unconditionally makes the parser a bit smaller, and it avoids a
1265      GCC warning that YYVAL may be used uninitialized.  */
1266   yyval = yyvsp[1-yylen];
1267
1268
1269   YY_REDUCE_PRINT (yyn);
1270   switch (yyn)
1271     {
1272         case 8:
1273
1274     { zconfprint("unexpected 'endmenu' statement"); ;}
1275     break;
1276
1277   case 9:
1278
1279     { zconfprint("unexpected 'endif' statement"); ;}
1280     break;
1281
1282   case 10:
1283
1284     { zconfprint("unexpected 'endchoice' statement"); ;}
1285     break;
1286
1287   case 11:
1288
1289     { zconfprint("syntax error"); yyerrok; ;}
1290     break;
1291
1292   case 18:
1293
1294     {
1295         struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
1296         sym->flags |= SYMBOL_OPTIONAL;
1297         menu_add_entry(sym);
1298         printd(DEBUG_PARSE, "%s:%d:config %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
1299 ;}
1300     break;
1301
1302   case 19:
1303
1304     {
1305         menu_end_entry();
1306         printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
1307 ;}
1308     break;
1309
1310   case 20:
1311
1312     {
1313         struct symbol *sym = sym_lookup(yyvsp[-1].string, 0);
1314         sym->flags |= SYMBOL_OPTIONAL;
1315         menu_add_entry(sym);
1316         printd(DEBUG_PARSE, "%s:%d:menuconfig %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
1317 ;}
1318     break;
1319
1320   case 21:
1321
1322     {
1323         if (current_entry->prompt)
1324                 current_entry->prompt->type = P_MENU;
1325         else
1326                 zconfprint("warning: menuconfig statement without prompt");
1327         menu_end_entry();
1328         printd(DEBUG_PARSE, "%s:%d:endconfig\n", zconf_curname(), zconf_lineno());
1329 ;}
1330     break;
1331
1332   case 27:
1333
1334     {
1335         menu_set_type(S_TRISTATE);
1336         printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
1337 ;}
1338     break;
1339
1340   case 28:
1341
1342     {
1343         menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
1344         menu_set_type(S_TRISTATE);
1345         printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
1346 ;}
1347     break;
1348
1349   case 29:
1350
1351     {
1352         menu_set_type(S_BOOLEAN);
1353         printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
1354 ;}
1355     break;
1356
1357   case 30:
1358
1359     {
1360         menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
1361         menu_set_type(S_BOOLEAN);
1362         printd(DEBUG_PARSE, "%s:%d:def_boolean\n", zconf_curname(), zconf_lineno());
1363 ;}
1364     break;
1365
1366   case 31:
1367
1368     {
1369         menu_set_type(S_INT);
1370         printd(DEBUG_PARSE, "%s:%d:int\n", zconf_curname(), zconf_lineno());
1371 ;}
1372     break;
1373
1374   case 32:
1375
1376     {
1377         menu_set_type(S_HEX);
1378         printd(DEBUG_PARSE, "%s:%d:hex\n", zconf_curname(), zconf_lineno());
1379 ;}
1380     break;
1381
1382   case 33:
1383
1384     {
1385         menu_set_type(S_STRING);
1386         printd(DEBUG_PARSE, "%s:%d:string\n", zconf_curname(), zconf_lineno());
1387 ;}
1388     break;
1389
1390   case 34:
1391
1392     {
1393         menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
1394         printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
1395 ;}
1396     break;
1397
1398   case 35:
1399
1400     {
1401         menu_add_expr(P_DEFAULT, yyvsp[-2].expr, yyvsp[-1].expr);
1402         printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
1403 ;}
1404     break;
1405
1406   case 36:
1407
1408     {
1409         menu_add_symbol(P_SELECT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
1410         printd(DEBUG_PARSE, "%s:%d:select\n", zconf_curname(), zconf_lineno());
1411 ;}
1412     break;
1413
1414   case 37:
1415
1416     {
1417         menu_add_expr(P_RANGE, expr_alloc_comp(E_RANGE,yyvsp[-3].symbol, yyvsp[-2].symbol), yyvsp[-1].expr);
1418         printd(DEBUG_PARSE, "%s:%d:range\n", zconf_curname(), zconf_lineno());
1419 ;}
1420     break;
1421
1422   case 38:
1423
1424     {
1425         struct symbol *sym = sym_lookup(NULL, 0);
1426         sym->flags |= SYMBOL_CHOICE;
1427         menu_add_entry(sym);
1428         menu_add_expr(P_CHOICE, NULL, NULL);
1429         printd(DEBUG_PARSE, "%s:%d:choice\n", zconf_curname(), zconf_lineno());
1430 ;}
1431     break;
1432
1433   case 39:
1434
1435     {
1436         menu_end_entry();
1437         menu_add_menu();
1438 ;}
1439     break;
1440
1441   case 40:
1442
1443     {
1444         if (zconf_endtoken(yyvsp[0].token, T_CHOICE, T_ENDCHOICE)) {
1445                 menu_end_menu();
1446                 printd(DEBUG_PARSE, "%s:%d:endchoice\n", zconf_curname(), zconf_lineno());
1447         }
1448 ;}
1449     break;
1450
1451   case 42:
1452
1453     {
1454         printf("%s:%d: missing 'endchoice' for this 'choice' statement\n", current_menu->file->name, current_menu->lineno);
1455         zconfnerrs++;
1456 ;}
1457     break;
1458
1459   case 48:
1460
1461     {
1462         menu_add_prompt(P_PROMPT, yyvsp[-2].string, yyvsp[-1].expr);
1463         printd(DEBUG_PARSE, "%s:%d:prompt\n", zconf_curname(), zconf_lineno());
1464 ;}
1465     break;
1466
1467   case 49:
1468
1469     {
1470         menu_set_type(S_TRISTATE);
1471         printd(DEBUG_PARSE, "%s:%d:tristate\n", zconf_curname(), zconf_lineno());
1472 ;}
1473     break;
1474
1475   case 50:
1476
1477     {
1478         menu_set_type(S_BOOLEAN);
1479         printd(DEBUG_PARSE, "%s:%d:boolean\n", zconf_curname(), zconf_lineno());
1480 ;}
1481     break;
1482
1483   case 51:
1484
1485     {
1486         current_entry->sym->flags |= SYMBOL_OPTIONAL;
1487         printd(DEBUG_PARSE, "%s:%d:optional\n", zconf_curname(), zconf_lineno());
1488 ;}
1489     break;
1490
1491   case 52:
1492
1493     {
1494         menu_add_symbol(P_DEFAULT, sym_lookup(yyvsp[-2].string, 0), yyvsp[-1].expr);
1495         printd(DEBUG_PARSE, "%s:%d:default\n", zconf_curname(), zconf_lineno());
1496 ;}
1497     break;
1498
1499   case 55:
1500
1501     {
1502         printd(DEBUG_PARSE, "%s:%d:if\n", zconf_curname(), zconf_lineno());
1503         menu_add_entry(NULL);
1504         menu_add_dep(yyvsp[-1].expr);
1505         menu_end_entry();
1506         menu_add_menu();
1507 ;}
1508     break;
1509
1510   case 56:
1511
1512     {
1513         if (zconf_endtoken(yyvsp[0].token, T_IF, T_ENDIF)) {
1514                 menu_end_menu();
1515                 printd(DEBUG_PARSE, "%s:%d:endif\n", zconf_curname(), zconf_lineno());
1516         }
1517 ;}
1518     break;
1519
1520   case 58:
1521
1522     {
1523         printf("%s:%d: missing 'endif' for this 'if' statement\n", current_menu->file->name, current_menu->lineno);
1524         zconfnerrs++;
1525 ;}
1526     break;
1527
1528   case 63:
1529
1530     {
1531         menu_add_entry(NULL);
1532         menu_add_prop(P_MENU, yyvsp[-1].string, NULL, NULL);
1533         printd(DEBUG_PARSE, "%s:%d:menu\n", zconf_curname(), zconf_lineno());
1534 ;}
1535     break;
1536
1537   case 64:
1538
1539     {
1540         menu_end_entry();
1541         menu_add_menu();
1542 ;}
1543     break;
1544
1545   case 65:
1546
1547     {
1548         if (zconf_endtoken(yyvsp[0].token, T_MENU, T_ENDMENU)) {
1549                 menu_end_menu();
1550                 printd(DEBUG_PARSE, "%s:%d:endmenu\n", zconf_curname(), zconf_lineno());
1551         }
1552 ;}
1553     break;
1554
1555   case 67:
1556
1557     {
1558         printf("%s:%d: missing 'endmenu' for this 'menu' statement\n", current_menu->file->name, current_menu->lineno);
1559         zconfnerrs++;
1560 ;}
1561     break;
1562
1563   case 72:
1564
1565     { zconfprint("invalid menu option"); yyerrok; ;}
1566     break;
1567
1568   case 73:
1569
1570     {
1571         yyval.string = yyvsp[-1].string;
1572         printd(DEBUG_PARSE, "%s:%d:source %s\n", zconf_curname(), zconf_lineno(), yyvsp[-1].string);
1573 ;}
1574     break;
1575
1576   case 74:
1577
1578     {
1579         zconf_nextfile(yyvsp[0].string);
1580 ;}
1581     break;
1582
1583   case 75:
1584
1585     {
1586         menu_add_entry(NULL);
1587         menu_add_prop(P_COMMENT, yyvsp[-1].string, NULL, NULL);
1588         printd(DEBUG_PARSE, "%s:%d:comment\n", zconf_curname(), zconf_lineno());
1589 ;}
1590     break;
1591
1592   case 76:
1593
1594     {
1595         menu_end_entry();
1596 ;}
1597     break;
1598
1599   case 77:
1600
1601     {
1602         printd(DEBUG_PARSE, "%s:%d:help\n", zconf_curname(), zconf_lineno());
1603         zconf_starthelp();
1604 ;}
1605     break;
1606
1607   case 78:
1608
1609     {
1610         current_entry->sym->help = yyvsp[0].string;
1611 ;}
1612     break;
1613
1614   case 82:
1615
1616     {
1617         menu_add_dep(yyvsp[-1].expr);
1618         printd(DEBUG_PARSE, "%s:%d:depends on\n", zconf_curname(), zconf_lineno());
1619 ;}
1620     break;
1621
1622   case 83:
1623
1624     {
1625         menu_add_dep(yyvsp[-1].expr);
1626         printd(DEBUG_PARSE, "%s:%d:depends\n", zconf_curname(), zconf_lineno());
1627 ;}
1628     break;
1629
1630   case 84:
1631
1632     {
1633         menu_add_dep(yyvsp[-1].expr);
1634         printd(DEBUG_PARSE, "%s:%d:requires\n", zconf_curname(), zconf_lineno());
1635 ;}
1636     break;
1637
1638   case 86:
1639
1640     {
1641         menu_add_prop(P_PROMPT, yyvsp[-1].string, NULL, yyvsp[0].expr);
1642 ;}
1643     break;
1644
1645   case 89:
1646
1647     { yyval.token = T_ENDMENU; ;}
1648     break;
1649
1650   case 90:
1651
1652     { yyval.token = T_ENDCHOICE; ;}
1653     break;
1654
1655   case 91:
1656
1657     { yyval.token = T_ENDIF; ;}
1658     break;
1659
1660   case 94:
1661
1662     { yyval.expr = NULL; ;}
1663     break;
1664
1665   case 95:
1666
1667     { yyval.expr = yyvsp[0].expr; ;}
1668     break;
1669
1670   case 96:
1671
1672     { yyval.expr = expr_alloc_symbol(yyvsp[0].symbol); ;}
1673     break;
1674
1675   case 97:
1676
1677     { yyval.expr = expr_alloc_comp(E_EQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
1678     break;
1679
1680   case 98:
1681
1682     { yyval.expr = expr_alloc_comp(E_UNEQUAL, yyvsp[-2].symbol, yyvsp[0].symbol); ;}
1683     break;
1684
1685   case 99:
1686
1687     { yyval.expr = yyvsp[-1].expr; ;}
1688     break;
1689
1690   case 100:
1691
1692     { yyval.expr = expr_alloc_one(E_NOT, yyvsp[0].expr); ;}
1693     break;
1694
1695   case 101:
1696
1697     { yyval.expr = expr_alloc_two(E_OR, yyvsp[-2].expr, yyvsp[0].expr); ;}
1698     break;
1699
1700   case 102:
1701
1702     { yyval.expr = expr_alloc_two(E_AND, yyvsp[-2].expr, yyvsp[0].expr); ;}
1703     break;
1704
1705   case 103:
1706
1707     { yyval.symbol = sym_lookup(yyvsp[0].string, 0); free(yyvsp[0].string); ;}
1708     break;
1709
1710   case 104:
1711
1712     { yyval.symbol = sym_lookup(yyvsp[0].string, 1); free(yyvsp[0].string); ;}
1713     break;
1714
1715
1716     }
1717
1718 /* Line 999 of yacc.c.  */
1719
1720 \f
1721   yyvsp -= yylen;
1722   yyssp -= yylen;
1723
1724
1725   YY_STACK_PRINT (yyss, yyssp);
1726
1727   *++yyvsp = yyval;
1728
1729
1730   /* Now `shift' the result of the reduction.  Determine what state
1731      that goes to, based on the state we popped back to and the rule
1732      number reduced by.  */
1733
1734   yyn = yyr1[yyn];
1735
1736   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
1737   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
1738     yystate = yytable[yystate];
1739   else
1740     yystate = yydefgoto[yyn - YYNTOKENS];
1741
1742   goto yynewstate;
1743
1744
1745 /*------------------------------------.
1746 | yyerrlab -- here on detecting error |
1747 `------------------------------------*/
1748 yyerrlab:
1749   /* If not already recovering from an error, report this error.  */
1750   if (!yyerrstatus)
1751     {
1752       ++yynerrs;
1753 #if YYERROR_VERBOSE
1754       yyn = yypact[yystate];
1755
1756       if (YYPACT_NINF < yyn && yyn < YYLAST)
1757         {
1758           YYSIZE_T yysize = 0;
1759           int yytype = YYTRANSLATE (yychar);
1760           char *yymsg;
1761           int yyx, yycount;
1762
1763           yycount = 0;
1764           /* Start YYX at -YYN if negative to avoid negative indexes in
1765              YYCHECK.  */
1766           for (yyx = yyn < 0 ? -yyn : 0;
1767                yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
1768             if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1769               yysize += yystrlen (yytname[yyx]) + 15, yycount++;
1770           yysize += yystrlen ("syntax error, unexpected ") + 1;
1771           yysize += yystrlen (yytname[yytype]);
1772           yymsg = (char *) YYSTACK_ALLOC (yysize);
1773           if (yymsg != 0)
1774             {
1775               char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
1776               yyp = yystpcpy (yyp, yytname[yytype]);
1777
1778               if (yycount < 5)
1779                 {
1780                   yycount = 0;
1781                   for (yyx = yyn < 0 ? -yyn : 0;
1782                        yyx < (int) (sizeof (yytname) / sizeof (char *));
1783                        yyx++)
1784                     if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1785                       {
1786                         const char *yyq = ! yycount ? ", expecting " : " or ";
1787                         yyp = yystpcpy (yyp, yyq);
1788                         yyp = yystpcpy (yyp, yytname[yyx]);
1789                         yycount++;
1790                       }
1791                 }
1792               yyerror (yymsg);
1793               YYSTACK_FREE (yymsg);
1794             }
1795           else
1796             yyerror ("syntax error; also virtual memory exhausted");
1797         }
1798       else
1799 #endif /* YYERROR_VERBOSE */
1800         yyerror ("syntax error");
1801     }
1802
1803
1804
1805   if (yyerrstatus == 3)
1806     {
1807       /* If just tried and failed to reuse lookahead token after an
1808          error, discard it.  */
1809
1810       /* Return failure if at end of input.  */
1811       if (yychar == YYEOF)
1812         {
1813           /* Pop the error token.  */
1814           YYPOPSTACK;
1815           /* Pop the rest of the stack.  */
1816           while (yyss < yyssp)
1817             {
1818               YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
1819               yydestruct (yystos[*yyssp], yyvsp);
1820               YYPOPSTACK;
1821             }
1822           YYABORT;
1823         }
1824
1825       YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
1826       yydestruct (yytoken, &yylval);
1827       yychar = YYEMPTY;
1828
1829     }
1830
1831   /* Else will try to reuse lookahead token after shifting the error
1832      token.  */
1833   goto yyerrlab1;
1834
1835
1836 /*----------------------------------------------------.
1837 | yyerrlab1 -- error raised explicitly by an action.  |
1838 `----------------------------------------------------*/
1839 yyerrlab1:
1840   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
1841
1842   for (;;)
1843     {
1844       yyn = yypact[yystate];
1845       if (yyn != YYPACT_NINF)
1846         {
1847           yyn += YYTERROR;
1848           if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
1849             {
1850               yyn = yytable[yyn];
1851               if (0 < yyn)
1852                 break;
1853             }
1854         }
1855
1856       /* Pop the current state because it cannot handle the error token.  */
1857       if (yyssp == yyss)
1858         YYABORT;
1859
1860       YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
1861       yydestruct (yystos[yystate], yyvsp);
1862       yyvsp--;
1863       yystate = *--yyssp;
1864
1865       YY_STACK_PRINT (yyss, yyssp);
1866     }
1867
1868   if (yyn == YYFINAL)
1869     YYACCEPT;
1870
1871   YYDPRINTF ((stderr, "Shifting error token, "));
1872
1873   *++yyvsp = yylval;
1874
1875
1876   yystate = yyn;
1877   goto yynewstate;
1878
1879
1880 /*-------------------------------------.
1881 | yyacceptlab -- YYACCEPT comes here.  |
1882 `-------------------------------------*/
1883 yyacceptlab:
1884   yyresult = 0;
1885   goto yyreturn;
1886
1887 /*-----------------------------------.
1888 | yyabortlab -- YYABORT comes here.  |
1889 `-----------------------------------*/
1890 yyabortlab:
1891   yyresult = 1;
1892   goto yyreturn;
1893
1894 #ifndef yyoverflow
1895 /*----------------------------------------------.
1896 | yyoverflowlab -- parser overflow comes here.  |
1897 `----------------------------------------------*/
1898 yyoverflowlab:
1899   yyerror ("parser stack overflow");
1900   yyresult = 2;
1901   /* Fall through.  */
1902 #endif
1903
1904 yyreturn:
1905 #ifndef yyoverflow
1906   if (yyss != yyssa)
1907     YYSTACK_FREE (yyss);
1908 #endif
1909   return yyresult;
1910 }
1911
1912
1913
1914
1915
1916 void conf_parse(const char *name)
1917 {
1918         struct symbol *sym;
1919         int i;
1920
1921         zconf_initscan(name);
1922
1923         sym_init();
1924         menu_init();
1925         modules_sym = sym_lookup("MODULES", 0);
1926         rootmenu.prompt = menu_add_prop(P_MENU, "Buildroot Configuration", NULL, NULL);
1927
1928         //zconfdebug = 1;
1929         zconfparse();
1930         if (zconfnerrs)
1931                 exit(1);
1932         menu_finalize(&rootmenu);
1933         for_all_symbols(i, sym) {
1934                 if (!(sym->flags & SYMBOL_CHECKED) && sym_check_deps(sym))
1935                         printf("\n");
1936                 else
1937                         sym->flags |= SYMBOL_CHECK_DONE;
1938         }
1939
1940         sym_change_count = 1;
1941 }
1942
1943 const char *zconf_tokenname(int token)
1944 {
1945         switch (token) {
1946         case T_MENU:            return "menu";
1947         case T_ENDMENU:         return "endmenu";
1948         case T_CHOICE:          return "choice";
1949         case T_ENDCHOICE:       return "endchoice";
1950         case T_IF:              return "if";
1951         case T_ENDIF:           return "endif";
1952         }
1953         return "<token>";
1954 }
1955
1956 static bool zconf_endtoken(int token, int starttoken, int endtoken)
1957 {
1958         if (token != endtoken) {
1959                 zconfprint("unexpected '%s' within %s block", zconf_tokenname(token), zconf_tokenname(starttoken));
1960                 zconfnerrs++;
1961                 return false;
1962         }
1963         if (current_menu->file != current_file) {
1964                 zconfprint("'%s' in different file than '%s'", zconf_tokenname(token), zconf_tokenname(starttoken));
1965                 zconfprint("location of the '%s'", zconf_tokenname(starttoken));
1966                 zconfnerrs++;
1967                 return false;
1968         }
1969         return true;
1970 }
1971
1972 static void zconfprint(const char *err, ...)
1973 {
1974         va_list ap;
1975
1976         fprintf(stderr, "%s:%d: ", zconf_curname(), zconf_lineno() + 1);
1977         va_start(ap, err);
1978         vfprintf(stderr, err, ap);
1979         va_end(ap);
1980         fprintf(stderr, "\n");
1981 }
1982
1983 static void zconferror(const char *err)
1984 {
1985         fprintf(stderr, "%s:%d: %s\n", zconf_curname(), zconf_lineno() + 1, err);
1986 }
1987
1988 void print_quoted_string(FILE *out, const char *str)
1989 {
1990         const char *p;
1991         int len;
1992
1993         putc('"', out);
1994         while ((p = strchr(str, '"'))) {
1995                 len = p - str;
1996                 if (len)
1997                         fprintf(out, "%.*s", len, str);
1998                 fputs("\\\"", out);
1999                 str = p + 1;
2000         }
2001         fputs(str, out);
2002         putc('"', out);
2003 }
2004
2005 void print_symbol(FILE *out, struct menu *menu)
2006 {
2007         struct symbol *sym = menu->sym;
2008         struct property *prop;
2009
2010         if (sym_is_choice(sym))
2011                 fprintf(out, "choice\n");
2012         else
2013                 fprintf(out, "config %s\n", sym->name);
2014         switch (sym->type) {
2015         case S_BOOLEAN:
2016                 fputs("  boolean\n", out);
2017                 break;
2018         case S_TRISTATE:
2019                 fputs("  tristate\n", out);
2020                 break;
2021         case S_STRING:
2022                 fputs("  string\n", out);
2023                 break;
2024         case S_INT:
2025                 fputs("  integer\n", out);
2026                 break;
2027         case S_HEX:
2028                 fputs("  hex\n", out);
2029                 break;
2030         default:
2031                 fputs("  ???\n", out);
2032                 break;
2033         }
2034         for (prop = sym->prop; prop; prop = prop->next) {
2035                 if (prop->menu != menu)
2036                         continue;
2037                 switch (prop->type) {
2038                 case P_PROMPT:
2039                         fputs("  prompt ", out);
2040                         print_quoted_string(out, prop->text);
2041                         if (!expr_is_yes(prop->visible.expr)) {
2042                                 fputs(" if ", out);
2043                                 expr_fprint(prop->visible.expr, out);
2044                         }
2045                         fputc('\n', out);
2046                         break;
2047                 case P_DEFAULT:
2048                         fputs( "  default ", out);
2049                         expr_fprint(prop->expr, out);
2050                         if (!expr_is_yes(prop->visible.expr)) {
2051                                 fputs(" if ", out);
2052                                 expr_fprint(prop->visible.expr, out);
2053                         }
2054                         fputc('\n', out);
2055                         break;
2056                 case P_CHOICE:
2057                         fputs("  #choice value\n", out);
2058                         break;
2059                 default:
2060                         fprintf(out, "  unknown prop %d!\n", prop->type);
2061                         break;
2062                 }
2063         }
2064         if (sym->help) {
2065                 int len = strlen(sym->help);
2066                 while (sym->help[--len] == '\n')
2067                         sym->help[len] = 0;
2068                 fprintf(out, "  help\n%s\n", sym->help);
2069         }
2070         fputc('\n', out);
2071 }
2072
2073 void zconfdump(FILE *out)
2074 {
2075         struct property *prop;
2076         struct symbol *sym;
2077         struct menu *menu;
2078
2079         menu = rootmenu.list;
2080         while (menu) {
2081                 if ((sym = menu->sym))
2082                         print_symbol(out, menu);
2083                 else if ((prop = menu->prompt)) {
2084                         switch (prop->type) {
2085                         case P_COMMENT:
2086                                 fputs("\ncomment ", out);
2087                                 print_quoted_string(out, prop->text);
2088                                 fputs("\n", out);
2089                                 break;
2090                         case P_MENU:
2091                                 fputs("\nmenu ", out);
2092                                 print_quoted_string(out, prop->text);
2093                                 fputs("\n", out);
2094                                 break;
2095                         default:
2096                                 ;
2097                         }
2098                         if (!expr_is_yes(prop->visible.expr)) {
2099                                 fputs("  depends ", out);
2100                                 expr_fprint(prop->visible.expr, out);
2101                                 fputc('\n', out);
2102                         }
2103                         fputs("\n", out);
2104                 }
2105
2106                 if (menu->list)
2107                         menu = menu->list;
2108                 else if (menu->next)
2109                         menu = menu->next;
2110                 else while ((menu = menu->parent)) {
2111                         if (menu->prompt && menu->prompt->type == P_MENU)
2112                                 fputs("\nendmenu\n", out);
2113                         if (menu->next) {
2114                                 menu = menu->next;
2115                                 break;
2116                         }
2117                 }
2118         }
2119 }
2120
2121 #include "lex.zconf.c"
2122 #include "confdata.c"
2123 #include "expr.c"
2124 #include "symbol.c"
2125 #include "menu.c"
2126
2127