xref: /freebsd/crypto/heimdal/lib/sl/slc-gram.c (revision 6a068746777241722b2b32c5d0bc443a2a64d80b)
1c19800e8SDoug Rabson /* A Bison parser, made by GNU Bison 2.3.  */
2c19800e8SDoug Rabson 
3c19800e8SDoug Rabson /* Skeleton implementation for Bison's Yacc-like parsers in C
4c19800e8SDoug Rabson 
5c19800e8SDoug Rabson    Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
6c19800e8SDoug Rabson    Free Software Foundation, Inc.
7c19800e8SDoug Rabson 
8c19800e8SDoug Rabson    This program is free software; you can redistribute it and/or modify
9c19800e8SDoug Rabson    it under the terms of the GNU General Public License as published by
10c19800e8SDoug Rabson    the Free Software Foundation; either version 2, or (at your option)
11c19800e8SDoug Rabson    any later version.
12c19800e8SDoug Rabson 
13c19800e8SDoug Rabson    This program is distributed in the hope that it will be useful,
14c19800e8SDoug Rabson    but WITHOUT ANY WARRANTY; without even the implied warranty of
15c19800e8SDoug Rabson    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16c19800e8SDoug Rabson    GNU General Public License for more details.
17c19800e8SDoug Rabson 
18c19800e8SDoug Rabson    You should have received a copy of the GNU General Public License
19c19800e8SDoug Rabson    along with this program; if not, write to the Free Software
20c19800e8SDoug Rabson    Foundation, Inc., 51 Franklin Street, Fifth Floor,
21c19800e8SDoug Rabson    Boston, MA 02110-1301, USA.  */
22c19800e8SDoug Rabson 
23c19800e8SDoug Rabson /* As a special exception, you may create a larger work that contains
24c19800e8SDoug Rabson    part or all of the Bison parser skeleton and distribute that work
25c19800e8SDoug Rabson    under terms of your choice, so long as that work isn't itself a
26c19800e8SDoug Rabson    parser generator using the skeleton or a modified version thereof
27c19800e8SDoug Rabson    as a parser skeleton.  Alternatively, if you modify or redistribute
28c19800e8SDoug Rabson    the parser skeleton itself, you may (at your option) remove this
29c19800e8SDoug Rabson    special exception, which will cause the skeleton and the resulting
30c19800e8SDoug Rabson    Bison output files to be licensed under the GNU General Public
31c19800e8SDoug Rabson    License without this special exception.
32c19800e8SDoug Rabson 
33c19800e8SDoug Rabson    This special exception was added by the Free Software Foundation in
34c19800e8SDoug Rabson    version 2.2 of Bison.  */
35c19800e8SDoug Rabson 
36c19800e8SDoug Rabson /* C LALR(1) parser skeleton written by Richard Stallman, by
37c19800e8SDoug Rabson    simplifying the original so-called "semantic" parser.  */
38c19800e8SDoug Rabson 
39c19800e8SDoug Rabson /* All symbols defined below should begin with yy or YY, to avoid
40c19800e8SDoug Rabson    infringing on user name space.  This should be done even for local
41c19800e8SDoug Rabson    variables, as they might otherwise be expanded by user macros.
42c19800e8SDoug Rabson    There are some unavoidable exceptions within include files to
43c19800e8SDoug Rabson    define necessary library symbols; they are noted "INFRINGES ON
44c19800e8SDoug Rabson    USER NAME SPACE" below.  */
45c19800e8SDoug Rabson 
46c19800e8SDoug Rabson /* Identify Bison output.  */
47c19800e8SDoug Rabson #define YYBISON 1
48c19800e8SDoug Rabson 
49c19800e8SDoug Rabson /* Bison version.  */
50c19800e8SDoug Rabson #define YYBISON_VERSION "2.3"
51c19800e8SDoug Rabson 
52c19800e8SDoug Rabson /* Skeleton name.  */
53c19800e8SDoug Rabson #define YYSKELETON_NAME "yacc.c"
54c19800e8SDoug Rabson 
55c19800e8SDoug Rabson /* Pure parsers.  */
56c19800e8SDoug Rabson #define YYPURE 0
57c19800e8SDoug Rabson 
58c19800e8SDoug Rabson /* Using locations.  */
59c19800e8SDoug Rabson #define YYLSP_NEEDED 0
60c19800e8SDoug Rabson 
61c19800e8SDoug Rabson 
62c19800e8SDoug Rabson 
63c19800e8SDoug Rabson /* Tokens.  */
64c19800e8SDoug Rabson #ifndef YYTOKENTYPE
65c19800e8SDoug Rabson # define YYTOKENTYPE
66c19800e8SDoug Rabson    /* Put the tokens into the symbol table, so that GDB and other debuggers
67c19800e8SDoug Rabson       know about them.  */
68c19800e8SDoug Rabson    enum yytokentype {
69c19800e8SDoug Rabson      LITERAL = 258,
70c19800e8SDoug Rabson      STRING = 259
71c19800e8SDoug Rabson    };
72c19800e8SDoug Rabson #endif
73c19800e8SDoug Rabson /* Tokens.  */
74c19800e8SDoug Rabson #define LITERAL 258
75c19800e8SDoug Rabson #define STRING 259
76c19800e8SDoug Rabson 
77c19800e8SDoug Rabson 
78c19800e8SDoug Rabson 
79c19800e8SDoug Rabson 
80c19800e8SDoug Rabson /* Copy the first part of user declarations.  */
81c19800e8SDoug Rabson #line 1 "slc-gram.y"
82c19800e8SDoug Rabson 
83c19800e8SDoug Rabson /*
84*ae771770SStanislav Sedov  * Copyright (c) 2004-2006 Kungliga Tekniska Högskolan
85c19800e8SDoug Rabson  * (Royal Institute of Technology, Stockholm, Sweden).
86c19800e8SDoug Rabson  * All rights reserved.
87c19800e8SDoug Rabson  *
88c19800e8SDoug Rabson  * Redistribution and use in source and binary forms, with or without
89c19800e8SDoug Rabson  * modification, are permitted provided that the following conditions
90c19800e8SDoug Rabson  * are met:
91c19800e8SDoug Rabson  *
92c19800e8SDoug Rabson  * 1. Redistributions of source code must retain the above copyright
93c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer.
94c19800e8SDoug Rabson  *
95c19800e8SDoug Rabson  * 2. Redistributions in binary form must reproduce the above copyright
96c19800e8SDoug Rabson  *    notice, this list of conditions and the following disclaimer in the
97c19800e8SDoug Rabson  *    documentation and/or other materials provided with the distribution.
98c19800e8SDoug Rabson  *
99c19800e8SDoug Rabson  * 3. Neither the name of the Institute nor the names of its contributors
100c19800e8SDoug Rabson  *    may be used to endorse or promote products derived from this software
101c19800e8SDoug Rabson  *    without specific prior written permission.
102c19800e8SDoug Rabson  *
103c19800e8SDoug Rabson  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
104c19800e8SDoug Rabson  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
105c19800e8SDoug Rabson  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
106c19800e8SDoug Rabson  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
107c19800e8SDoug Rabson  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
108c19800e8SDoug Rabson  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
109c19800e8SDoug Rabson  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
110c19800e8SDoug Rabson  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
111c19800e8SDoug Rabson  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
112c19800e8SDoug Rabson  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
113c19800e8SDoug Rabson  * SUCH DAMAGE.
114c19800e8SDoug Rabson  */
115c19800e8SDoug Rabson 
116c19800e8SDoug Rabson #include <config.h>
117c19800e8SDoug Rabson 
118c19800e8SDoug Rabson #include <stdio.h>
119c19800e8SDoug Rabson #include <stdlib.h>
120c19800e8SDoug Rabson #include <err.h>
121c19800e8SDoug Rabson #include <ctype.h>
122c19800e8SDoug Rabson #include <limits.h>
123c19800e8SDoug Rabson #include <getarg.h>
124c19800e8SDoug Rabson #include <vers.h>
125c19800e8SDoug Rabson #include <roken.h>
126c19800e8SDoug Rabson 
127c19800e8SDoug Rabson #include "slc.h"
128c19800e8SDoug Rabson extern FILE *yyin;
129c19800e8SDoug Rabson extern struct assignment *assignment;
130c19800e8SDoug Rabson 
131*ae771770SStanislav Sedov /* Declarations for Bison:
132*ae771770SStanislav Sedov  */
133*ae771770SStanislav Sedov #define YYMALLOC        malloc
134*ae771770SStanislav Sedov #define YYFREE          free
135*ae771770SStanislav Sedov 
136*ae771770SStanislav Sedov 
137c19800e8SDoug Rabson 
138c19800e8SDoug Rabson /* Enabling traces.  */
139c19800e8SDoug Rabson #ifndef YYDEBUG
140c19800e8SDoug Rabson # define YYDEBUG 0
141c19800e8SDoug Rabson #endif
142c19800e8SDoug Rabson 
143c19800e8SDoug Rabson /* Enabling verbose error messages.  */
144c19800e8SDoug Rabson #ifdef YYERROR_VERBOSE
145c19800e8SDoug Rabson # undef YYERROR_VERBOSE
146c19800e8SDoug Rabson # define YYERROR_VERBOSE 1
147c19800e8SDoug Rabson #else
148c19800e8SDoug Rabson # define YYERROR_VERBOSE 0
149c19800e8SDoug Rabson #endif
150c19800e8SDoug Rabson 
151c19800e8SDoug Rabson /* Enabling the token table.  */
152c19800e8SDoug Rabson #ifndef YYTOKEN_TABLE
153c19800e8SDoug Rabson # define YYTOKEN_TABLE 0
154c19800e8SDoug Rabson #endif
155c19800e8SDoug Rabson 
156c19800e8SDoug Rabson #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
157c19800e8SDoug Rabson typedef union YYSTYPE
158*ae771770SStanislav Sedov #line 57 "slc-gram.y"
159c19800e8SDoug Rabson {
160c19800e8SDoug Rabson 	char *string;
161c19800e8SDoug Rabson 	struct assignment *assignment;
162c19800e8SDoug Rabson }
163c19800e8SDoug Rabson /* Line 193 of yacc.c.  */
164*ae771770SStanislav Sedov #line 165 "slc-gram.c"
165c19800e8SDoug Rabson 	YYSTYPE;
166c19800e8SDoug Rabson # define yystype YYSTYPE /* obsolescent; will be withdrawn */
167c19800e8SDoug Rabson # define YYSTYPE_IS_DECLARED 1
168c19800e8SDoug Rabson # define YYSTYPE_IS_TRIVIAL 1
169c19800e8SDoug Rabson #endif
170c19800e8SDoug Rabson 
171c19800e8SDoug Rabson 
172c19800e8SDoug Rabson 
173c19800e8SDoug Rabson /* Copy the second part of user declarations.  */
174c19800e8SDoug Rabson 
175c19800e8SDoug Rabson 
176c19800e8SDoug Rabson /* Line 216 of yacc.c.  */
177*ae771770SStanislav Sedov #line 178 "slc-gram.c"
178c19800e8SDoug Rabson 
179c19800e8SDoug Rabson #ifdef short
180c19800e8SDoug Rabson # undef short
181c19800e8SDoug Rabson #endif
182c19800e8SDoug Rabson 
183c19800e8SDoug Rabson #ifdef YYTYPE_UINT8
184c19800e8SDoug Rabson typedef YYTYPE_UINT8 yytype_uint8;
185c19800e8SDoug Rabson #else
186c19800e8SDoug Rabson typedef unsigned char yytype_uint8;
187c19800e8SDoug Rabson #endif
188c19800e8SDoug Rabson 
189c19800e8SDoug Rabson #ifdef YYTYPE_INT8
190c19800e8SDoug Rabson typedef YYTYPE_INT8 yytype_int8;
191c19800e8SDoug Rabson #elif (defined __STDC__ || defined __C99__FUNC__ \
192c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
193c19800e8SDoug Rabson typedef signed char yytype_int8;
194c19800e8SDoug Rabson #else
195c19800e8SDoug Rabson typedef short int yytype_int8;
196c19800e8SDoug Rabson #endif
197c19800e8SDoug Rabson 
198c19800e8SDoug Rabson #ifdef YYTYPE_UINT16
199c19800e8SDoug Rabson typedef YYTYPE_UINT16 yytype_uint16;
200c19800e8SDoug Rabson #else
201c19800e8SDoug Rabson typedef unsigned short int yytype_uint16;
202c19800e8SDoug Rabson #endif
203c19800e8SDoug Rabson 
204c19800e8SDoug Rabson #ifdef YYTYPE_INT16
205c19800e8SDoug Rabson typedef YYTYPE_INT16 yytype_int16;
206c19800e8SDoug Rabson #else
207c19800e8SDoug Rabson typedef short int yytype_int16;
208c19800e8SDoug Rabson #endif
209c19800e8SDoug Rabson 
210c19800e8SDoug Rabson #ifndef YYSIZE_T
211c19800e8SDoug Rabson # ifdef __SIZE_TYPE__
212c19800e8SDoug Rabson #  define YYSIZE_T __SIZE_TYPE__
213c19800e8SDoug Rabson # elif defined size_t
214c19800e8SDoug Rabson #  define YYSIZE_T size_t
215c19800e8SDoug Rabson # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
216c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
217c19800e8SDoug Rabson #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
218c19800e8SDoug Rabson #  define YYSIZE_T size_t
219c19800e8SDoug Rabson # else
220c19800e8SDoug Rabson #  define YYSIZE_T unsigned int
221c19800e8SDoug Rabson # endif
222c19800e8SDoug Rabson #endif
223c19800e8SDoug Rabson 
224c19800e8SDoug Rabson #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
225c19800e8SDoug Rabson 
226c19800e8SDoug Rabson #ifndef YY_
227c19800e8SDoug Rabson # if defined YYENABLE_NLS && YYENABLE_NLS
228c19800e8SDoug Rabson #  if ENABLE_NLS
229c19800e8SDoug Rabson #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
230c19800e8SDoug Rabson #   define YY_(msgid) dgettext ("bison-runtime", msgid)
231c19800e8SDoug Rabson #  endif
232c19800e8SDoug Rabson # endif
233c19800e8SDoug Rabson # ifndef YY_
234c19800e8SDoug Rabson #  define YY_(msgid) msgid
235c19800e8SDoug Rabson # endif
236c19800e8SDoug Rabson #endif
237c19800e8SDoug Rabson 
238c19800e8SDoug Rabson /* Suppress unused-variable warnings by "using" E.  */
239c19800e8SDoug Rabson #if ! defined lint || defined __GNUC__
240c19800e8SDoug Rabson # define YYUSE(e) ((void) (e))
241c19800e8SDoug Rabson #else
242c19800e8SDoug Rabson # define YYUSE(e) /* empty */
243c19800e8SDoug Rabson #endif
244c19800e8SDoug Rabson 
245c19800e8SDoug Rabson /* Identity function, used to suppress warnings about constant conditions.  */
246c19800e8SDoug Rabson #ifndef lint
247c19800e8SDoug Rabson # define YYID(n) (n)
248c19800e8SDoug Rabson #else
249c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
250c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
251c19800e8SDoug Rabson static int
YYID(int i)252c19800e8SDoug Rabson YYID (int i)
253c19800e8SDoug Rabson #else
254c19800e8SDoug Rabson static int
255c19800e8SDoug Rabson YYID (i)
256c19800e8SDoug Rabson     int i;
257c19800e8SDoug Rabson #endif
258c19800e8SDoug Rabson {
259c19800e8SDoug Rabson   return i;
260c19800e8SDoug Rabson }
261c19800e8SDoug Rabson #endif
262c19800e8SDoug Rabson 
263c19800e8SDoug Rabson #if ! defined yyoverflow || YYERROR_VERBOSE
264c19800e8SDoug Rabson 
265c19800e8SDoug Rabson /* The parser invokes alloca or malloc; define the necessary symbols.  */
266c19800e8SDoug Rabson 
267c19800e8SDoug Rabson # ifdef YYSTACK_USE_ALLOCA
268c19800e8SDoug Rabson #  if YYSTACK_USE_ALLOCA
269c19800e8SDoug Rabson #   ifdef __GNUC__
270c19800e8SDoug Rabson #    define YYSTACK_ALLOC __builtin_alloca
271c19800e8SDoug Rabson #   elif defined __BUILTIN_VA_ARG_INCR
272c19800e8SDoug Rabson #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
273c19800e8SDoug Rabson #   elif defined _AIX
274c19800e8SDoug Rabson #    define YYSTACK_ALLOC __alloca
275c19800e8SDoug Rabson #   elif defined _MSC_VER
276c19800e8SDoug Rabson #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
277c19800e8SDoug Rabson #    define alloca _alloca
278c19800e8SDoug Rabson #   else
279c19800e8SDoug Rabson #    define YYSTACK_ALLOC alloca
280c19800e8SDoug Rabson #    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
281c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
282c19800e8SDoug Rabson #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
283c19800e8SDoug Rabson #     ifndef _STDLIB_H
284c19800e8SDoug Rabson #      define _STDLIB_H 1
285c19800e8SDoug Rabson #     endif
286c19800e8SDoug Rabson #    endif
287c19800e8SDoug Rabson #   endif
288c19800e8SDoug Rabson #  endif
289c19800e8SDoug Rabson # endif
290c19800e8SDoug Rabson 
291c19800e8SDoug Rabson # ifdef YYSTACK_ALLOC
292c19800e8SDoug Rabson    /* Pacify GCC's `empty if-body' warning.  */
293c19800e8SDoug Rabson #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
294c19800e8SDoug Rabson #  ifndef YYSTACK_ALLOC_MAXIMUM
295c19800e8SDoug Rabson     /* The OS might guarantee only one guard page at the bottom of the stack,
296c19800e8SDoug Rabson        and a page size can be as small as 4096 bytes.  So we cannot safely
297c19800e8SDoug Rabson        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
298c19800e8SDoug Rabson        to allow for a few compiler-allocated temporary stack slots.  */
299c19800e8SDoug Rabson #   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
300c19800e8SDoug Rabson #  endif
301c19800e8SDoug Rabson # else
302c19800e8SDoug Rabson #  define YYSTACK_ALLOC YYMALLOC
303c19800e8SDoug Rabson #  define YYSTACK_FREE YYFREE
304c19800e8SDoug Rabson #  ifndef YYSTACK_ALLOC_MAXIMUM
305c19800e8SDoug Rabson #   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
306c19800e8SDoug Rabson #  endif
307c19800e8SDoug Rabson #  if (defined __cplusplus && ! defined _STDLIB_H \
308c19800e8SDoug Rabson        && ! ((defined YYMALLOC || defined malloc) \
309c19800e8SDoug Rabson 	     && (defined YYFREE || defined free)))
310c19800e8SDoug Rabson #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
311c19800e8SDoug Rabson #   ifndef _STDLIB_H
312c19800e8SDoug Rabson #    define _STDLIB_H 1
313c19800e8SDoug Rabson #   endif
314c19800e8SDoug Rabson #  endif
315c19800e8SDoug Rabson #  ifndef YYMALLOC
316c19800e8SDoug Rabson #   define YYMALLOC malloc
317c19800e8SDoug Rabson #   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
318c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
319c19800e8SDoug Rabson void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
320c19800e8SDoug Rabson #   endif
321c19800e8SDoug Rabson #  endif
322c19800e8SDoug Rabson #  ifndef YYFREE
323c19800e8SDoug Rabson #   define YYFREE free
324c19800e8SDoug Rabson #   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
325c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
326c19800e8SDoug Rabson void free (void *); /* INFRINGES ON USER NAME SPACE */
327c19800e8SDoug Rabson #   endif
328c19800e8SDoug Rabson #  endif
329c19800e8SDoug Rabson # endif
330c19800e8SDoug Rabson #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
331c19800e8SDoug Rabson 
332c19800e8SDoug Rabson 
333c19800e8SDoug Rabson #if (! defined yyoverflow \
334c19800e8SDoug Rabson      && (! defined __cplusplus \
335c19800e8SDoug Rabson 	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
336c19800e8SDoug Rabson 
337c19800e8SDoug Rabson /* A type that is properly aligned for any stack member.  */
338c19800e8SDoug Rabson union yyalloc
339c19800e8SDoug Rabson {
340c19800e8SDoug Rabson   yytype_int16 yyss;
341c19800e8SDoug Rabson   YYSTYPE yyvs;
342c19800e8SDoug Rabson   };
343c19800e8SDoug Rabson 
344c19800e8SDoug Rabson /* The size of the maximum gap between one aligned stack and the next.  */
345c19800e8SDoug Rabson # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
346c19800e8SDoug Rabson 
347c19800e8SDoug Rabson /* The size of an array large to enough to hold all stacks, each with
348c19800e8SDoug Rabson    N elements.  */
349c19800e8SDoug Rabson # define YYSTACK_BYTES(N) \
350c19800e8SDoug Rabson      ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
351c19800e8SDoug Rabson       + YYSTACK_GAP_MAXIMUM)
352c19800e8SDoug Rabson 
353c19800e8SDoug Rabson /* Copy COUNT objects from FROM to TO.  The source and destination do
354c19800e8SDoug Rabson    not overlap.  */
355c19800e8SDoug Rabson # ifndef YYCOPY
356c19800e8SDoug Rabson #  if defined __GNUC__ && 1 < __GNUC__
357c19800e8SDoug Rabson #   define YYCOPY(To, From, Count) \
358c19800e8SDoug Rabson       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
359c19800e8SDoug Rabson #  else
360c19800e8SDoug Rabson #   define YYCOPY(To, From, Count)		\
361c19800e8SDoug Rabson       do					\
362c19800e8SDoug Rabson 	{					\
363c19800e8SDoug Rabson 	  YYSIZE_T yyi;				\
364c19800e8SDoug Rabson 	  for (yyi = 0; yyi < (Count); yyi++)	\
365c19800e8SDoug Rabson 	    (To)[yyi] = (From)[yyi];		\
366c19800e8SDoug Rabson 	}					\
367c19800e8SDoug Rabson       while (YYID (0))
368c19800e8SDoug Rabson #  endif
369c19800e8SDoug Rabson # endif
370c19800e8SDoug Rabson 
371c19800e8SDoug Rabson /* Relocate STACK from its old location to the new one.  The
372c19800e8SDoug Rabson    local variables YYSIZE and YYSTACKSIZE give the old and new number of
373c19800e8SDoug Rabson    elements in the stack, and YYPTR gives the new location of the
374c19800e8SDoug Rabson    stack.  Advance YYPTR to a properly aligned location for the next
375c19800e8SDoug Rabson    stack.  */
376c19800e8SDoug Rabson # define YYSTACK_RELOCATE(Stack)					\
377c19800e8SDoug Rabson     do									\
378c19800e8SDoug Rabson       {									\
379c19800e8SDoug Rabson 	YYSIZE_T yynewbytes;						\
380c19800e8SDoug Rabson 	YYCOPY (&yyptr->Stack, Stack, yysize);				\
381c19800e8SDoug Rabson 	Stack = &yyptr->Stack;						\
382c19800e8SDoug Rabson 	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
383c19800e8SDoug Rabson 	yyptr += yynewbytes / sizeof (*yyptr);				\
384c19800e8SDoug Rabson       }									\
385c19800e8SDoug Rabson     while (YYID (0))
386c19800e8SDoug Rabson 
387c19800e8SDoug Rabson #endif
388c19800e8SDoug Rabson 
389c19800e8SDoug Rabson /* YYFINAL -- State number of the termination state.  */
390c19800e8SDoug Rabson #define YYFINAL  6
391c19800e8SDoug Rabson /* YYLAST -- Last index in YYTABLE.  */
392c19800e8SDoug Rabson #define YYLAST   7
393c19800e8SDoug Rabson 
394c19800e8SDoug Rabson /* YYNTOKENS -- Number of terminals.  */
395c19800e8SDoug Rabson #define YYNTOKENS  8
396c19800e8SDoug Rabson /* YYNNTS -- Number of nonterminals.  */
397c19800e8SDoug Rabson #define YYNNTS  4
398c19800e8SDoug Rabson /* YYNRULES -- Number of rules.  */
399c19800e8SDoug Rabson #define YYNRULES  6
400c19800e8SDoug Rabson /* YYNRULES -- Number of states.  */
401c19800e8SDoug Rabson #define YYNSTATES  12
402c19800e8SDoug Rabson 
403c19800e8SDoug Rabson /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
404c19800e8SDoug Rabson #define YYUNDEFTOK  2
405c19800e8SDoug Rabson #define YYMAXUTOK   259
406c19800e8SDoug Rabson 
407c19800e8SDoug Rabson #define YYTRANSLATE(YYX)						\
408c19800e8SDoug Rabson   ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
409c19800e8SDoug Rabson 
410c19800e8SDoug Rabson /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
411c19800e8SDoug Rabson static const yytype_uint8 yytranslate[] =
412c19800e8SDoug Rabson {
413c19800e8SDoug Rabson        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
414c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
415c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
416c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
417c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
418c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
419c19800e8SDoug Rabson        2,     5,     2,     2,     2,     2,     2,     2,     2,     2,
420c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
421c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
422c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
423c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
424c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
425c19800e8SDoug Rabson        2,     2,     2,     6,     2,     7,     2,     2,     2,     2,
426c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
427c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
428c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
429c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
430c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
431c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
432c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
433c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
434c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
435c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
436c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
437c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
438c19800e8SDoug Rabson        2,     2,     2,     2,     2,     2,     1,     2,     3,     4
439c19800e8SDoug Rabson };
440c19800e8SDoug Rabson 
441c19800e8SDoug Rabson #if YYDEBUG
442c19800e8SDoug Rabson /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
443c19800e8SDoug Rabson    YYRHS.  */
444c19800e8SDoug Rabson static const yytype_uint8 yyprhs[] =
445c19800e8SDoug Rabson {
446c19800e8SDoug Rabson        0,     0,     3,     5,     8,    10,    14
447c19800e8SDoug Rabson };
448c19800e8SDoug Rabson 
449c19800e8SDoug Rabson /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
450c19800e8SDoug Rabson static const yytype_int8 yyrhs[] =
451c19800e8SDoug Rabson {
452c19800e8SDoug Rabson        9,     0,    -1,    10,    -1,    11,    10,    -1,    11,    -1,
453c19800e8SDoug Rabson        3,     5,     4,    -1,     3,     5,     6,    10,     7,    -1
454c19800e8SDoug Rabson };
455c19800e8SDoug Rabson 
456c19800e8SDoug Rabson /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
457c19800e8SDoug Rabson static const yytype_uint8 yyrline[] =
458c19800e8SDoug Rabson {
459*ae771770SStanislav Sedov        0,    70,    70,    76,    81,    84,    93
460c19800e8SDoug Rabson };
461c19800e8SDoug Rabson #endif
462c19800e8SDoug Rabson 
463c19800e8SDoug Rabson #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
464c19800e8SDoug Rabson /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
465c19800e8SDoug Rabson    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
466c19800e8SDoug Rabson static const char *const yytname[] =
467c19800e8SDoug Rabson {
468c19800e8SDoug Rabson   "$end", "error", "$undefined", "LITERAL", "STRING", "'='", "'{'", "'}'",
469c19800e8SDoug Rabson   "$accept", "start", "assignments", "assignment", 0
470c19800e8SDoug Rabson };
471c19800e8SDoug Rabson #endif
472c19800e8SDoug Rabson 
473c19800e8SDoug Rabson # ifdef YYPRINT
474c19800e8SDoug Rabson /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
475c19800e8SDoug Rabson    token YYLEX-NUM.  */
476c19800e8SDoug Rabson static const yytype_uint16 yytoknum[] =
477c19800e8SDoug Rabson {
478c19800e8SDoug Rabson        0,   256,   257,   258,   259,    61,   123,   125
479c19800e8SDoug Rabson };
480c19800e8SDoug Rabson # endif
481c19800e8SDoug Rabson 
482c19800e8SDoug Rabson /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
483c19800e8SDoug Rabson static const yytype_uint8 yyr1[] =
484c19800e8SDoug Rabson {
485c19800e8SDoug Rabson        0,     8,     9,    10,    10,    11,    11
486c19800e8SDoug Rabson };
487c19800e8SDoug Rabson 
488c19800e8SDoug Rabson /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
489c19800e8SDoug Rabson static const yytype_uint8 yyr2[] =
490c19800e8SDoug Rabson {
491c19800e8SDoug Rabson        0,     2,     1,     2,     1,     3,     5
492c19800e8SDoug Rabson };
493c19800e8SDoug Rabson 
494c19800e8SDoug Rabson /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
495c19800e8SDoug Rabson    STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
496c19800e8SDoug Rabson    means the default is an error.  */
497c19800e8SDoug Rabson static const yytype_uint8 yydefact[] =
498c19800e8SDoug Rabson {
499c19800e8SDoug Rabson        0,     0,     0,     2,     4,     0,     1,     3,     5,     0,
500c19800e8SDoug Rabson        0,     6
501c19800e8SDoug Rabson };
502c19800e8SDoug Rabson 
503c19800e8SDoug Rabson /* YYDEFGOTO[NTERM-NUM].  */
504c19800e8SDoug Rabson static const yytype_int8 yydefgoto[] =
505c19800e8SDoug Rabson {
506c19800e8SDoug Rabson       -1,     2,     3,     4
507c19800e8SDoug Rabson };
508c19800e8SDoug Rabson 
509c19800e8SDoug Rabson /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
510c19800e8SDoug Rabson    STATE-NUM.  */
511c19800e8SDoug Rabson #define YYPACT_NINF -5
512c19800e8SDoug Rabson static const yytype_int8 yypact[] =
513c19800e8SDoug Rabson {
514c19800e8SDoug Rabson       -1,     1,     4,    -5,    -1,    -3,    -5,    -5,    -5,    -1,
515c19800e8SDoug Rabson        0,    -5
516c19800e8SDoug Rabson };
517c19800e8SDoug Rabson 
518c19800e8SDoug Rabson /* YYPGOTO[NTERM-NUM].  */
519c19800e8SDoug Rabson static const yytype_int8 yypgoto[] =
520c19800e8SDoug Rabson {
521c19800e8SDoug Rabson       -5,    -5,    -4,    -5
522c19800e8SDoug Rabson };
523c19800e8SDoug Rabson 
524c19800e8SDoug Rabson /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
525c19800e8SDoug Rabson    positive, shift that token.  If negative, reduce the rule which
526c19800e8SDoug Rabson    number is the opposite.  If zero, do what YYDEFACT says.
527c19800e8SDoug Rabson    If YYTABLE_NINF, syntax error.  */
528c19800e8SDoug Rabson #define YYTABLE_NINF -1
529c19800e8SDoug Rabson static const yytype_uint8 yytable[] =
530c19800e8SDoug Rabson {
531c19800e8SDoug Rabson        7,     8,     1,     9,     6,    10,     5,    11
532c19800e8SDoug Rabson };
533c19800e8SDoug Rabson 
534c19800e8SDoug Rabson static const yytype_uint8 yycheck[] =
535c19800e8SDoug Rabson {
536c19800e8SDoug Rabson        4,     4,     3,     6,     0,     9,     5,     7
537c19800e8SDoug Rabson };
538c19800e8SDoug Rabson 
539c19800e8SDoug Rabson /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
540c19800e8SDoug Rabson    symbol of state STATE-NUM.  */
541c19800e8SDoug Rabson static const yytype_uint8 yystos[] =
542c19800e8SDoug Rabson {
543c19800e8SDoug Rabson        0,     3,     9,    10,    11,     5,     0,    10,     4,     6,
544c19800e8SDoug Rabson       10,     7
545c19800e8SDoug Rabson };
546c19800e8SDoug Rabson 
547c19800e8SDoug Rabson #define yyerrok		(yyerrstatus = 0)
548c19800e8SDoug Rabson #define yyclearin	(yychar = YYEMPTY)
549c19800e8SDoug Rabson #define YYEMPTY		(-2)
550c19800e8SDoug Rabson #define YYEOF		0
551c19800e8SDoug Rabson 
552c19800e8SDoug Rabson #define YYACCEPT	goto yyacceptlab
553c19800e8SDoug Rabson #define YYABORT		goto yyabortlab
554c19800e8SDoug Rabson #define YYERROR		goto yyerrorlab
555c19800e8SDoug Rabson 
556c19800e8SDoug Rabson 
557c19800e8SDoug Rabson /* Like YYERROR except do call yyerror.  This remains here temporarily
558c19800e8SDoug Rabson    to ease the transition to the new meaning of YYERROR, for GCC.
559c19800e8SDoug Rabson    Once GCC version 2 has supplanted version 1, this can go.  */
560c19800e8SDoug Rabson 
561c19800e8SDoug Rabson #define YYFAIL		goto yyerrlab
562c19800e8SDoug Rabson 
563c19800e8SDoug Rabson #define YYRECOVERING()  (!!yyerrstatus)
564c19800e8SDoug Rabson 
565c19800e8SDoug Rabson #define YYBACKUP(Token, Value)					\
566c19800e8SDoug Rabson do								\
567c19800e8SDoug Rabson   if (yychar == YYEMPTY && yylen == 1)				\
568c19800e8SDoug Rabson     {								\
569c19800e8SDoug Rabson       yychar = (Token);						\
570c19800e8SDoug Rabson       yylval = (Value);						\
571c19800e8SDoug Rabson       yytoken = YYTRANSLATE (yychar);				\
572c19800e8SDoug Rabson       YYPOPSTACK (1);						\
573c19800e8SDoug Rabson       goto yybackup;						\
574c19800e8SDoug Rabson     }								\
575c19800e8SDoug Rabson   else								\
576c19800e8SDoug Rabson     {								\
577c19800e8SDoug Rabson       yyerror (YY_("syntax error: cannot back up")); \
578c19800e8SDoug Rabson       YYERROR;							\
579c19800e8SDoug Rabson     }								\
580c19800e8SDoug Rabson while (YYID (0))
581c19800e8SDoug Rabson 
582c19800e8SDoug Rabson 
583c19800e8SDoug Rabson #define YYTERROR	1
584c19800e8SDoug Rabson #define YYERRCODE	256
585c19800e8SDoug Rabson 
586c19800e8SDoug Rabson 
587c19800e8SDoug Rabson /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
588c19800e8SDoug Rabson    If N is 0, then set CURRENT to the empty location which ends
589c19800e8SDoug Rabson    the previous symbol: RHS[0] (always defined).  */
590c19800e8SDoug Rabson 
591c19800e8SDoug Rabson #define YYRHSLOC(Rhs, K) ((Rhs)[K])
592c19800e8SDoug Rabson #ifndef YYLLOC_DEFAULT
593c19800e8SDoug Rabson # define YYLLOC_DEFAULT(Current, Rhs, N)				\
594c19800e8SDoug Rabson     do									\
595c19800e8SDoug Rabson       if (YYID (N))                                                    \
596c19800e8SDoug Rabson 	{								\
597c19800e8SDoug Rabson 	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
598c19800e8SDoug Rabson 	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
599c19800e8SDoug Rabson 	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
600c19800e8SDoug Rabson 	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
601c19800e8SDoug Rabson 	}								\
602c19800e8SDoug Rabson       else								\
603c19800e8SDoug Rabson 	{								\
604c19800e8SDoug Rabson 	  (Current).first_line   = (Current).last_line   =		\
605c19800e8SDoug Rabson 	    YYRHSLOC (Rhs, 0).last_line;				\
606c19800e8SDoug Rabson 	  (Current).first_column = (Current).last_column =		\
607c19800e8SDoug Rabson 	    YYRHSLOC (Rhs, 0).last_column;				\
608c19800e8SDoug Rabson 	}								\
609c19800e8SDoug Rabson     while (YYID (0))
610c19800e8SDoug Rabson #endif
611c19800e8SDoug Rabson 
612c19800e8SDoug Rabson 
613c19800e8SDoug Rabson /* YY_LOCATION_PRINT -- Print the location on the stream.
614c19800e8SDoug Rabson    This macro was not mandated originally: define only if we know
615c19800e8SDoug Rabson    we won't break user code: when these are the locations we know.  */
616c19800e8SDoug Rabson 
617c19800e8SDoug Rabson #ifndef YY_LOCATION_PRINT
618c19800e8SDoug Rabson # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
619c19800e8SDoug Rabson #  define YY_LOCATION_PRINT(File, Loc)			\
620c19800e8SDoug Rabson      fprintf (File, "%d.%d-%d.%d",			\
621c19800e8SDoug Rabson 	      (Loc).first_line, (Loc).first_column,	\
622c19800e8SDoug Rabson 	      (Loc).last_line,  (Loc).last_column)
623c19800e8SDoug Rabson # else
624c19800e8SDoug Rabson #  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
625c19800e8SDoug Rabson # endif
626c19800e8SDoug Rabson #endif
627c19800e8SDoug Rabson 
628c19800e8SDoug Rabson 
629c19800e8SDoug Rabson /* YYLEX -- calling `yylex' with the right arguments.  */
630c19800e8SDoug Rabson 
631c19800e8SDoug Rabson #ifdef YYLEX_PARAM
632c19800e8SDoug Rabson # define YYLEX yylex (YYLEX_PARAM)
633c19800e8SDoug Rabson #else
634c19800e8SDoug Rabson # define YYLEX yylex ()
635c19800e8SDoug Rabson #endif
636c19800e8SDoug Rabson 
637c19800e8SDoug Rabson /* Enable debugging if requested.  */
638c19800e8SDoug Rabson #if YYDEBUG
639c19800e8SDoug Rabson 
640c19800e8SDoug Rabson # ifndef YYFPRINTF
641c19800e8SDoug Rabson #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
642c19800e8SDoug Rabson #  define YYFPRINTF fprintf
643c19800e8SDoug Rabson # endif
644c19800e8SDoug Rabson 
645c19800e8SDoug Rabson # define YYDPRINTF(Args)			\
646c19800e8SDoug Rabson do {						\
647c19800e8SDoug Rabson   if (yydebug)					\
648c19800e8SDoug Rabson     YYFPRINTF Args;				\
649c19800e8SDoug Rabson } while (YYID (0))
650c19800e8SDoug Rabson 
651c19800e8SDoug Rabson # define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
652c19800e8SDoug Rabson do {									  \
653c19800e8SDoug Rabson   if (yydebug)								  \
654c19800e8SDoug Rabson     {									  \
655c19800e8SDoug Rabson       YYFPRINTF (stderr, "%s ", Title);					  \
656c19800e8SDoug Rabson       yy_symbol_print (stderr,						  \
657c19800e8SDoug Rabson 		  Type, Value); \
658c19800e8SDoug Rabson       YYFPRINTF (stderr, "\n");						  \
659c19800e8SDoug Rabson     }									  \
660c19800e8SDoug Rabson } while (YYID (0))
661c19800e8SDoug Rabson 
662c19800e8SDoug Rabson 
663c19800e8SDoug Rabson /*--------------------------------.
664c19800e8SDoug Rabson | Print this symbol on YYOUTPUT.  |
665c19800e8SDoug Rabson `--------------------------------*/
666c19800e8SDoug Rabson 
667c19800e8SDoug Rabson /*ARGSUSED*/
668c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
669c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
670c19800e8SDoug Rabson static void
yy_symbol_value_print(FILE * yyoutput,int yytype,YYSTYPE const * const yyvaluep)671c19800e8SDoug Rabson yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
672c19800e8SDoug Rabson #else
673c19800e8SDoug Rabson static void
674c19800e8SDoug Rabson yy_symbol_value_print (yyoutput, yytype, yyvaluep)
675c19800e8SDoug Rabson     FILE *yyoutput;
676c19800e8SDoug Rabson     int yytype;
677c19800e8SDoug Rabson     YYSTYPE const * const yyvaluep;
678c19800e8SDoug Rabson #endif
679c19800e8SDoug Rabson {
680c19800e8SDoug Rabson   if (!yyvaluep)
681c19800e8SDoug Rabson     return;
682c19800e8SDoug Rabson # ifdef YYPRINT
683c19800e8SDoug Rabson   if (yytype < YYNTOKENS)
684c19800e8SDoug Rabson     YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
685c19800e8SDoug Rabson # else
686c19800e8SDoug Rabson   YYUSE (yyoutput);
687c19800e8SDoug Rabson # endif
688c19800e8SDoug Rabson   switch (yytype)
689c19800e8SDoug Rabson     {
690c19800e8SDoug Rabson       default:
691c19800e8SDoug Rabson 	break;
692c19800e8SDoug Rabson     }
693c19800e8SDoug Rabson }
694c19800e8SDoug Rabson 
695c19800e8SDoug Rabson 
696c19800e8SDoug Rabson /*--------------------------------.
697c19800e8SDoug Rabson | Print this symbol on YYOUTPUT.  |
698c19800e8SDoug Rabson `--------------------------------*/
699c19800e8SDoug Rabson 
700c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
701c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
702c19800e8SDoug Rabson static void
yy_symbol_print(FILE * yyoutput,int yytype,YYSTYPE const * const yyvaluep)703c19800e8SDoug Rabson yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
704c19800e8SDoug Rabson #else
705c19800e8SDoug Rabson static void
706c19800e8SDoug Rabson yy_symbol_print (yyoutput, yytype, yyvaluep)
707c19800e8SDoug Rabson     FILE *yyoutput;
708c19800e8SDoug Rabson     int yytype;
709c19800e8SDoug Rabson     YYSTYPE const * const yyvaluep;
710c19800e8SDoug Rabson #endif
711c19800e8SDoug Rabson {
712c19800e8SDoug Rabson   if (yytype < YYNTOKENS)
713c19800e8SDoug Rabson     YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
714c19800e8SDoug Rabson   else
715c19800e8SDoug Rabson     YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
716c19800e8SDoug Rabson 
717c19800e8SDoug Rabson   yy_symbol_value_print (yyoutput, yytype, yyvaluep);
718c19800e8SDoug Rabson   YYFPRINTF (yyoutput, ")");
719c19800e8SDoug Rabson }
720c19800e8SDoug Rabson 
721c19800e8SDoug Rabson /*------------------------------------------------------------------.
722c19800e8SDoug Rabson | yy_stack_print -- Print the state stack from its BOTTOM up to its |
723c19800e8SDoug Rabson | TOP (included).                                                   |
724c19800e8SDoug Rabson `------------------------------------------------------------------*/
725c19800e8SDoug Rabson 
726c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
727c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
728c19800e8SDoug Rabson static void
yy_stack_print(yytype_int16 * bottom,yytype_int16 * top)729c19800e8SDoug Rabson yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
730c19800e8SDoug Rabson #else
731c19800e8SDoug Rabson static void
732c19800e8SDoug Rabson yy_stack_print (bottom, top)
733c19800e8SDoug Rabson     yytype_int16 *bottom;
734c19800e8SDoug Rabson     yytype_int16 *top;
735c19800e8SDoug Rabson #endif
736c19800e8SDoug Rabson {
737c19800e8SDoug Rabson   YYFPRINTF (stderr, "Stack now");
738c19800e8SDoug Rabson   for (; bottom <= top; ++bottom)
739c19800e8SDoug Rabson     YYFPRINTF (stderr, " %d", *bottom);
740c19800e8SDoug Rabson   YYFPRINTF (stderr, "\n");
741c19800e8SDoug Rabson }
742c19800e8SDoug Rabson 
743c19800e8SDoug Rabson # define YY_STACK_PRINT(Bottom, Top)				\
744c19800e8SDoug Rabson do {								\
745c19800e8SDoug Rabson   if (yydebug)							\
746c19800e8SDoug Rabson     yy_stack_print ((Bottom), (Top));				\
747c19800e8SDoug Rabson } while (YYID (0))
748c19800e8SDoug Rabson 
749c19800e8SDoug Rabson 
750c19800e8SDoug Rabson /*------------------------------------------------.
751c19800e8SDoug Rabson | Report that the YYRULE is going to be reduced.  |
752c19800e8SDoug Rabson `------------------------------------------------*/
753c19800e8SDoug Rabson 
754c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
755c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
756c19800e8SDoug Rabson static void
yy_reduce_print(YYSTYPE * yyvsp,int yyrule)757c19800e8SDoug Rabson yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
758c19800e8SDoug Rabson #else
759c19800e8SDoug Rabson static void
760c19800e8SDoug Rabson yy_reduce_print (yyvsp, yyrule)
761c19800e8SDoug Rabson     YYSTYPE *yyvsp;
762c19800e8SDoug Rabson     int yyrule;
763c19800e8SDoug Rabson #endif
764c19800e8SDoug Rabson {
765c19800e8SDoug Rabson   int yynrhs = yyr2[yyrule];
766c19800e8SDoug Rabson   int yyi;
767c19800e8SDoug Rabson   unsigned long int yylno = yyrline[yyrule];
768c19800e8SDoug Rabson   YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
769c19800e8SDoug Rabson 	     yyrule - 1, yylno);
770c19800e8SDoug Rabson   /* The symbols being reduced.  */
771c19800e8SDoug Rabson   for (yyi = 0; yyi < yynrhs; yyi++)
772c19800e8SDoug Rabson     {
773c19800e8SDoug Rabson       fprintf (stderr, "   $%d = ", yyi + 1);
774c19800e8SDoug Rabson       yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
775c19800e8SDoug Rabson 		       &(yyvsp[(yyi + 1) - (yynrhs)])
776c19800e8SDoug Rabson 		       		       );
777c19800e8SDoug Rabson       fprintf (stderr, "\n");
778c19800e8SDoug Rabson     }
779c19800e8SDoug Rabson }
780c19800e8SDoug Rabson 
781c19800e8SDoug Rabson # define YY_REDUCE_PRINT(Rule)		\
782c19800e8SDoug Rabson do {					\
783c19800e8SDoug Rabson   if (yydebug)				\
784c19800e8SDoug Rabson     yy_reduce_print (yyvsp, Rule); \
785c19800e8SDoug Rabson } while (YYID (0))
786c19800e8SDoug Rabson 
787c19800e8SDoug Rabson /* Nonzero means print parse trace.  It is left uninitialized so that
788c19800e8SDoug Rabson    multiple parsers can coexist.  */
789c19800e8SDoug Rabson int yydebug;
790c19800e8SDoug Rabson #else /* !YYDEBUG */
791c19800e8SDoug Rabson # define YYDPRINTF(Args)
792c19800e8SDoug Rabson # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
793c19800e8SDoug Rabson # define YY_STACK_PRINT(Bottom, Top)
794c19800e8SDoug Rabson # define YY_REDUCE_PRINT(Rule)
795c19800e8SDoug Rabson #endif /* !YYDEBUG */
796c19800e8SDoug Rabson 
797c19800e8SDoug Rabson 
798c19800e8SDoug Rabson /* YYINITDEPTH -- initial size of the parser's stacks.  */
799c19800e8SDoug Rabson #ifndef	YYINITDEPTH
800c19800e8SDoug Rabson # define YYINITDEPTH 200
801c19800e8SDoug Rabson #endif
802c19800e8SDoug Rabson 
803c19800e8SDoug Rabson /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
804c19800e8SDoug Rabson    if the built-in stack extension method is used).
805c19800e8SDoug Rabson 
806c19800e8SDoug Rabson    Do not make this value too large; the results are undefined if
807c19800e8SDoug Rabson    YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
808c19800e8SDoug Rabson    evaluated with infinite-precision integer arithmetic.  */
809c19800e8SDoug Rabson 
810c19800e8SDoug Rabson #ifndef YYMAXDEPTH
811c19800e8SDoug Rabson # define YYMAXDEPTH 10000
812c19800e8SDoug Rabson #endif
813c19800e8SDoug Rabson 
814c19800e8SDoug Rabson 
815c19800e8SDoug Rabson 
816c19800e8SDoug Rabson #if YYERROR_VERBOSE
817c19800e8SDoug Rabson 
818c19800e8SDoug Rabson # ifndef yystrlen
819c19800e8SDoug Rabson #  if defined __GLIBC__ && defined _STRING_H
820c19800e8SDoug Rabson #   define yystrlen strlen
821c19800e8SDoug Rabson #  else
822c19800e8SDoug Rabson /* Return the length of YYSTR.  */
823c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
824c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
825c19800e8SDoug Rabson static YYSIZE_T
yystrlen(const char * yystr)826c19800e8SDoug Rabson yystrlen (const char *yystr)
827c19800e8SDoug Rabson #else
828c19800e8SDoug Rabson static YYSIZE_T
829c19800e8SDoug Rabson yystrlen (yystr)
830c19800e8SDoug Rabson     const char *yystr;
831c19800e8SDoug Rabson #endif
832c19800e8SDoug Rabson {
833c19800e8SDoug Rabson   YYSIZE_T yylen;
834c19800e8SDoug Rabson   for (yylen = 0; yystr[yylen]; yylen++)
835c19800e8SDoug Rabson     continue;
836c19800e8SDoug Rabson   return yylen;
837c19800e8SDoug Rabson }
838c19800e8SDoug Rabson #  endif
839c19800e8SDoug Rabson # endif
840c19800e8SDoug Rabson 
841c19800e8SDoug Rabson # ifndef yystpcpy
842c19800e8SDoug Rabson #  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
843c19800e8SDoug Rabson #   define yystpcpy stpcpy
844c19800e8SDoug Rabson #  else
845c19800e8SDoug Rabson /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
846c19800e8SDoug Rabson    YYDEST.  */
847c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
848c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
849c19800e8SDoug Rabson static char *
yystpcpy(char * yydest,const char * yysrc)850c19800e8SDoug Rabson yystpcpy (char *yydest, const char *yysrc)
851c19800e8SDoug Rabson #else
852c19800e8SDoug Rabson static char *
853c19800e8SDoug Rabson yystpcpy (yydest, yysrc)
854c19800e8SDoug Rabson     char *yydest;
855c19800e8SDoug Rabson     const char *yysrc;
856c19800e8SDoug Rabson #endif
857c19800e8SDoug Rabson {
858c19800e8SDoug Rabson   char *yyd = yydest;
859c19800e8SDoug Rabson   const char *yys = yysrc;
860c19800e8SDoug Rabson 
861c19800e8SDoug Rabson   while ((*yyd++ = *yys++) != '\0')
862c19800e8SDoug Rabson     continue;
863c19800e8SDoug Rabson 
864c19800e8SDoug Rabson   return yyd - 1;
865c19800e8SDoug Rabson }
866c19800e8SDoug Rabson #  endif
867c19800e8SDoug Rabson # endif
868c19800e8SDoug Rabson 
869c19800e8SDoug Rabson # ifndef yytnamerr
870c19800e8SDoug Rabson /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
871c19800e8SDoug Rabson    quotes and backslashes, so that it's suitable for yyerror.  The
872c19800e8SDoug Rabson    heuristic is that double-quoting is unnecessary unless the string
873c19800e8SDoug Rabson    contains an apostrophe, a comma, or backslash (other than
874c19800e8SDoug Rabson    backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
875c19800e8SDoug Rabson    null, do not copy; instead, return the length of what the result
876c19800e8SDoug Rabson    would have been.  */
877c19800e8SDoug Rabson static YYSIZE_T
yytnamerr(char * yyres,const char * yystr)878c19800e8SDoug Rabson yytnamerr (char *yyres, const char *yystr)
879c19800e8SDoug Rabson {
880c19800e8SDoug Rabson   if (*yystr == '"')
881c19800e8SDoug Rabson     {
882c19800e8SDoug Rabson       YYSIZE_T yyn = 0;
883c19800e8SDoug Rabson       char const *yyp = yystr;
884c19800e8SDoug Rabson 
885c19800e8SDoug Rabson       for (;;)
886c19800e8SDoug Rabson 	switch (*++yyp)
887c19800e8SDoug Rabson 	  {
888c19800e8SDoug Rabson 	  case '\'':
889c19800e8SDoug Rabson 	  case ',':
890c19800e8SDoug Rabson 	    goto do_not_strip_quotes;
891c19800e8SDoug Rabson 
892c19800e8SDoug Rabson 	  case '\\':
893c19800e8SDoug Rabson 	    if (*++yyp != '\\')
894c19800e8SDoug Rabson 	      goto do_not_strip_quotes;
895c19800e8SDoug Rabson 	    /* Fall through.  */
896c19800e8SDoug Rabson 	  default:
897c19800e8SDoug Rabson 	    if (yyres)
898c19800e8SDoug Rabson 	      yyres[yyn] = *yyp;
899c19800e8SDoug Rabson 	    yyn++;
900c19800e8SDoug Rabson 	    break;
901c19800e8SDoug Rabson 
902c19800e8SDoug Rabson 	  case '"':
903c19800e8SDoug Rabson 	    if (yyres)
904c19800e8SDoug Rabson 	      yyres[yyn] = '\0';
905c19800e8SDoug Rabson 	    return yyn;
906c19800e8SDoug Rabson 	  }
907c19800e8SDoug Rabson     do_not_strip_quotes: ;
908c19800e8SDoug Rabson     }
909c19800e8SDoug Rabson 
910c19800e8SDoug Rabson   if (! yyres)
911c19800e8SDoug Rabson     return yystrlen (yystr);
912c19800e8SDoug Rabson 
913c19800e8SDoug Rabson   return yystpcpy (yyres, yystr) - yyres;
914c19800e8SDoug Rabson }
915c19800e8SDoug Rabson # endif
916c19800e8SDoug Rabson 
917c19800e8SDoug Rabson /* Copy into YYRESULT an error message about the unexpected token
918c19800e8SDoug Rabson    YYCHAR while in state YYSTATE.  Return the number of bytes copied,
919c19800e8SDoug Rabson    including the terminating null byte.  If YYRESULT is null, do not
920c19800e8SDoug Rabson    copy anything; just return the number of bytes that would be
921c19800e8SDoug Rabson    copied.  As a special case, return 0 if an ordinary "syntax error"
922c19800e8SDoug Rabson    message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
923c19800e8SDoug Rabson    size calculation.  */
924c19800e8SDoug Rabson static YYSIZE_T
yysyntax_error(char * yyresult,int yystate,int yychar)925c19800e8SDoug Rabson yysyntax_error (char *yyresult, int yystate, int yychar)
926c19800e8SDoug Rabson {
927c19800e8SDoug Rabson   int yyn = yypact[yystate];
928c19800e8SDoug Rabson 
929c19800e8SDoug Rabson   if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
930c19800e8SDoug Rabson     return 0;
931c19800e8SDoug Rabson   else
932c19800e8SDoug Rabson     {
933c19800e8SDoug Rabson       int yytype = YYTRANSLATE (yychar);
934c19800e8SDoug Rabson       YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
935c19800e8SDoug Rabson       YYSIZE_T yysize = yysize0;
936c19800e8SDoug Rabson       YYSIZE_T yysize1;
937c19800e8SDoug Rabson       int yysize_overflow = 0;
938c19800e8SDoug Rabson       enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
939c19800e8SDoug Rabson       char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
940c19800e8SDoug Rabson       int yyx;
941c19800e8SDoug Rabson 
942c19800e8SDoug Rabson # if 0
943c19800e8SDoug Rabson       /* This is so xgettext sees the translatable formats that are
944c19800e8SDoug Rabson 	 constructed on the fly.  */
945c19800e8SDoug Rabson       YY_("syntax error, unexpected %s");
946c19800e8SDoug Rabson       YY_("syntax error, unexpected %s, expecting %s");
947c19800e8SDoug Rabson       YY_("syntax error, unexpected %s, expecting %s or %s");
948c19800e8SDoug Rabson       YY_("syntax error, unexpected %s, expecting %s or %s or %s");
949c19800e8SDoug Rabson       YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
950c19800e8SDoug Rabson # endif
951c19800e8SDoug Rabson       char *yyfmt;
952c19800e8SDoug Rabson       char const *yyf;
953c19800e8SDoug Rabson       static char const yyunexpected[] = "syntax error, unexpected %s";
954c19800e8SDoug Rabson       static char const yyexpecting[] = ", expecting %s";
955c19800e8SDoug Rabson       static char const yyor[] = " or %s";
956c19800e8SDoug Rabson       char yyformat[sizeof yyunexpected
957c19800e8SDoug Rabson 		    + sizeof yyexpecting - 1
958c19800e8SDoug Rabson 		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
959c19800e8SDoug Rabson 		       * (sizeof yyor - 1))];
960c19800e8SDoug Rabson       char const *yyprefix = yyexpecting;
961c19800e8SDoug Rabson 
962c19800e8SDoug Rabson       /* Start YYX at -YYN if negative to avoid negative indexes in
963c19800e8SDoug Rabson 	 YYCHECK.  */
964c19800e8SDoug Rabson       int yyxbegin = yyn < 0 ? -yyn : 0;
965c19800e8SDoug Rabson 
966c19800e8SDoug Rabson       /* Stay within bounds of both yycheck and yytname.  */
967c19800e8SDoug Rabson       int yychecklim = YYLAST - yyn + 1;
968c19800e8SDoug Rabson       int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
969c19800e8SDoug Rabson       int yycount = 1;
970c19800e8SDoug Rabson 
971c19800e8SDoug Rabson       yyarg[0] = yytname[yytype];
972c19800e8SDoug Rabson       yyfmt = yystpcpy (yyformat, yyunexpected);
973c19800e8SDoug Rabson 
974c19800e8SDoug Rabson       for (yyx = yyxbegin; yyx < yyxend; ++yyx)
975c19800e8SDoug Rabson 	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
976c19800e8SDoug Rabson 	  {
977c19800e8SDoug Rabson 	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
978c19800e8SDoug Rabson 	      {
979c19800e8SDoug Rabson 		yycount = 1;
980c19800e8SDoug Rabson 		yysize = yysize0;
981c19800e8SDoug Rabson 		yyformat[sizeof yyunexpected - 1] = '\0';
982c19800e8SDoug Rabson 		break;
983c19800e8SDoug Rabson 	      }
984c19800e8SDoug Rabson 	    yyarg[yycount++] = yytname[yyx];
985c19800e8SDoug Rabson 	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
986c19800e8SDoug Rabson 	    yysize_overflow |= (yysize1 < yysize);
987c19800e8SDoug Rabson 	    yysize = yysize1;
988c19800e8SDoug Rabson 	    yyfmt = yystpcpy (yyfmt, yyprefix);
989c19800e8SDoug Rabson 	    yyprefix = yyor;
990c19800e8SDoug Rabson 	  }
991c19800e8SDoug Rabson 
992c19800e8SDoug Rabson       yyf = YY_(yyformat);
993c19800e8SDoug Rabson       yysize1 = yysize + yystrlen (yyf);
994c19800e8SDoug Rabson       yysize_overflow |= (yysize1 < yysize);
995c19800e8SDoug Rabson       yysize = yysize1;
996c19800e8SDoug Rabson 
997c19800e8SDoug Rabson       if (yysize_overflow)
998c19800e8SDoug Rabson 	return YYSIZE_MAXIMUM;
999c19800e8SDoug Rabson 
1000c19800e8SDoug Rabson       if (yyresult)
1001c19800e8SDoug Rabson 	{
1002c19800e8SDoug Rabson 	  /* Avoid sprintf, as that infringes on the user's name space.
1003c19800e8SDoug Rabson 	     Don't have undefined behavior even if the translation
1004c19800e8SDoug Rabson 	     produced a string with the wrong number of "%s"s.  */
1005c19800e8SDoug Rabson 	  char *yyp = yyresult;
1006c19800e8SDoug Rabson 	  int yyi = 0;
1007c19800e8SDoug Rabson 	  while ((*yyp = *yyf) != '\0')
1008c19800e8SDoug Rabson 	    {
1009c19800e8SDoug Rabson 	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
1010c19800e8SDoug Rabson 		{
1011c19800e8SDoug Rabson 		  yyp += yytnamerr (yyp, yyarg[yyi++]);
1012c19800e8SDoug Rabson 		  yyf += 2;
1013c19800e8SDoug Rabson 		}
1014c19800e8SDoug Rabson 	      else
1015c19800e8SDoug Rabson 		{
1016c19800e8SDoug Rabson 		  yyp++;
1017c19800e8SDoug Rabson 		  yyf++;
1018c19800e8SDoug Rabson 		}
1019c19800e8SDoug Rabson 	    }
1020c19800e8SDoug Rabson 	}
1021c19800e8SDoug Rabson       return yysize;
1022c19800e8SDoug Rabson     }
1023c19800e8SDoug Rabson }
1024c19800e8SDoug Rabson #endif /* YYERROR_VERBOSE */
1025c19800e8SDoug Rabson 
1026c19800e8SDoug Rabson 
1027c19800e8SDoug Rabson /*-----------------------------------------------.
1028c19800e8SDoug Rabson | Release the memory associated to this symbol.  |
1029c19800e8SDoug Rabson `-----------------------------------------------*/
1030c19800e8SDoug Rabson 
1031c19800e8SDoug Rabson /*ARGSUSED*/
1032c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1033c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
1034c19800e8SDoug Rabson static void
yydestruct(const char * yymsg,int yytype,YYSTYPE * yyvaluep)1035c19800e8SDoug Rabson yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
1036c19800e8SDoug Rabson #else
1037c19800e8SDoug Rabson static void
1038c19800e8SDoug Rabson yydestruct (yymsg, yytype, yyvaluep)
1039c19800e8SDoug Rabson     const char *yymsg;
1040c19800e8SDoug Rabson     int yytype;
1041c19800e8SDoug Rabson     YYSTYPE *yyvaluep;
1042c19800e8SDoug Rabson #endif
1043c19800e8SDoug Rabson {
1044c19800e8SDoug Rabson   YYUSE (yyvaluep);
1045c19800e8SDoug Rabson 
1046c19800e8SDoug Rabson   if (!yymsg)
1047c19800e8SDoug Rabson     yymsg = "Deleting";
1048c19800e8SDoug Rabson   YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1049c19800e8SDoug Rabson 
1050c19800e8SDoug Rabson   switch (yytype)
1051c19800e8SDoug Rabson     {
1052c19800e8SDoug Rabson 
1053c19800e8SDoug Rabson       default:
1054c19800e8SDoug Rabson 	break;
1055c19800e8SDoug Rabson     }
1056c19800e8SDoug Rabson }
1057c19800e8SDoug Rabson 
1058c19800e8SDoug Rabson 
1059c19800e8SDoug Rabson /* Prevent warnings from -Wmissing-prototypes.  */
1060c19800e8SDoug Rabson 
1061c19800e8SDoug Rabson #ifdef YYPARSE_PARAM
1062c19800e8SDoug Rabson #if defined __STDC__ || defined __cplusplus
1063c19800e8SDoug Rabson int yyparse (void *YYPARSE_PARAM);
1064c19800e8SDoug Rabson #else
1065c19800e8SDoug Rabson int yyparse ();
1066c19800e8SDoug Rabson #endif
1067c19800e8SDoug Rabson #else /* ! YYPARSE_PARAM */
1068c19800e8SDoug Rabson #if defined __STDC__ || defined __cplusplus
1069c19800e8SDoug Rabson int yyparse (void);
1070c19800e8SDoug Rabson #else
1071c19800e8SDoug Rabson int yyparse ();
1072c19800e8SDoug Rabson #endif
1073c19800e8SDoug Rabson #endif /* ! YYPARSE_PARAM */
1074c19800e8SDoug Rabson 
1075c19800e8SDoug Rabson 
1076c19800e8SDoug Rabson 
1077c19800e8SDoug Rabson /* The look-ahead symbol.  */
1078c19800e8SDoug Rabson int yychar;
1079c19800e8SDoug Rabson 
1080c19800e8SDoug Rabson /* The semantic value of the look-ahead symbol.  */
1081c19800e8SDoug Rabson YYSTYPE yylval;
1082c19800e8SDoug Rabson 
1083c19800e8SDoug Rabson /* Number of syntax errors so far.  */
1084c19800e8SDoug Rabson int yynerrs;
1085c19800e8SDoug Rabson 
1086c19800e8SDoug Rabson 
1087c19800e8SDoug Rabson 
1088c19800e8SDoug Rabson /*----------.
1089c19800e8SDoug Rabson | yyparse.  |
1090c19800e8SDoug Rabson `----------*/
1091c19800e8SDoug Rabson 
1092c19800e8SDoug Rabson #ifdef YYPARSE_PARAM
1093c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1094c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
1095c19800e8SDoug Rabson int
yyparse(void * YYPARSE_PARAM)1096c19800e8SDoug Rabson yyparse (void *YYPARSE_PARAM)
1097c19800e8SDoug Rabson #else
1098c19800e8SDoug Rabson int
1099c19800e8SDoug Rabson yyparse (YYPARSE_PARAM)
1100c19800e8SDoug Rabson     void *YYPARSE_PARAM;
1101c19800e8SDoug Rabson #endif
1102c19800e8SDoug Rabson #else /* ! YYPARSE_PARAM */
1103c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1104c19800e8SDoug Rabson      || defined __cplusplus || defined _MSC_VER)
1105c19800e8SDoug Rabson int
1106c19800e8SDoug Rabson yyparse (void)
1107c19800e8SDoug Rabson #else
1108c19800e8SDoug Rabson int
1109c19800e8SDoug Rabson yyparse ()
1110c19800e8SDoug Rabson 
1111c19800e8SDoug Rabson #endif
1112c19800e8SDoug Rabson #endif
1113c19800e8SDoug Rabson {
1114c19800e8SDoug Rabson 
1115c19800e8SDoug Rabson   int yystate;
1116c19800e8SDoug Rabson   int yyn;
1117c19800e8SDoug Rabson   int yyresult;
1118c19800e8SDoug Rabson   /* Number of tokens to shift before error messages enabled.  */
1119c19800e8SDoug Rabson   int yyerrstatus;
1120c19800e8SDoug Rabson   /* Look-ahead token as an internal (translated) token number.  */
1121c19800e8SDoug Rabson   int yytoken = 0;
1122c19800e8SDoug Rabson #if YYERROR_VERBOSE
1123c19800e8SDoug Rabson   /* Buffer for error messages, and its allocated size.  */
1124c19800e8SDoug Rabson   char yymsgbuf[128];
1125c19800e8SDoug Rabson   char *yymsg = yymsgbuf;
1126c19800e8SDoug Rabson   YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1127c19800e8SDoug Rabson #endif
1128c19800e8SDoug Rabson 
1129c19800e8SDoug Rabson   /* Three stacks and their tools:
1130c19800e8SDoug Rabson      `yyss': related to states,
1131c19800e8SDoug Rabson      `yyvs': related to semantic values,
1132c19800e8SDoug Rabson      `yyls': related to locations.
1133c19800e8SDoug Rabson 
1134c19800e8SDoug Rabson      Refer to the stacks thru separate pointers, to allow yyoverflow
1135c19800e8SDoug Rabson      to reallocate them elsewhere.  */
1136c19800e8SDoug Rabson 
1137c19800e8SDoug Rabson   /* The state stack.  */
1138c19800e8SDoug Rabson   yytype_int16 yyssa[YYINITDEPTH];
1139c19800e8SDoug Rabson   yytype_int16 *yyss = yyssa;
1140c19800e8SDoug Rabson   yytype_int16 *yyssp;
1141c19800e8SDoug Rabson 
1142c19800e8SDoug Rabson   /* The semantic value stack.  */
1143c19800e8SDoug Rabson   YYSTYPE yyvsa[YYINITDEPTH];
1144c19800e8SDoug Rabson   YYSTYPE *yyvs = yyvsa;
1145c19800e8SDoug Rabson   YYSTYPE *yyvsp;
1146c19800e8SDoug Rabson 
1147c19800e8SDoug Rabson 
1148c19800e8SDoug Rabson 
1149c19800e8SDoug Rabson #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
1150c19800e8SDoug Rabson 
1151c19800e8SDoug Rabson   YYSIZE_T yystacksize = YYINITDEPTH;
1152c19800e8SDoug Rabson 
1153c19800e8SDoug Rabson   /* The variables used to return semantic value and location from the
1154c19800e8SDoug Rabson      action routines.  */
1155c19800e8SDoug Rabson   YYSTYPE yyval;
1156c19800e8SDoug Rabson 
1157c19800e8SDoug Rabson 
1158c19800e8SDoug Rabson   /* The number of symbols on the RHS of the reduced rule.
1159c19800e8SDoug Rabson      Keep to zero when no symbol should be popped.  */
1160c19800e8SDoug Rabson   int yylen = 0;
1161c19800e8SDoug Rabson 
1162c19800e8SDoug Rabson   YYDPRINTF ((stderr, "Starting parse\n"));
1163c19800e8SDoug Rabson 
1164c19800e8SDoug Rabson   yystate = 0;
1165c19800e8SDoug Rabson   yyerrstatus = 0;
1166c19800e8SDoug Rabson   yynerrs = 0;
1167c19800e8SDoug Rabson   yychar = YYEMPTY;		/* Cause a token to be read.  */
1168c19800e8SDoug Rabson 
1169c19800e8SDoug Rabson   /* Initialize stack pointers.
1170c19800e8SDoug Rabson      Waste one element of value and location stack
1171c19800e8SDoug Rabson      so that they stay on the same level as the state stack.
1172c19800e8SDoug Rabson      The wasted elements are never initialized.  */
1173c19800e8SDoug Rabson 
1174c19800e8SDoug Rabson   yyssp = yyss;
1175c19800e8SDoug Rabson   yyvsp = yyvs;
1176c19800e8SDoug Rabson 
1177c19800e8SDoug Rabson   goto yysetstate;
1178c19800e8SDoug Rabson 
1179c19800e8SDoug Rabson /*------------------------------------------------------------.
1180c19800e8SDoug Rabson | yynewstate -- Push a new state, which is found in yystate.  |
1181c19800e8SDoug Rabson `------------------------------------------------------------*/
1182c19800e8SDoug Rabson  yynewstate:
1183c19800e8SDoug Rabson   /* In all cases, when you get here, the value and location stacks
1184c19800e8SDoug Rabson      have just been pushed.  So pushing a state here evens the stacks.  */
1185c19800e8SDoug Rabson   yyssp++;
1186c19800e8SDoug Rabson 
1187c19800e8SDoug Rabson  yysetstate:
1188c19800e8SDoug Rabson   *yyssp = yystate;
1189c19800e8SDoug Rabson 
1190c19800e8SDoug Rabson   if (yyss + yystacksize - 1 <= yyssp)
1191c19800e8SDoug Rabson     {
1192c19800e8SDoug Rabson       /* Get the current used size of the three stacks, in elements.  */
1193c19800e8SDoug Rabson       YYSIZE_T yysize = yyssp - yyss + 1;
1194c19800e8SDoug Rabson 
1195c19800e8SDoug Rabson #ifdef yyoverflow
1196c19800e8SDoug Rabson       {
1197c19800e8SDoug Rabson 	/* Give user a chance to reallocate the stack.  Use copies of
1198c19800e8SDoug Rabson 	   these so that the &'s don't force the real ones into
1199c19800e8SDoug Rabson 	   memory.  */
1200c19800e8SDoug Rabson 	YYSTYPE *yyvs1 = yyvs;
1201c19800e8SDoug Rabson 	yytype_int16 *yyss1 = yyss;
1202c19800e8SDoug Rabson 
1203c19800e8SDoug Rabson 
1204c19800e8SDoug Rabson 	/* Each stack pointer address is followed by the size of the
1205c19800e8SDoug Rabson 	   data in use in that stack, in bytes.  This used to be a
1206c19800e8SDoug Rabson 	   conditional around just the two extra args, but that might
1207c19800e8SDoug Rabson 	   be undefined if yyoverflow is a macro.  */
1208c19800e8SDoug Rabson 	yyoverflow (YY_("memory exhausted"),
1209c19800e8SDoug Rabson 		    &yyss1, yysize * sizeof (*yyssp),
1210c19800e8SDoug Rabson 		    &yyvs1, yysize * sizeof (*yyvsp),
1211c19800e8SDoug Rabson 
1212c19800e8SDoug Rabson 		    &yystacksize);
1213c19800e8SDoug Rabson 
1214c19800e8SDoug Rabson 	yyss = yyss1;
1215c19800e8SDoug Rabson 	yyvs = yyvs1;
1216c19800e8SDoug Rabson       }
1217c19800e8SDoug Rabson #else /* no yyoverflow */
1218c19800e8SDoug Rabson # ifndef YYSTACK_RELOCATE
1219c19800e8SDoug Rabson       goto yyexhaustedlab;
1220c19800e8SDoug Rabson # else
1221c19800e8SDoug Rabson       /* Extend the stack our own way.  */
1222c19800e8SDoug Rabson       if (YYMAXDEPTH <= yystacksize)
1223c19800e8SDoug Rabson 	goto yyexhaustedlab;
1224c19800e8SDoug Rabson       yystacksize *= 2;
1225c19800e8SDoug Rabson       if (YYMAXDEPTH < yystacksize)
1226c19800e8SDoug Rabson 	yystacksize = YYMAXDEPTH;
1227c19800e8SDoug Rabson 
1228c19800e8SDoug Rabson       {
1229c19800e8SDoug Rabson 	yytype_int16 *yyss1 = yyss;
1230c19800e8SDoug Rabson 	union yyalloc *yyptr =
1231c19800e8SDoug Rabson 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1232c19800e8SDoug Rabson 	if (! yyptr)
1233c19800e8SDoug Rabson 	  goto yyexhaustedlab;
1234c19800e8SDoug Rabson 	YYSTACK_RELOCATE (yyss);
1235c19800e8SDoug Rabson 	YYSTACK_RELOCATE (yyvs);
1236c19800e8SDoug Rabson 
1237c19800e8SDoug Rabson #  undef YYSTACK_RELOCATE
1238c19800e8SDoug Rabson 	if (yyss1 != yyssa)
1239c19800e8SDoug Rabson 	  YYSTACK_FREE (yyss1);
1240c19800e8SDoug Rabson       }
1241c19800e8SDoug Rabson # endif
1242c19800e8SDoug Rabson #endif /* no yyoverflow */
1243c19800e8SDoug Rabson 
1244c19800e8SDoug Rabson       yyssp = yyss + yysize - 1;
1245c19800e8SDoug Rabson       yyvsp = yyvs + yysize - 1;
1246c19800e8SDoug Rabson 
1247c19800e8SDoug Rabson 
1248c19800e8SDoug Rabson       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1249c19800e8SDoug Rabson 		  (unsigned long int) yystacksize));
1250c19800e8SDoug Rabson 
1251c19800e8SDoug Rabson       if (yyss + yystacksize - 1 <= yyssp)
1252c19800e8SDoug Rabson 	YYABORT;
1253c19800e8SDoug Rabson     }
1254c19800e8SDoug Rabson 
1255c19800e8SDoug Rabson   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1256c19800e8SDoug Rabson 
1257c19800e8SDoug Rabson   goto yybackup;
1258c19800e8SDoug Rabson 
1259c19800e8SDoug Rabson /*-----------.
1260c19800e8SDoug Rabson | yybackup.  |
1261c19800e8SDoug Rabson `-----------*/
1262c19800e8SDoug Rabson yybackup:
1263c19800e8SDoug Rabson 
1264c19800e8SDoug Rabson   /* Do appropriate processing given the current state.  Read a
1265c19800e8SDoug Rabson      look-ahead token if we need one and don't already have one.  */
1266c19800e8SDoug Rabson 
1267c19800e8SDoug Rabson   /* First try to decide what to do without reference to look-ahead token.  */
1268c19800e8SDoug Rabson   yyn = yypact[yystate];
1269c19800e8SDoug Rabson   if (yyn == YYPACT_NINF)
1270c19800e8SDoug Rabson     goto yydefault;
1271c19800e8SDoug Rabson 
1272c19800e8SDoug Rabson   /* Not known => get a look-ahead token if don't already have one.  */
1273c19800e8SDoug Rabson 
1274c19800e8SDoug Rabson   /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
1275c19800e8SDoug Rabson   if (yychar == YYEMPTY)
1276c19800e8SDoug Rabson     {
1277c19800e8SDoug Rabson       YYDPRINTF ((stderr, "Reading a token: "));
1278c19800e8SDoug Rabson       yychar = YYLEX;
1279c19800e8SDoug Rabson     }
1280c19800e8SDoug Rabson 
1281c19800e8SDoug Rabson   if (yychar <= YYEOF)
1282c19800e8SDoug Rabson     {
1283c19800e8SDoug Rabson       yychar = yytoken = YYEOF;
1284c19800e8SDoug Rabson       YYDPRINTF ((stderr, "Now at end of input.\n"));
1285c19800e8SDoug Rabson     }
1286c19800e8SDoug Rabson   else
1287c19800e8SDoug Rabson     {
1288c19800e8SDoug Rabson       yytoken = YYTRANSLATE (yychar);
1289c19800e8SDoug Rabson       YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1290c19800e8SDoug Rabson     }
1291c19800e8SDoug Rabson 
1292c19800e8SDoug Rabson   /* If the proper action on seeing token YYTOKEN is to reduce or to
1293c19800e8SDoug Rabson      detect an error, take that action.  */
1294c19800e8SDoug Rabson   yyn += yytoken;
1295c19800e8SDoug Rabson   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1296c19800e8SDoug Rabson     goto yydefault;
1297c19800e8SDoug Rabson   yyn = yytable[yyn];
1298c19800e8SDoug Rabson   if (yyn <= 0)
1299c19800e8SDoug Rabson     {
1300c19800e8SDoug Rabson       if (yyn == 0 || yyn == YYTABLE_NINF)
1301c19800e8SDoug Rabson 	goto yyerrlab;
1302c19800e8SDoug Rabson       yyn = -yyn;
1303c19800e8SDoug Rabson       goto yyreduce;
1304c19800e8SDoug Rabson     }
1305c19800e8SDoug Rabson 
1306c19800e8SDoug Rabson   if (yyn == YYFINAL)
1307c19800e8SDoug Rabson     YYACCEPT;
1308c19800e8SDoug Rabson 
1309c19800e8SDoug Rabson   /* Count tokens shifted since error; after three, turn off error
1310c19800e8SDoug Rabson      status.  */
1311c19800e8SDoug Rabson   if (yyerrstatus)
1312c19800e8SDoug Rabson     yyerrstatus--;
1313c19800e8SDoug Rabson 
1314c19800e8SDoug Rabson   /* Shift the look-ahead token.  */
1315c19800e8SDoug Rabson   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1316c19800e8SDoug Rabson 
1317c19800e8SDoug Rabson   /* Discard the shifted token unless it is eof.  */
1318c19800e8SDoug Rabson   if (yychar != YYEOF)
1319c19800e8SDoug Rabson     yychar = YYEMPTY;
1320c19800e8SDoug Rabson 
1321c19800e8SDoug Rabson   yystate = yyn;
1322c19800e8SDoug Rabson   *++yyvsp = yylval;
1323c19800e8SDoug Rabson 
1324c19800e8SDoug Rabson   goto yynewstate;
1325c19800e8SDoug Rabson 
1326c19800e8SDoug Rabson 
1327c19800e8SDoug Rabson /*-----------------------------------------------------------.
1328c19800e8SDoug Rabson | yydefault -- do the default action for the current state.  |
1329c19800e8SDoug Rabson `-----------------------------------------------------------*/
1330c19800e8SDoug Rabson yydefault:
1331c19800e8SDoug Rabson   yyn = yydefact[yystate];
1332c19800e8SDoug Rabson   if (yyn == 0)
1333c19800e8SDoug Rabson     goto yyerrlab;
1334c19800e8SDoug Rabson   goto yyreduce;
1335c19800e8SDoug Rabson 
1336c19800e8SDoug Rabson 
1337c19800e8SDoug Rabson /*-----------------------------.
1338c19800e8SDoug Rabson | yyreduce -- Do a reduction.  |
1339c19800e8SDoug Rabson `-----------------------------*/
1340c19800e8SDoug Rabson yyreduce:
1341c19800e8SDoug Rabson   /* yyn is the number of a rule to reduce with.  */
1342c19800e8SDoug Rabson   yylen = yyr2[yyn];
1343c19800e8SDoug Rabson 
1344c19800e8SDoug Rabson   /* If YYLEN is nonzero, implement the default value of the action:
1345c19800e8SDoug Rabson      `$$ = $1'.
1346c19800e8SDoug Rabson 
1347c19800e8SDoug Rabson      Otherwise, the following line sets YYVAL to garbage.
1348c19800e8SDoug Rabson      This behavior is undocumented and Bison
1349c19800e8SDoug Rabson      users should not rely upon it.  Assigning to YYVAL
1350c19800e8SDoug Rabson      unconditionally makes the parser a bit smaller, and it avoids a
1351c19800e8SDoug Rabson      GCC warning that YYVAL may be used uninitialized.  */
1352c19800e8SDoug Rabson   yyval = yyvsp[1-yylen];
1353c19800e8SDoug Rabson 
1354c19800e8SDoug Rabson 
1355c19800e8SDoug Rabson   YY_REDUCE_PRINT (yyn);
1356c19800e8SDoug Rabson   switch (yyn)
1357c19800e8SDoug Rabson     {
1358c19800e8SDoug Rabson         case 2:
1359*ae771770SStanislav Sedov #line 71 "slc-gram.y"
1360c19800e8SDoug Rabson     {
1361c19800e8SDoug Rabson 			assignment = (yyvsp[(1) - (1)].assignment);
1362c19800e8SDoug Rabson 		}
1363c19800e8SDoug Rabson     break;
1364c19800e8SDoug Rabson 
1365c19800e8SDoug Rabson   case 3:
1366*ae771770SStanislav Sedov #line 77 "slc-gram.y"
1367c19800e8SDoug Rabson     {
1368c19800e8SDoug Rabson 			(yyvsp[(1) - (2)].assignment)->next = (yyvsp[(2) - (2)].assignment);
1369c19800e8SDoug Rabson 			(yyval.assignment) = (yyvsp[(1) - (2)].assignment);
1370c19800e8SDoug Rabson 		}
1371c19800e8SDoug Rabson     break;
1372c19800e8SDoug Rabson 
1373c19800e8SDoug Rabson   case 5:
1374*ae771770SStanislav Sedov #line 85 "slc-gram.y"
1375c19800e8SDoug Rabson     {
1376c19800e8SDoug Rabson 			(yyval.assignment) = malloc(sizeof(*(yyval.assignment)));
1377c19800e8SDoug Rabson 			(yyval.assignment)->name = (yyvsp[(1) - (3)].string);
1378c19800e8SDoug Rabson 			(yyval.assignment)->type = a_value;
1379c19800e8SDoug Rabson 			(yyval.assignment)->lineno = lineno;
1380c19800e8SDoug Rabson 			(yyval.assignment)->u.value = (yyvsp[(3) - (3)].string);
1381c19800e8SDoug Rabson 			(yyval.assignment)->next = NULL;
1382c19800e8SDoug Rabson 		}
1383c19800e8SDoug Rabson     break;
1384c19800e8SDoug Rabson 
1385c19800e8SDoug Rabson   case 6:
1386*ae771770SStanislav Sedov #line 94 "slc-gram.y"
1387c19800e8SDoug Rabson     {
1388c19800e8SDoug Rabson 			(yyval.assignment) = malloc(sizeof(*(yyval.assignment)));
1389c19800e8SDoug Rabson 			(yyval.assignment)->name = (yyvsp[(1) - (5)].string);
1390c19800e8SDoug Rabson 			(yyval.assignment)->type = a_assignment;
1391c19800e8SDoug Rabson 			(yyval.assignment)->lineno = lineno;
1392c19800e8SDoug Rabson 			(yyval.assignment)->u.assignment = (yyvsp[(4) - (5)].assignment);
1393c19800e8SDoug Rabson 			(yyval.assignment)->next = NULL;
1394c19800e8SDoug Rabson 		}
1395c19800e8SDoug Rabson     break;
1396c19800e8SDoug Rabson 
1397c19800e8SDoug Rabson 
1398c19800e8SDoug Rabson /* Line 1267 of yacc.c.  */
1399*ae771770SStanislav Sedov #line 1400 "slc-gram.c"
1400c19800e8SDoug Rabson       default: break;
1401c19800e8SDoug Rabson     }
1402c19800e8SDoug Rabson   YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
1403c19800e8SDoug Rabson 
1404c19800e8SDoug Rabson   YYPOPSTACK (yylen);
1405c19800e8SDoug Rabson   yylen = 0;
1406c19800e8SDoug Rabson   YY_STACK_PRINT (yyss, yyssp);
1407c19800e8SDoug Rabson 
1408c19800e8SDoug Rabson   *++yyvsp = yyval;
1409c19800e8SDoug Rabson 
1410c19800e8SDoug Rabson 
1411c19800e8SDoug Rabson   /* Now `shift' the result of the reduction.  Determine what state
1412c19800e8SDoug Rabson      that goes to, based on the state we popped back to and the rule
1413c19800e8SDoug Rabson      number reduced by.  */
1414c19800e8SDoug Rabson 
1415c19800e8SDoug Rabson   yyn = yyr1[yyn];
1416c19800e8SDoug Rabson 
1417c19800e8SDoug Rabson   yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
1418c19800e8SDoug Rabson   if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
1419c19800e8SDoug Rabson     yystate = yytable[yystate];
1420c19800e8SDoug Rabson   else
1421c19800e8SDoug Rabson     yystate = yydefgoto[yyn - YYNTOKENS];
1422c19800e8SDoug Rabson 
1423c19800e8SDoug Rabson   goto yynewstate;
1424c19800e8SDoug Rabson 
1425c19800e8SDoug Rabson 
1426c19800e8SDoug Rabson /*------------------------------------.
1427c19800e8SDoug Rabson | yyerrlab -- here on detecting error |
1428c19800e8SDoug Rabson `------------------------------------*/
1429c19800e8SDoug Rabson yyerrlab:
1430c19800e8SDoug Rabson   /* If not already recovering from an error, report this error.  */
1431c19800e8SDoug Rabson   if (!yyerrstatus)
1432c19800e8SDoug Rabson     {
1433c19800e8SDoug Rabson       ++yynerrs;
1434c19800e8SDoug Rabson #if ! YYERROR_VERBOSE
1435c19800e8SDoug Rabson       yyerror (YY_("syntax error"));
1436c19800e8SDoug Rabson #else
1437c19800e8SDoug Rabson       {
1438c19800e8SDoug Rabson 	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
1439c19800e8SDoug Rabson 	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
1440c19800e8SDoug Rabson 	  {
1441c19800e8SDoug Rabson 	    YYSIZE_T yyalloc = 2 * yysize;
1442c19800e8SDoug Rabson 	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
1443c19800e8SDoug Rabson 	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
1444c19800e8SDoug Rabson 	    if (yymsg != yymsgbuf)
1445c19800e8SDoug Rabson 	      YYSTACK_FREE (yymsg);
1446c19800e8SDoug Rabson 	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
1447c19800e8SDoug Rabson 	    if (yymsg)
1448c19800e8SDoug Rabson 	      yymsg_alloc = yyalloc;
1449c19800e8SDoug Rabson 	    else
1450c19800e8SDoug Rabson 	      {
1451c19800e8SDoug Rabson 		yymsg = yymsgbuf;
1452c19800e8SDoug Rabson 		yymsg_alloc = sizeof yymsgbuf;
1453c19800e8SDoug Rabson 	      }
1454c19800e8SDoug Rabson 	  }
1455c19800e8SDoug Rabson 
1456c19800e8SDoug Rabson 	if (0 < yysize && yysize <= yymsg_alloc)
1457c19800e8SDoug Rabson 	  {
1458c19800e8SDoug Rabson 	    (void) yysyntax_error (yymsg, yystate, yychar);
1459c19800e8SDoug Rabson 	    yyerror (yymsg);
1460c19800e8SDoug Rabson 	  }
1461c19800e8SDoug Rabson 	else
1462c19800e8SDoug Rabson 	  {
1463c19800e8SDoug Rabson 	    yyerror (YY_("syntax error"));
1464c19800e8SDoug Rabson 	    if (yysize != 0)
1465c19800e8SDoug Rabson 	      goto yyexhaustedlab;
1466c19800e8SDoug Rabson 	  }
1467c19800e8SDoug Rabson       }
1468c19800e8SDoug Rabson #endif
1469c19800e8SDoug Rabson     }
1470c19800e8SDoug Rabson 
1471c19800e8SDoug Rabson 
1472c19800e8SDoug Rabson 
1473c19800e8SDoug Rabson   if (yyerrstatus == 3)
1474c19800e8SDoug Rabson     {
1475c19800e8SDoug Rabson       /* If just tried and failed to reuse look-ahead token after an
1476c19800e8SDoug Rabson 	 error, discard it.  */
1477c19800e8SDoug Rabson 
1478c19800e8SDoug Rabson       if (yychar <= YYEOF)
1479c19800e8SDoug Rabson 	{
1480c19800e8SDoug Rabson 	  /* Return failure if at end of input.  */
1481c19800e8SDoug Rabson 	  if (yychar == YYEOF)
1482c19800e8SDoug Rabson 	    YYABORT;
1483c19800e8SDoug Rabson 	}
1484c19800e8SDoug Rabson       else
1485c19800e8SDoug Rabson 	{
1486c19800e8SDoug Rabson 	  yydestruct ("Error: discarding",
1487c19800e8SDoug Rabson 		      yytoken, &yylval);
1488c19800e8SDoug Rabson 	  yychar = YYEMPTY;
1489c19800e8SDoug Rabson 	}
1490c19800e8SDoug Rabson     }
1491c19800e8SDoug Rabson 
1492c19800e8SDoug Rabson   /* Else will try to reuse look-ahead token after shifting the error
1493c19800e8SDoug Rabson      token.  */
1494c19800e8SDoug Rabson   goto yyerrlab1;
1495c19800e8SDoug Rabson 
1496c19800e8SDoug Rabson 
1497c19800e8SDoug Rabson /*---------------------------------------------------.
1498c19800e8SDoug Rabson | yyerrorlab -- error raised explicitly by YYERROR.  |
1499c19800e8SDoug Rabson `---------------------------------------------------*/
1500c19800e8SDoug Rabson yyerrorlab:
1501c19800e8SDoug Rabson 
1502c19800e8SDoug Rabson   /* Pacify compilers like GCC when the user code never invokes
1503c19800e8SDoug Rabson      YYERROR and the label yyerrorlab therefore never appears in user
1504c19800e8SDoug Rabson      code.  */
1505c19800e8SDoug Rabson   if (/*CONSTCOND*/ 0)
1506c19800e8SDoug Rabson      goto yyerrorlab;
1507c19800e8SDoug Rabson 
1508c19800e8SDoug Rabson   /* Do not reclaim the symbols of the rule which action triggered
1509c19800e8SDoug Rabson      this YYERROR.  */
1510c19800e8SDoug Rabson   YYPOPSTACK (yylen);
1511c19800e8SDoug Rabson   yylen = 0;
1512c19800e8SDoug Rabson   YY_STACK_PRINT (yyss, yyssp);
1513c19800e8SDoug Rabson   yystate = *yyssp;
1514c19800e8SDoug Rabson   goto yyerrlab1;
1515c19800e8SDoug Rabson 
1516c19800e8SDoug Rabson 
1517c19800e8SDoug Rabson /*-------------------------------------------------------------.
1518c19800e8SDoug Rabson | yyerrlab1 -- common code for both syntax error and YYERROR.  |
1519c19800e8SDoug Rabson `-------------------------------------------------------------*/
1520c19800e8SDoug Rabson yyerrlab1:
1521c19800e8SDoug Rabson   yyerrstatus = 3;	/* Each real token shifted decrements this.  */
1522c19800e8SDoug Rabson 
1523c19800e8SDoug Rabson   for (;;)
1524c19800e8SDoug Rabson     {
1525c19800e8SDoug Rabson       yyn = yypact[yystate];
1526c19800e8SDoug Rabson       if (yyn != YYPACT_NINF)
1527c19800e8SDoug Rabson 	{
1528c19800e8SDoug Rabson 	  yyn += YYTERROR;
1529c19800e8SDoug Rabson 	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
1530c19800e8SDoug Rabson 	    {
1531c19800e8SDoug Rabson 	      yyn = yytable[yyn];
1532c19800e8SDoug Rabson 	      if (0 < yyn)
1533c19800e8SDoug Rabson 		break;
1534c19800e8SDoug Rabson 	    }
1535c19800e8SDoug Rabson 	}
1536c19800e8SDoug Rabson 
1537c19800e8SDoug Rabson       /* Pop the current state because it cannot handle the error token.  */
1538c19800e8SDoug Rabson       if (yyssp == yyss)
1539c19800e8SDoug Rabson 	YYABORT;
1540c19800e8SDoug Rabson 
1541c19800e8SDoug Rabson 
1542c19800e8SDoug Rabson       yydestruct ("Error: popping",
1543c19800e8SDoug Rabson 		  yystos[yystate], yyvsp);
1544c19800e8SDoug Rabson       YYPOPSTACK (1);
1545c19800e8SDoug Rabson       yystate = *yyssp;
1546c19800e8SDoug Rabson       YY_STACK_PRINT (yyss, yyssp);
1547c19800e8SDoug Rabson     }
1548c19800e8SDoug Rabson 
1549c19800e8SDoug Rabson   if (yyn == YYFINAL)
1550c19800e8SDoug Rabson     YYACCEPT;
1551c19800e8SDoug Rabson 
1552c19800e8SDoug Rabson   *++yyvsp = yylval;
1553c19800e8SDoug Rabson 
1554c19800e8SDoug Rabson 
1555c19800e8SDoug Rabson   /* Shift the error token.  */
1556c19800e8SDoug Rabson   YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
1557c19800e8SDoug Rabson 
1558c19800e8SDoug Rabson   yystate = yyn;
1559c19800e8SDoug Rabson   goto yynewstate;
1560c19800e8SDoug Rabson 
1561c19800e8SDoug Rabson 
1562c19800e8SDoug Rabson /*-------------------------------------.
1563c19800e8SDoug Rabson | yyacceptlab -- YYACCEPT comes here.  |
1564c19800e8SDoug Rabson `-------------------------------------*/
1565c19800e8SDoug Rabson yyacceptlab:
1566c19800e8SDoug Rabson   yyresult = 0;
1567c19800e8SDoug Rabson   goto yyreturn;
1568c19800e8SDoug Rabson 
1569c19800e8SDoug Rabson /*-----------------------------------.
1570c19800e8SDoug Rabson | yyabortlab -- YYABORT comes here.  |
1571c19800e8SDoug Rabson `-----------------------------------*/
1572c19800e8SDoug Rabson yyabortlab:
1573c19800e8SDoug Rabson   yyresult = 1;
1574c19800e8SDoug Rabson   goto yyreturn;
1575c19800e8SDoug Rabson 
1576c19800e8SDoug Rabson #ifndef yyoverflow
1577c19800e8SDoug Rabson /*-------------------------------------------------.
1578c19800e8SDoug Rabson | yyexhaustedlab -- memory exhaustion comes here.  |
1579c19800e8SDoug Rabson `-------------------------------------------------*/
1580c19800e8SDoug Rabson yyexhaustedlab:
1581c19800e8SDoug Rabson   yyerror (YY_("memory exhausted"));
1582c19800e8SDoug Rabson   yyresult = 2;
1583c19800e8SDoug Rabson   /* Fall through.  */
1584c19800e8SDoug Rabson #endif
1585c19800e8SDoug Rabson 
1586c19800e8SDoug Rabson yyreturn:
1587c19800e8SDoug Rabson   if (yychar != YYEOF && yychar != YYEMPTY)
1588c19800e8SDoug Rabson      yydestruct ("Cleanup: discarding lookahead",
1589c19800e8SDoug Rabson 		 yytoken, &yylval);
1590c19800e8SDoug Rabson   /* Do not reclaim the symbols of the rule which action triggered
1591c19800e8SDoug Rabson      this YYABORT or YYACCEPT.  */
1592c19800e8SDoug Rabson   YYPOPSTACK (yylen);
1593c19800e8SDoug Rabson   YY_STACK_PRINT (yyss, yyssp);
1594c19800e8SDoug Rabson   while (yyssp != yyss)
1595c19800e8SDoug Rabson     {
1596c19800e8SDoug Rabson       yydestruct ("Cleanup: popping",
1597c19800e8SDoug Rabson 		  yystos[*yyssp], yyvsp);
1598c19800e8SDoug Rabson       YYPOPSTACK (1);
1599c19800e8SDoug Rabson     }
1600c19800e8SDoug Rabson #ifndef yyoverflow
1601c19800e8SDoug Rabson   if (yyss != yyssa)
1602c19800e8SDoug Rabson     YYSTACK_FREE (yyss);
1603c19800e8SDoug Rabson #endif
1604c19800e8SDoug Rabson #if YYERROR_VERBOSE
1605c19800e8SDoug Rabson   if (yymsg != yymsgbuf)
1606c19800e8SDoug Rabson     YYSTACK_FREE (yymsg);
1607c19800e8SDoug Rabson #endif
1608c19800e8SDoug Rabson   /* Make sure YYID is used.  */
1609c19800e8SDoug Rabson   return YYID (yyresult);
1610c19800e8SDoug Rabson }
1611c19800e8SDoug Rabson 
1612c19800e8SDoug Rabson 
1613*ae771770SStanislav Sedov #line 104 "slc-gram.y"
1614c19800e8SDoug Rabson 
1615c19800e8SDoug Rabson char *filename;
1616c19800e8SDoug Rabson FILE *cfile, *hfile;
1617c19800e8SDoug Rabson int error_flag;
1618c19800e8SDoug Rabson struct assignment *assignment;
1619c19800e8SDoug Rabson 
1620c19800e8SDoug Rabson 
1621c19800e8SDoug Rabson static void
ex(struct assignment * a,const char * fmt,...)1622c19800e8SDoug Rabson ex(struct assignment *a, const char *fmt, ...)
1623c19800e8SDoug Rabson {
1624c19800e8SDoug Rabson     va_list ap;
1625c19800e8SDoug Rabson     fprintf(stderr, "%s:%d: ", a->name, a->lineno);
1626c19800e8SDoug Rabson     va_start(ap, fmt);
1627c19800e8SDoug Rabson     vfprintf(stderr, fmt, ap);
1628c19800e8SDoug Rabson     va_end(ap);
1629c19800e8SDoug Rabson     fprintf(stderr, "\n");
1630c19800e8SDoug Rabson }
1631c19800e8SDoug Rabson 
1632c19800e8SDoug Rabson 
1633c19800e8SDoug Rabson 
1634c19800e8SDoug Rabson static int
check_option(struct assignment * as)1635c19800e8SDoug Rabson check_option(struct assignment *as)
1636c19800e8SDoug Rabson {
1637c19800e8SDoug Rabson     struct assignment *a;
1638c19800e8SDoug Rabson     int seen_long = 0;
1639*ae771770SStanislav Sedov     int seen_name = 0;
1640c19800e8SDoug Rabson     int seen_short = 0;
1641c19800e8SDoug Rabson     int seen_type = 0;
1642c19800e8SDoug Rabson     int seen_argument = 0;
1643c19800e8SDoug Rabson     int seen_help = 0;
1644c19800e8SDoug Rabson     int seen_default = 0;
1645c19800e8SDoug Rabson     int ret = 0;
1646c19800e8SDoug Rabson 
1647c19800e8SDoug Rabson     for(a = as; a != NULL; a = a->next) {
1648c19800e8SDoug Rabson 	if(strcmp(a->name, "long") == 0)
1649c19800e8SDoug Rabson 	    seen_long++;
1650c19800e8SDoug Rabson 	else if(strcmp(a->name, "short") == 0)
1651c19800e8SDoug Rabson 	    seen_short++;
1652*ae771770SStanislav Sedov 	else if(strcmp(a->name, "name") == 0)
1653*ae771770SStanislav Sedov 	    seen_name++;
1654c19800e8SDoug Rabson 	else if(strcmp(a->name, "type") == 0)
1655c19800e8SDoug Rabson 	    seen_type++;
1656c19800e8SDoug Rabson 	else if(strcmp(a->name, "argument") == 0)
1657c19800e8SDoug Rabson 	    seen_argument++;
1658c19800e8SDoug Rabson 	else if(strcmp(a->name, "help") == 0)
1659c19800e8SDoug Rabson 	    seen_help++;
1660c19800e8SDoug Rabson 	else if(strcmp(a->name, "default") == 0)
1661c19800e8SDoug Rabson 	    seen_default++;
1662c19800e8SDoug Rabson 	else {
1663*ae771770SStanislav Sedov 	    ex(a, "unknown name %s", a->name);
1664c19800e8SDoug Rabson 	    ret++;
1665c19800e8SDoug Rabson 	}
1666c19800e8SDoug Rabson     }
1667c19800e8SDoug Rabson     if(seen_long == 0 && seen_short == 0) {
1668c19800e8SDoug Rabson 	ex(as, "neither long nor short option");
1669c19800e8SDoug Rabson 	ret++;
1670c19800e8SDoug Rabson     }
1671*ae771770SStanislav Sedov     if (seen_long == 0 && seen_name == 0) {
1672*ae771770SStanislav Sedov 	ex(as, "either of long or name option must be used");
1673*ae771770SStanislav Sedov 	ret++;
1674*ae771770SStanislav Sedov     }
1675c19800e8SDoug Rabson     if(seen_long > 1) {
1676c19800e8SDoug Rabson 	ex(as, "multiple long options");
1677c19800e8SDoug Rabson 	ret++;
1678c19800e8SDoug Rabson     }
1679c19800e8SDoug Rabson     if(seen_short > 1) {
1680c19800e8SDoug Rabson 	ex(as, "multiple short options");
1681c19800e8SDoug Rabson 	ret++;
1682c19800e8SDoug Rabson     }
1683c19800e8SDoug Rabson     if(seen_type > 1) {
1684c19800e8SDoug Rabson 	ex(as, "multiple types");
1685c19800e8SDoug Rabson 	ret++;
1686c19800e8SDoug Rabson     }
1687c19800e8SDoug Rabson     if(seen_argument > 1) {
1688c19800e8SDoug Rabson 	ex(as, "multiple arguments");
1689c19800e8SDoug Rabson 	ret++;
1690c19800e8SDoug Rabson     }
1691c19800e8SDoug Rabson     if(seen_help > 1) {
1692c19800e8SDoug Rabson 	ex(as, "multiple help strings");
1693c19800e8SDoug Rabson 	ret++;
1694c19800e8SDoug Rabson     }
1695c19800e8SDoug Rabson     if(seen_default > 1) {
1696c19800e8SDoug Rabson 	ex(as, "multiple default values");
1697c19800e8SDoug Rabson 	ret++;
1698c19800e8SDoug Rabson     }
1699c19800e8SDoug Rabson     return ret;
1700c19800e8SDoug Rabson }
1701c19800e8SDoug Rabson 
1702c19800e8SDoug Rabson static int
check_command(struct assignment * as)1703c19800e8SDoug Rabson check_command(struct assignment *as)
1704c19800e8SDoug Rabson {
1705c19800e8SDoug Rabson 	struct assignment *a;
1706c19800e8SDoug Rabson 	int seen_name = 0;
1707c19800e8SDoug Rabson 	int seen_function = 0;
1708c19800e8SDoug Rabson 	int seen_help = 0;
1709c19800e8SDoug Rabson 	int seen_argument = 0;
1710c19800e8SDoug Rabson 	int seen_minargs = 0;
1711c19800e8SDoug Rabson 	int seen_maxargs = 0;
1712c19800e8SDoug Rabson 	int ret = 0;
1713c19800e8SDoug Rabson 	for(a = as; a != NULL; a = a->next) {
1714c19800e8SDoug Rabson 		if(strcmp(a->name, "name") == 0)
1715c19800e8SDoug Rabson 			seen_name++;
1716c19800e8SDoug Rabson 		else if(strcmp(a->name, "function") == 0) {
1717c19800e8SDoug Rabson 			seen_function++;
1718c19800e8SDoug Rabson 		} else if(strcmp(a->name, "option") == 0)
1719c19800e8SDoug Rabson 			ret += check_option(a->u.assignment);
1720c19800e8SDoug Rabson 		else if(strcmp(a->name, "help") == 0) {
1721c19800e8SDoug Rabson 			seen_help++;
1722c19800e8SDoug Rabson 		} else if(strcmp(a->name, "argument") == 0) {
1723c19800e8SDoug Rabson 			seen_argument++;
1724c19800e8SDoug Rabson 		} else if(strcmp(a->name, "min_args") == 0) {
1725c19800e8SDoug Rabson 			seen_minargs++;
1726c19800e8SDoug Rabson 		} else if(strcmp(a->name, "max_args") == 0) {
1727c19800e8SDoug Rabson 			seen_maxargs++;
1728c19800e8SDoug Rabson 		} else {
1729*ae771770SStanislav Sedov 			ex(a, "unknown name: %s", a->name);
1730c19800e8SDoug Rabson 			ret++;
1731c19800e8SDoug Rabson 		}
1732c19800e8SDoug Rabson 	}
1733c19800e8SDoug Rabson 	if(seen_name == 0) {
1734c19800e8SDoug Rabson 		ex(as, "no command name");
1735c19800e8SDoug Rabson 		ret++;
1736c19800e8SDoug Rabson 	}
1737c19800e8SDoug Rabson 	if(seen_function > 1) {
1738c19800e8SDoug Rabson 		ex(as, "multiple function names");
1739c19800e8SDoug Rabson 		ret++;
1740c19800e8SDoug Rabson 	}
1741c19800e8SDoug Rabson 	if(seen_help > 1) {
1742c19800e8SDoug Rabson 		ex(as, "multiple help strings");
1743c19800e8SDoug Rabson 		ret++;
1744c19800e8SDoug Rabson 	}
1745c19800e8SDoug Rabson 	if(seen_argument > 1) {
1746c19800e8SDoug Rabson 		ex(as, "multiple argument strings");
1747c19800e8SDoug Rabson 		ret++;
1748c19800e8SDoug Rabson 	}
1749c19800e8SDoug Rabson 	if(seen_minargs > 1) {
1750c19800e8SDoug Rabson 		ex(as, "multiple min_args strings");
1751c19800e8SDoug Rabson 		ret++;
1752c19800e8SDoug Rabson 	}
1753c19800e8SDoug Rabson 	if(seen_maxargs > 1) {
1754c19800e8SDoug Rabson 		ex(as, "multiple max_args strings");
1755c19800e8SDoug Rabson 		ret++;
1756c19800e8SDoug Rabson 	}
1757c19800e8SDoug Rabson 
1758c19800e8SDoug Rabson 	return ret;
1759c19800e8SDoug Rabson }
1760c19800e8SDoug Rabson 
1761c19800e8SDoug Rabson static int
check(struct assignment * as)1762c19800e8SDoug Rabson check(struct assignment *as)
1763c19800e8SDoug Rabson {
1764c19800e8SDoug Rabson     struct assignment *a;
1765c19800e8SDoug Rabson     int ret = 0;
1766c19800e8SDoug Rabson     for(a = as; a != NULL; a = a->next) {
1767c19800e8SDoug Rabson 	if(strcmp(a->name, "command")) {
1768c19800e8SDoug Rabson 	    fprintf(stderr, "unknown type %s line %d\n", a->name, a->lineno);
1769c19800e8SDoug Rabson 	    ret++;
1770c19800e8SDoug Rabson 	    continue;
1771c19800e8SDoug Rabson 	}
1772c19800e8SDoug Rabson 	if(a->type != a_assignment) {
1773c19800e8SDoug Rabson 	    fprintf(stderr, "bad command definition %s line %d\n", a->name, a->lineno);
1774c19800e8SDoug Rabson 	    ret++;
1775c19800e8SDoug Rabson 	    continue;
1776c19800e8SDoug Rabson 	}
1777c19800e8SDoug Rabson 	ret += check_command(a->u.assignment);
1778c19800e8SDoug Rabson     }
1779c19800e8SDoug Rabson     return ret;
1780c19800e8SDoug Rabson }
1781c19800e8SDoug Rabson 
1782c19800e8SDoug Rabson static struct assignment *
find_next(struct assignment * as,const char * name)1783c19800e8SDoug Rabson find_next(struct assignment *as, const char *name)
1784c19800e8SDoug Rabson {
1785c19800e8SDoug Rabson     for(as = as->next; as != NULL; as = as->next) {
1786c19800e8SDoug Rabson 	if(strcmp(as->name, name) == 0)
1787c19800e8SDoug Rabson 	    return as;
1788c19800e8SDoug Rabson     }
1789c19800e8SDoug Rabson     return NULL;
1790c19800e8SDoug Rabson }
1791c19800e8SDoug Rabson 
1792c19800e8SDoug Rabson static struct assignment *
find(struct assignment * as,const char * name)1793c19800e8SDoug Rabson find(struct assignment *as, const char *name)
1794c19800e8SDoug Rabson {
1795c19800e8SDoug Rabson     for(; as != NULL; as = as->next) {
1796c19800e8SDoug Rabson 	if(strcmp(as->name, name) == 0)
1797c19800e8SDoug Rabson 	    return as;
1798c19800e8SDoug Rabson     }
1799c19800e8SDoug Rabson     return NULL;
1800c19800e8SDoug Rabson }
1801c19800e8SDoug Rabson 
1802c19800e8SDoug Rabson static void
space(FILE * f,int level)1803c19800e8SDoug Rabson space(FILE *f, int level)
1804c19800e8SDoug Rabson {
1805c19800e8SDoug Rabson     fprintf(f, "%*.*s", level * 4, level * 4, " ");
1806c19800e8SDoug Rabson }
1807c19800e8SDoug Rabson 
1808c19800e8SDoug Rabson static void
cprint(int level,const char * fmt,...)1809c19800e8SDoug Rabson cprint(int level, const char *fmt, ...)
1810c19800e8SDoug Rabson {
1811c19800e8SDoug Rabson     va_list ap;
1812c19800e8SDoug Rabson     va_start(ap, fmt);
1813c19800e8SDoug Rabson     space(cfile, level);
1814c19800e8SDoug Rabson     vfprintf(cfile, fmt, ap);
1815c19800e8SDoug Rabson     va_end(ap);
1816c19800e8SDoug Rabson }
1817c19800e8SDoug Rabson 
1818c19800e8SDoug Rabson static void
hprint(int level,const char * fmt,...)1819c19800e8SDoug Rabson hprint(int level, const char *fmt, ...)
1820c19800e8SDoug Rabson {
1821c19800e8SDoug Rabson     va_list ap;
1822c19800e8SDoug Rabson     va_start(ap, fmt);
1823c19800e8SDoug Rabson     space(hfile, level);
1824c19800e8SDoug Rabson     vfprintf(hfile, fmt, ap);
1825c19800e8SDoug Rabson     va_end(ap);
1826c19800e8SDoug Rabson }
1827c19800e8SDoug Rabson 
1828c19800e8SDoug Rabson static void gen_name(char *str);
1829c19800e8SDoug Rabson 
1830c19800e8SDoug Rabson static void
gen_command(struct assignment * as)1831c19800e8SDoug Rabson gen_command(struct assignment *as)
1832c19800e8SDoug Rabson {
1833c19800e8SDoug Rabson     struct assignment *a, *b;
1834c19800e8SDoug Rabson     char *f;
1835c19800e8SDoug Rabson     a = find(as, "name");
1836c19800e8SDoug Rabson     f = strdup(a->u.value);
1837c19800e8SDoug Rabson     gen_name(f);
1838c19800e8SDoug Rabson     cprint(1, "    { ");
1839c19800e8SDoug Rabson     fprintf(cfile, "\"%s\", ", a->u.value);
1840c19800e8SDoug Rabson     fprintf(cfile, "%s_wrap, ", f);
1841c19800e8SDoug Rabson     b = find(as, "argument");
1842c19800e8SDoug Rabson     if(b)
1843c19800e8SDoug Rabson 	fprintf(cfile, "\"%s %s\", ", a->u.value, b->u.value);
1844c19800e8SDoug Rabson     else
1845c19800e8SDoug Rabson 	fprintf(cfile, "\"%s\", ", a->u.value);
1846c19800e8SDoug Rabson     b = find(as, "help");
1847c19800e8SDoug Rabson     if(b)
1848c19800e8SDoug Rabson 	fprintf(cfile, "\"%s\"", b->u.value);
1849c19800e8SDoug Rabson     else
1850c19800e8SDoug Rabson 	fprintf(cfile, "NULL");
1851c19800e8SDoug Rabson     fprintf(cfile, " },\n");
1852c19800e8SDoug Rabson     for(a = a->next; a != NULL; a = a->next)
1853c19800e8SDoug Rabson 	if(strcmp(a->name, "name") == 0)
1854c19800e8SDoug Rabson 	    cprint(1, "    { \"%s\" },\n", a->u.value);
1855c19800e8SDoug Rabson     cprint(0, "\n");
1856c19800e8SDoug Rabson }
1857c19800e8SDoug Rabson 
1858c19800e8SDoug Rabson static void
gen_name(char * str)1859c19800e8SDoug Rabson gen_name(char *str)
1860c19800e8SDoug Rabson {
1861c19800e8SDoug Rabson     char *p;
1862c19800e8SDoug Rabson     for(p = str; *p != '\0'; p++)
1863c19800e8SDoug Rabson 	if(!isalnum((unsigned char)*p))
1864c19800e8SDoug Rabson 	    *p = '_';
1865c19800e8SDoug Rabson }
1866c19800e8SDoug Rabson 
1867c19800e8SDoug Rabson static char *
make_name(struct assignment * as)1868c19800e8SDoug Rabson make_name(struct assignment *as)
1869c19800e8SDoug Rabson {
1870c19800e8SDoug Rabson     struct assignment *lopt;
1871c19800e8SDoug Rabson     struct assignment *type;
1872c19800e8SDoug Rabson     char *s;
1873c19800e8SDoug Rabson 
1874c19800e8SDoug Rabson     lopt = find(as, "long");
1875c19800e8SDoug Rabson     if(lopt == NULL)
1876c19800e8SDoug Rabson 	lopt = find(as, "name");
1877c19800e8SDoug Rabson     if(lopt == NULL)
1878c19800e8SDoug Rabson 	return NULL;
1879c19800e8SDoug Rabson 
1880c19800e8SDoug Rabson     type = find(as, "type");
1881c19800e8SDoug Rabson     if(strcmp(type->u.value, "-flag") == 0)
1882c19800e8SDoug Rabson 	asprintf(&s, "%s_flag", lopt->u.value);
1883c19800e8SDoug Rabson     else
1884c19800e8SDoug Rabson 	asprintf(&s, "%s_%s", lopt->u.value, type->u.value);
1885c19800e8SDoug Rabson     gen_name(s);
1886c19800e8SDoug Rabson     return s;
1887c19800e8SDoug Rabson }
1888c19800e8SDoug Rabson 
1889c19800e8SDoug Rabson 
defval_int(const char * name,struct assignment * defval)1890c19800e8SDoug Rabson static void defval_int(const char *name, struct assignment *defval)
1891c19800e8SDoug Rabson {
1892c19800e8SDoug Rabson     if(defval != NULL)
1893c19800e8SDoug Rabson 	cprint(1, "opt.%s = %s;\n", name, defval->u.value);
1894c19800e8SDoug Rabson     else
1895c19800e8SDoug Rabson 	cprint(1, "opt.%s = 0;\n", name);
1896c19800e8SDoug Rabson }
defval_neg_flag(const char * name,struct assignment * defval)1897*ae771770SStanislav Sedov static void defval_neg_flag(const char *name, struct assignment *defval)
1898*ae771770SStanislav Sedov {
1899*ae771770SStanislav Sedov     if(defval != NULL)
1900*ae771770SStanislav Sedov 	cprint(1, "opt.%s = %s;\n", name, defval->u.value);
1901*ae771770SStanislav Sedov     else
1902*ae771770SStanislav Sedov 	cprint(1, "opt.%s = 1;\n", name);
1903*ae771770SStanislav Sedov }
defval_string(const char * name,struct assignment * defval)1904c19800e8SDoug Rabson static void defval_string(const char *name, struct assignment *defval)
1905c19800e8SDoug Rabson {
1906c19800e8SDoug Rabson     if(defval != NULL)
1907*ae771770SStanislav Sedov 	cprint(1, "opt.%s = (char *)(unsigned long)\"%s\";\n", name, defval->u.value);
1908c19800e8SDoug Rabson     else
1909c19800e8SDoug Rabson 	cprint(1, "opt.%s = NULL;\n", name);
1910c19800e8SDoug Rabson }
defval_strings(const char * name,struct assignment * defval)1911c19800e8SDoug Rabson static void defval_strings(const char *name, struct assignment *defval)
1912c19800e8SDoug Rabson {
1913c19800e8SDoug Rabson     cprint(1, "opt.%s.num_strings = 0;\n", name);
1914c19800e8SDoug Rabson     cprint(1, "opt.%s.strings = NULL;\n", name);
1915c19800e8SDoug Rabson }
1916c19800e8SDoug Rabson 
free_strings(const char * name)1917c19800e8SDoug Rabson static void free_strings(const char *name)
1918c19800e8SDoug Rabson {
1919c19800e8SDoug Rabson     cprint(1, "free_getarg_strings (&opt.%s);\n", name);
1920c19800e8SDoug Rabson }
1921c19800e8SDoug Rabson 
1922c19800e8SDoug Rabson struct type_handler {
1923c19800e8SDoug Rabson     const char *typename;
1924c19800e8SDoug Rabson     const char *c_type;
1925c19800e8SDoug Rabson     const char *getarg_type;
1926c19800e8SDoug Rabson     void (*defval)(const char*, struct assignment*);
1927c19800e8SDoug Rabson     void (*free)(const char*);
1928c19800e8SDoug Rabson } type_handlers[] = {
1929c19800e8SDoug Rabson 	{ "integer",
1930c19800e8SDoug Rabson 	  "int",
1931c19800e8SDoug Rabson 	  "arg_integer",
1932c19800e8SDoug Rabson 	  defval_int,
1933c19800e8SDoug Rabson 	  NULL
1934c19800e8SDoug Rabson 	},
1935c19800e8SDoug Rabson 	{ "string",
1936c19800e8SDoug Rabson 	  "char*",
1937c19800e8SDoug Rabson 	  "arg_string",
1938c19800e8SDoug Rabson 	  defval_string,
1939c19800e8SDoug Rabson 	  NULL
1940c19800e8SDoug Rabson 	},
1941c19800e8SDoug Rabson 	{ "strings",
1942c19800e8SDoug Rabson 	  "struct getarg_strings",
1943c19800e8SDoug Rabson 	  "arg_strings",
1944c19800e8SDoug Rabson 	  defval_strings,
1945c19800e8SDoug Rabson 	  free_strings
1946c19800e8SDoug Rabson 	},
1947c19800e8SDoug Rabson 	{ "flag",
1948c19800e8SDoug Rabson 	  "int",
1949c19800e8SDoug Rabson 	  "arg_flag",
1950c19800e8SDoug Rabson 	  defval_int,
1951c19800e8SDoug Rabson 	  NULL
1952c19800e8SDoug Rabson 	},
1953c19800e8SDoug Rabson 	{ "-flag",
1954c19800e8SDoug Rabson 	  "int",
1955c19800e8SDoug Rabson 	  "arg_negative_flag",
1956*ae771770SStanislav Sedov 	  defval_neg_flag,
1957c19800e8SDoug Rabson 	  NULL
1958c19800e8SDoug Rabson 	},
1959c19800e8SDoug Rabson 	{ NULL }
1960c19800e8SDoug Rabson };
1961c19800e8SDoug Rabson 
find_handler(struct assignment * type)1962c19800e8SDoug Rabson static struct type_handler *find_handler(struct assignment *type)
1963c19800e8SDoug Rabson {
1964c19800e8SDoug Rabson     struct type_handler *th;
1965c19800e8SDoug Rabson     for(th = type_handlers; th->typename != NULL; th++)
1966c19800e8SDoug Rabson 	if(strcmp(type->u.value, th->typename) == 0)
1967c19800e8SDoug Rabson 	    return th;
1968c19800e8SDoug Rabson     ex(type, "unknown type \"%s\"", type->u.value);
1969c19800e8SDoug Rabson     exit(1);
1970c19800e8SDoug Rabson }
1971c19800e8SDoug Rabson 
1972c19800e8SDoug Rabson static void
gen_options(struct assignment * opt1,const char * name)1973c19800e8SDoug Rabson gen_options(struct assignment *opt1, const char *name)
1974c19800e8SDoug Rabson {
1975c19800e8SDoug Rabson     struct assignment *tmp;
1976c19800e8SDoug Rabson 
1977c19800e8SDoug Rabson     hprint(0, "struct %s_options {\n", name);
1978c19800e8SDoug Rabson 
1979c19800e8SDoug Rabson     for(tmp = opt1;
1980c19800e8SDoug Rabson 	tmp != NULL;
1981c19800e8SDoug Rabson 	tmp = find_next(tmp, "option")) {
1982c19800e8SDoug Rabson 	struct assignment *type;
1983c19800e8SDoug Rabson 	struct type_handler *th;
1984c19800e8SDoug Rabson 	char *s;
1985c19800e8SDoug Rabson 
1986c19800e8SDoug Rabson 	s = make_name(tmp->u.assignment);
1987c19800e8SDoug Rabson 	type = find(tmp->u.assignment, "type");
1988c19800e8SDoug Rabson 	th = find_handler(type);
1989c19800e8SDoug Rabson 	hprint(1, "%s %s;\n", th->c_type, s);
1990c19800e8SDoug Rabson 	free(s);
1991c19800e8SDoug Rabson     }
1992c19800e8SDoug Rabson     hprint(0, "};\n");
1993c19800e8SDoug Rabson }
1994c19800e8SDoug Rabson 
1995c19800e8SDoug Rabson static void
gen_wrapper(struct assignment * as)1996c19800e8SDoug Rabson gen_wrapper(struct assignment *as)
1997c19800e8SDoug Rabson {
1998c19800e8SDoug Rabson     struct assignment *name;
1999c19800e8SDoug Rabson     struct assignment *arg;
2000c19800e8SDoug Rabson     struct assignment *opt1;
2001c19800e8SDoug Rabson     struct assignment *function;
2002c19800e8SDoug Rabson     struct assignment *tmp;
2003c19800e8SDoug Rabson     char *n, *f;
2004c19800e8SDoug Rabson     int nargs = 0;
2005*ae771770SStanislav Sedov     int narguments = 0;
2006c19800e8SDoug Rabson 
2007c19800e8SDoug Rabson     name = find(as, "name");
2008c19800e8SDoug Rabson     n = strdup(name->u.value);
2009c19800e8SDoug Rabson     gen_name(n);
2010c19800e8SDoug Rabson     arg = find(as, "argument");
2011*ae771770SStanislav Sedov     if (arg)
2012*ae771770SStanislav Sedov         narguments++;
2013c19800e8SDoug Rabson     opt1 = find(as, "option");
2014c19800e8SDoug Rabson     function = find(as, "function");
2015c19800e8SDoug Rabson     if(function)
2016c19800e8SDoug Rabson 	f = function->u.value;
2017c19800e8SDoug Rabson     else
2018c19800e8SDoug Rabson 	f = n;
2019c19800e8SDoug Rabson 
2020c19800e8SDoug Rabson 
2021c19800e8SDoug Rabson     if(opt1 != NULL) {
2022c19800e8SDoug Rabson 	gen_options(opt1, n);
2023c19800e8SDoug Rabson 	hprint(0, "int %s(struct %s_options*, int, char **);\n", f, n);
2024c19800e8SDoug Rabson     } else {
2025c19800e8SDoug Rabson 	hprint(0, "int %s(void*, int, char **);\n", f);
2026c19800e8SDoug Rabson     }
2027c19800e8SDoug Rabson 
2028c19800e8SDoug Rabson     fprintf(cfile, "static int\n");
2029c19800e8SDoug Rabson     fprintf(cfile, "%s_wrap(int argc, char **argv)\n", n);
2030c19800e8SDoug Rabson     fprintf(cfile, "{\n");
2031c19800e8SDoug Rabson     if(opt1 != NULL)
2032c19800e8SDoug Rabson 	cprint(1, "struct %s_options opt;\n", n);
2033c19800e8SDoug Rabson     cprint(1, "int ret;\n");
2034c19800e8SDoug Rabson     cprint(1, "int optidx = 0;\n");
2035c19800e8SDoug Rabson     cprint(1, "struct getargs args[] = {\n");
2036c19800e8SDoug Rabson     for(tmp = find(as, "option");
2037c19800e8SDoug Rabson 	tmp != NULL;
2038c19800e8SDoug Rabson 	tmp = find_next(tmp, "option")) {
2039c19800e8SDoug Rabson 	struct assignment *type = find(tmp->u.assignment, "type");
2040c19800e8SDoug Rabson 	struct assignment *lopt = find(tmp->u.assignment, "long");
2041c19800e8SDoug Rabson 	struct assignment *sopt = find(tmp->u.assignment, "short");
2042c19800e8SDoug Rabson 	struct assignment *aarg = find(tmp->u.assignment, "argument");
2043c19800e8SDoug Rabson 	struct assignment *help = find(tmp->u.assignment, "help");
2044c19800e8SDoug Rabson 
2045c19800e8SDoug Rabson 	struct type_handler *th;
2046c19800e8SDoug Rabson 
2047c19800e8SDoug Rabson 	cprint(2, "{ ");
2048c19800e8SDoug Rabson 	if(lopt)
2049c19800e8SDoug Rabson 	    fprintf(cfile, "\"%s\", ", lopt->u.value);
2050c19800e8SDoug Rabson 	else
2051c19800e8SDoug Rabson 	    fprintf(cfile, "NULL, ");
2052c19800e8SDoug Rabson 	if(sopt)
2053c19800e8SDoug Rabson 	    fprintf(cfile, "'%c', ", *sopt->u.value);
2054c19800e8SDoug Rabson 	else
2055c19800e8SDoug Rabson 	    fprintf(cfile, "0, ");
2056c19800e8SDoug Rabson 	th = find_handler(type);
2057c19800e8SDoug Rabson 	fprintf(cfile, "%s, ", th->getarg_type);
2058c19800e8SDoug Rabson 	fprintf(cfile, "NULL, ");
2059c19800e8SDoug Rabson 	if(help)
2060c19800e8SDoug Rabson 	    fprintf(cfile, "\"%s\", ", help->u.value);
2061c19800e8SDoug Rabson 	else
2062c19800e8SDoug Rabson 	    fprintf(cfile, "NULL, ");
2063*ae771770SStanislav Sedov 	if(aarg) {
2064c19800e8SDoug Rabson 	    fprintf(cfile, "\"%s\"", aarg->u.value);
2065*ae771770SStanislav Sedov             narguments++;
2066*ae771770SStanislav Sedov 	} else
2067c19800e8SDoug Rabson 	    fprintf(cfile, "NULL");
2068c19800e8SDoug Rabson 	fprintf(cfile, " },\n");
2069c19800e8SDoug Rabson     }
2070c19800e8SDoug Rabson     cprint(2, "{ \"help\", 'h', arg_flag, NULL, NULL, NULL }\n");
2071c19800e8SDoug Rabson     cprint(1, "};\n");
2072c19800e8SDoug Rabson     cprint(1, "int help_flag = 0;\n");
2073c19800e8SDoug Rabson 
2074c19800e8SDoug Rabson     for(tmp = find(as, "option");
2075c19800e8SDoug Rabson 	tmp != NULL;
2076c19800e8SDoug Rabson 	tmp = find_next(tmp, "option")) {
2077c19800e8SDoug Rabson 	char *s;
2078c19800e8SDoug Rabson 	struct assignment *type = find(tmp->u.assignment, "type");
2079c19800e8SDoug Rabson 
2080c19800e8SDoug Rabson 	struct assignment *defval = find(tmp->u.assignment, "default");
2081c19800e8SDoug Rabson 
2082c19800e8SDoug Rabson 	struct type_handler *th;
2083c19800e8SDoug Rabson 
2084c19800e8SDoug Rabson 	s = make_name(tmp->u.assignment);
2085c19800e8SDoug Rabson 	th = find_handler(type);
2086c19800e8SDoug Rabson 	(*th->defval)(s, defval);
2087c19800e8SDoug Rabson 	free(s);
2088c19800e8SDoug Rabson     }
2089c19800e8SDoug Rabson 
2090c19800e8SDoug Rabson     for(tmp = find(as, "option");
2091c19800e8SDoug Rabson 	tmp != NULL;
2092c19800e8SDoug Rabson 	tmp = find_next(tmp, "option")) {
2093c19800e8SDoug Rabson 	char *s;
2094c19800e8SDoug Rabson 	s = make_name(tmp->u.assignment);
2095c19800e8SDoug Rabson 	cprint(1, "args[%d].value = &opt.%s;\n", nargs++, s);
2096c19800e8SDoug Rabson 	free(s);
2097c19800e8SDoug Rabson     }
2098c19800e8SDoug Rabson     cprint(1, "args[%d].value = &help_flag;\n", nargs++);
2099c19800e8SDoug Rabson     cprint(1, "if(getarg(args, %d, argc, argv, &optidx))\n", nargs);
2100c19800e8SDoug Rabson     cprint(2, "goto usage;\n");
2101c19800e8SDoug Rabson 
2102c19800e8SDoug Rabson     {
2103c19800e8SDoug Rabson 	int min_args = -1;
2104c19800e8SDoug Rabson 	int max_args = -1;
2105c19800e8SDoug Rabson 	char *end;
2106*ae771770SStanislav Sedov 	if(narguments == 0) {
2107c19800e8SDoug Rabson 	    max_args = 0;
2108c19800e8SDoug Rabson 	} else {
2109c19800e8SDoug Rabson 	    if((tmp = find(as, "min_args")) != NULL) {
2110c19800e8SDoug Rabson 		min_args = strtol(tmp->u.value, &end, 0);
2111c19800e8SDoug Rabson 		if(*end != '\0') {
2112c19800e8SDoug Rabson 		    ex(tmp, "min_args is not numeric");
2113c19800e8SDoug Rabson 		    exit(1);
2114c19800e8SDoug Rabson 		}
2115c19800e8SDoug Rabson 		if(min_args < 0) {
2116c19800e8SDoug Rabson 		    ex(tmp, "min_args must be non-negative");
2117c19800e8SDoug Rabson 		    exit(1);
2118c19800e8SDoug Rabson 		}
2119c19800e8SDoug Rabson 	    }
2120c19800e8SDoug Rabson 	    if((tmp = find(as, "max_args")) != NULL) {
2121c19800e8SDoug Rabson 		max_args = strtol(tmp->u.value, &end, 0);
2122c19800e8SDoug Rabson 		if(*end != '\0') {
2123c19800e8SDoug Rabson 		    ex(tmp, "max_args is not numeric");
2124c19800e8SDoug Rabson 		    exit(1);
2125c19800e8SDoug Rabson 		}
2126c19800e8SDoug Rabson 		if(max_args < 0) {
2127c19800e8SDoug Rabson 		    ex(tmp, "max_args must be non-negative");
2128c19800e8SDoug Rabson 		    exit(1);
2129c19800e8SDoug Rabson 		}
2130c19800e8SDoug Rabson 	    }
2131c19800e8SDoug Rabson 	}
2132c19800e8SDoug Rabson 	if(min_args != -1 || max_args != -1) {
2133c19800e8SDoug Rabson 	    if(min_args == max_args) {
2134c19800e8SDoug Rabson 		cprint(1, "if(argc - optidx != %d) {\n",
2135c19800e8SDoug Rabson 		       min_args);
2136c19800e8SDoug Rabson 		cprint(2, "fprintf(stderr, \"Need exactly %u parameters (%%u given).\\n\\n\", argc - optidx);\n", min_args);
2137c19800e8SDoug Rabson 		cprint(2, "goto usage;\n");
2138c19800e8SDoug Rabson 		cprint(1, "}\n");
2139c19800e8SDoug Rabson 	    } else {
2140c19800e8SDoug Rabson 		if(max_args != -1) {
2141c19800e8SDoug Rabson 		    cprint(1, "if(argc - optidx > %d) {\n", max_args);
2142c19800e8SDoug Rabson 		    cprint(2, "fprintf(stderr, \"Arguments given (%%u) are more than expected (%u).\\n\\n\", argc - optidx);\n", max_args);
2143c19800e8SDoug Rabson 		    cprint(2, "goto usage;\n");
2144c19800e8SDoug Rabson 		    cprint(1, "}\n");
2145c19800e8SDoug Rabson 		}
2146c19800e8SDoug Rabson 		if(min_args != -1) {
2147c19800e8SDoug Rabson 		    cprint(1, "if(argc - optidx < %d) {\n", min_args);
2148c19800e8SDoug Rabson 		    cprint(2, "fprintf(stderr, \"Arguments given (%%u) are less than expected (%u).\\n\\n\", argc - optidx);\n", min_args);
2149c19800e8SDoug Rabson 		    cprint(2, "goto usage;\n");
2150c19800e8SDoug Rabson 		    cprint(1, "}\n");
2151c19800e8SDoug Rabson 		}
2152c19800e8SDoug Rabson 	    }
2153c19800e8SDoug Rabson 	}
2154c19800e8SDoug Rabson     }
2155c19800e8SDoug Rabson 
2156c19800e8SDoug Rabson     cprint(1, "if(help_flag)\n");
2157c19800e8SDoug Rabson     cprint(2, "goto usage;\n");
2158c19800e8SDoug Rabson 
2159c19800e8SDoug Rabson     cprint(1, "ret = %s(%s, argc - optidx, argv + optidx);\n",
2160c19800e8SDoug Rabson 	   f, opt1 ? "&opt": "NULL");
2161c19800e8SDoug Rabson 
2162c19800e8SDoug Rabson     /* free allocated data */
2163c19800e8SDoug Rabson     for(tmp = find(as, "option");
2164c19800e8SDoug Rabson 	tmp != NULL;
2165c19800e8SDoug Rabson 	tmp = find_next(tmp, "option")) {
2166c19800e8SDoug Rabson 	char *s;
2167c19800e8SDoug Rabson 	struct assignment *type = find(tmp->u.assignment, "type");
2168c19800e8SDoug Rabson 	struct type_handler *th;
2169c19800e8SDoug Rabson 	th = find_handler(type);
2170c19800e8SDoug Rabson 	if(th->free == NULL)
2171c19800e8SDoug Rabson 	    continue;
2172c19800e8SDoug Rabson 	s = make_name(tmp->u.assignment);
2173c19800e8SDoug Rabson 	(*th->free)(s);
2174c19800e8SDoug Rabson 	free(s);
2175c19800e8SDoug Rabson     }
2176c19800e8SDoug Rabson     cprint(1, "return ret;\n");
2177c19800e8SDoug Rabson 
2178c19800e8SDoug Rabson     cprint(0, "usage:\n");
2179c19800e8SDoug Rabson     cprint(1, "arg_printusage (args, %d, \"%s\", \"%s\");\n", nargs,
2180c19800e8SDoug Rabson 	   name->u.value, arg ? arg->u.value : "");
2181c19800e8SDoug Rabson     /* free allocated data */
2182c19800e8SDoug Rabson     for(tmp = find(as, "option");
2183c19800e8SDoug Rabson 	tmp != NULL;
2184c19800e8SDoug Rabson 	tmp = find_next(tmp, "option")) {
2185c19800e8SDoug Rabson 	char *s;
2186c19800e8SDoug Rabson 	struct assignment *type = find(tmp->u.assignment, "type");
2187c19800e8SDoug Rabson 	struct type_handler *th;
2188c19800e8SDoug Rabson 	th = find_handler(type);
2189c19800e8SDoug Rabson 	if(th->free == NULL)
2190c19800e8SDoug Rabson 	    continue;
2191c19800e8SDoug Rabson 	s = make_name(tmp->u.assignment);
2192c19800e8SDoug Rabson 	(*th->free)(s);
2193c19800e8SDoug Rabson 	free(s);
2194c19800e8SDoug Rabson     }
2195c19800e8SDoug Rabson     cprint(1, "return 0;\n");
2196c19800e8SDoug Rabson     cprint(0, "}\n");
2197c19800e8SDoug Rabson     cprint(0, "\n");
2198c19800e8SDoug Rabson }
2199c19800e8SDoug Rabson 
2200c19800e8SDoug Rabson char cname[PATH_MAX];
2201c19800e8SDoug Rabson char hname[PATH_MAX];
2202c19800e8SDoug Rabson 
2203c19800e8SDoug Rabson static void
gen(struct assignment * as)2204c19800e8SDoug Rabson gen(struct assignment *as)
2205c19800e8SDoug Rabson {
2206c19800e8SDoug Rabson     struct assignment *a;
2207c19800e8SDoug Rabson     cprint(0, "#include <stdio.h>\n");
2208c19800e8SDoug Rabson     cprint(0, "#include <getarg.h>\n");
2209c19800e8SDoug Rabson     cprint(0, "#include <sl.h>\n");
2210c19800e8SDoug Rabson     cprint(0, "#include \"%s\"\n\n", hname);
2211c19800e8SDoug Rabson 
2212c19800e8SDoug Rabson     hprint(0, "#include <stdio.h>\n");
2213c19800e8SDoug Rabson     hprint(0, "#include <sl.h>\n");
2214c19800e8SDoug Rabson     hprint(0, "\n");
2215c19800e8SDoug Rabson 
2216c19800e8SDoug Rabson 
2217c19800e8SDoug Rabson     for(a = as; a != NULL; a = a->next)
2218c19800e8SDoug Rabson 	gen_wrapper(a->u.assignment);
2219c19800e8SDoug Rabson 
2220c19800e8SDoug Rabson     cprint(0, "SL_cmd commands[] = {\n");
2221c19800e8SDoug Rabson     for(a = as; a != NULL; a = a->next)
2222c19800e8SDoug Rabson 	gen_command(a->u.assignment);
2223c19800e8SDoug Rabson     cprint(1, "{ NULL }\n");
2224c19800e8SDoug Rabson     cprint(0, "};\n");
2225c19800e8SDoug Rabson 
2226c19800e8SDoug Rabson     hprint(0, "extern SL_cmd commands[];\n");
2227c19800e8SDoug Rabson }
2228c19800e8SDoug Rabson 
2229c19800e8SDoug Rabson int version_flag;
2230c19800e8SDoug Rabson int help_flag;
2231c19800e8SDoug Rabson struct getargs args[] = {
2232c19800e8SDoug Rabson     { "version", 0, arg_flag, &version_flag },
2233c19800e8SDoug Rabson     { "help", 0, arg_flag, &help_flag }
2234c19800e8SDoug Rabson };
2235c19800e8SDoug Rabson int num_args = sizeof(args) / sizeof(args[0]);
2236c19800e8SDoug Rabson 
2237c19800e8SDoug Rabson static void
usage(int code)2238c19800e8SDoug Rabson usage(int code)
2239c19800e8SDoug Rabson {
2240c19800e8SDoug Rabson     arg_printusage(args, num_args, NULL, "command-table");
2241c19800e8SDoug Rabson     exit(code);
2242c19800e8SDoug Rabson }
2243c19800e8SDoug Rabson 
2244c19800e8SDoug Rabson int
main(int argc,char ** argv)2245c19800e8SDoug Rabson main(int argc, char **argv)
2246c19800e8SDoug Rabson {
2247c19800e8SDoug Rabson     char *p;
2248c19800e8SDoug Rabson 
2249c19800e8SDoug Rabson     int optidx = 0;
2250c19800e8SDoug Rabson 
2251c19800e8SDoug Rabson     setprogname(argv[0]);
2252c19800e8SDoug Rabson     if(getarg(args, num_args, argc, argv, &optidx))
2253c19800e8SDoug Rabson 	usage(1);
2254c19800e8SDoug Rabson     if(help_flag)
2255c19800e8SDoug Rabson 	usage(0);
2256c19800e8SDoug Rabson     if(version_flag) {
2257c19800e8SDoug Rabson 	print_version(NULL);
2258c19800e8SDoug Rabson 	exit(0);
2259c19800e8SDoug Rabson     }
2260c19800e8SDoug Rabson 
2261c19800e8SDoug Rabson     if(argc == optidx)
2262c19800e8SDoug Rabson 	usage(1);
2263c19800e8SDoug Rabson 
2264c19800e8SDoug Rabson     filename = argv[optidx];
2265c19800e8SDoug Rabson     yyin = fopen(filename, "r");
2266c19800e8SDoug Rabson     if(yyin == NULL)
2267c19800e8SDoug Rabson 	err(1, "%s", filename);
2268c19800e8SDoug Rabson     p = strrchr(filename, '/');
2269c19800e8SDoug Rabson     if(p)
2270c19800e8SDoug Rabson 	strlcpy(cname, p + 1, sizeof(cname));
2271c19800e8SDoug Rabson     else
2272c19800e8SDoug Rabson 	strlcpy(cname, filename, sizeof(cname));
2273c19800e8SDoug Rabson     p = strrchr(cname, '.');
2274c19800e8SDoug Rabson     if(p)
2275c19800e8SDoug Rabson 	*p = '\0';
2276c19800e8SDoug Rabson     strlcpy(hname, cname, sizeof(hname));
2277c19800e8SDoug Rabson     strlcat(cname, ".c", sizeof(cname));
2278c19800e8SDoug Rabson     strlcat(hname, ".h", sizeof(hname));
2279c19800e8SDoug Rabson     yyparse();
2280c19800e8SDoug Rabson     if(error_flag)
2281c19800e8SDoug Rabson 	exit(1);
2282c19800e8SDoug Rabson     if(check(assignment) == 0) {
2283c19800e8SDoug Rabson 	cfile = fopen(cname, "w");
2284c19800e8SDoug Rabson 	if(cfile == NULL)
2285c19800e8SDoug Rabson 	  err(1, "%s", cname);
2286c19800e8SDoug Rabson 	hfile = fopen(hname, "w");
2287c19800e8SDoug Rabson 	if(hfile == NULL)
2288c19800e8SDoug Rabson 	  err(1, "%s", hname);
2289c19800e8SDoug Rabson 	gen(assignment);
2290c19800e8SDoug Rabson 	fclose(cfile);
2291c19800e8SDoug Rabson 	fclose(hfile);
2292c19800e8SDoug Rabson     }
2293c19800e8SDoug Rabson     fclose(yyin);
2294c19800e8SDoug Rabson     return 0;
2295c19800e8SDoug Rabson }
2296c19800e8SDoug Rabson 
2297