1/*	$OpenBSD: skeleton.c,v 1.40 2021/02/03 01:10:10 deraadt Exp $	*/
2/*	$NetBSD: skeleton.c,v 1.10 1996/03/25 00:36:18 mrg Exp $	*/
3
4/*
5 * Copyright (c) 1989 The Regents of the University of California.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to Berkeley by
9 * Robert Paul Corbett.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 *    notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 *    notice, this list of conditions and the following disclaimer in the
18 *    documentation and/or other materials provided with the distribution.
19 * 3. Neither the name of the University nor the names of its contributors
20 *    may be used to endorse or promote products derived from this software
21 *    without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36#include "defs.h"
37
38/*  The definition of yysccsid in the banner should be replaced with	*/
39/*  a #pragma ident directive if the target C compiler supports		*/
40/*  #pragma ident directives.						*/
41/*									*/
42/*  If the skeleton is changed, the banner should be changed so that	*/
43/*  the altered version can be easily distinguished from the original.	*/
44/*									*/
45/*  The #defines included with the banner are there because they are	*/
46/*  useful in subsequent code.  The macros #defined in the header or	*/
47/*  the body either are not useful outside of semantic actions or	*/
48/*  are conditional.							*/
49
50char *banner[] =
51{
52	"#include <stdlib.h>",
53	"#include <string.h>",
54	"#define YYBYACC 1",
55	"#define YYMAJOR 1",
56	"#define YYMINOR 9",
57	"#define YYLEX yylex()",
58	"#define YYEMPTY -1",
59	"#define yyclearin (yychar=(YYEMPTY))",
60	"#define yyerrok (yyerrflag=0)",
61	"#define YYRECOVERING() (yyerrflag!=0)",
62	NULL
63};
64
65
66char *tables[] =
67{
68	"extern const short yylhs[];",
69	"extern const short yylen[];",
70	"extern const short yydefred[];",
71	"extern const short yydgoto[];",
72	"extern const short yysindex[];",
73	"extern const short yyrindex[];",
74	"extern const short yygindex[];",
75	"extern const short yytable[];",
76	"extern const short yycheck[];",
77	"#if YYDEBUG",
78	"extern const char *const yyname[];",
79	"extern const char *const yyrule[];",
80	"#endif",
81	NULL
82};
83
84
85char *header[] =
86{
87	"#ifdef YYSTACKSIZE",
88	"#undef YYMAXDEPTH",
89	"#define YYMAXDEPTH YYSTACKSIZE",
90	"#else",
91	"#ifdef YYMAXDEPTH",
92	"#define YYSTACKSIZE YYMAXDEPTH",
93	"#else",
94	"#define YYSTACKSIZE 10000",
95	"#define YYMAXDEPTH 10000",
96	"#endif",
97	"#endif",
98	"#define YYINITSTACKSIZE 200",
99	"/* LINTUSED */",
100	"int yydebug;",
101	"int yynerrs;",
102	"int yyerrflag;",
103	"int yychar;",
104	"short *yyssp;",
105	"YYSTYPE *yyvsp;",
106	"YYSTYPE yyval;",
107	"YYSTYPE yylval;",
108	"short *yyss;",
109	"short *yysslim;",
110	"YYSTYPE *yyvs;",
111	"unsigned int yystacksize;",
112	"int yyparse(void);",
113	NULL
114};
115
116
117char *body[] =
118{
119	"/* allocate initial stack or double stack size, up to YYMAXDEPTH */",
120	"static int yygrowstack(void)",
121	"{",
122	"    unsigned int newsize;",
123	"    long sslen;",
124	"    short *newss;",
125	"    YYSTYPE *newvs;",
126	"",
127	"    if ((newsize = yystacksize) == 0)",
128	"        newsize = YYINITSTACKSIZE;",
129	"    else if (newsize >= YYMAXDEPTH)",
130	"        return -1;",
131	"    else if ((newsize *= 2) > YYMAXDEPTH)",
132	"        newsize = YYMAXDEPTH;",
133	"    sslen = yyssp - yyss;",
134	"#ifdef SIZE_MAX",
135	"#define YY_SIZE_MAX SIZE_MAX",
136	"#else",
137	"#define YY_SIZE_MAX 0xffffffffU",
138	"#endif",
139	"    if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)",
140	"        goto bail;",
141	"    newss = (short *)realloc(yyss, newsize * sizeof *newss);",
142	"    if (newss == NULL)",
143	"        goto bail;",
144	"    yyss = newss;",
145	"    yyssp = newss + sslen;",
146	"    if (newsize && YY_SIZE_MAX / newsize < sizeof *newvs)",
147	"        goto bail;",
148	"    newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs);",
149	"    if (newvs == NULL)",
150	"        goto bail;",
151	"    yyvs = newvs;",
152	"    yyvsp = newvs + sslen;",
153	"    yystacksize = newsize;",
154	"    yysslim = yyss + newsize - 1;",
155	"    return 0;",
156	"bail:",
157	"    if (yyss)",
158	"            free(yyss);",
159	"    if (yyvs)",
160	"            free(yyvs);",
161	"    yyss = yyssp = NULL;",
162	"    yyvs = yyvsp = NULL;",
163	"    yystacksize = 0;",
164	"    return -1;",
165	"}",
166	"",
167	"#define YYABORT goto yyabort",
168	"#define YYREJECT goto yyabort",
169	"#define YYACCEPT goto yyaccept",
170	"#define YYERROR goto yyerrlab",
171	"int",
172	"yyparse(void)",
173	"{",
174	"    int yym, yyn, yystate;",
175	"#if YYDEBUG",
176	"    const char *yys;",
177	"",
178	"    if ((yys = getenv(\"YYDEBUG\")))",
179	"    {",
180	"        yyn = *yys;",
181	"        if (yyn >= '0' && yyn <= '9')",
182	"            yydebug = yyn - '0';",
183	"    }",
184	"#endif /* YYDEBUG */",
185	"",
186	"    yynerrs = 0;",
187	"    yyerrflag = 0;",
188	"    yychar = (-1);",
189	"",
190	"    if (yyss == NULL && yygrowstack()) goto yyoverflow;",
191	"    yyssp = yyss;",
192	"    yyvsp = yyvs;",
193	"    *yyssp = yystate = 0;",
194	"",
195	"yyloop:",
196	"    if ((yyn = yydefred[yystate]) != 0) goto yyreduce;",
197	"    if (yychar < 0)",
198	"    {",
199	"        if ((yychar = yylex()) < 0) yychar = 0;",
200	"#if YYDEBUG",
201	"        if (yydebug)",
202	"        {",
203	"            yys = 0;",
204	"            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
205	"            if (!yys) yys = \"illegal-symbol\";",
206	"            printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
207	"                    YYPREFIX, yystate, yychar, yys);",
208	"        }",
209	"#endif",
210	"    }",
211	"    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&",
212	"            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
213	"    {",
214	"#if YYDEBUG",
215	"        if (yydebug)",
216	"            printf(\"%sdebug: state %d, shifting to state %d\\n\",",
217	"                    YYPREFIX, yystate, yytable[yyn]);",
218	"#endif",
219	"        if (yyssp >= yysslim && yygrowstack())",
220	"        {",
221	"            goto yyoverflow;",
222	"        }",
223	"        *++yyssp = yystate = yytable[yyn];",
224	"        *++yyvsp = yylval;",
225	"        yychar = (-1);",
226	"        if (yyerrflag > 0)  --yyerrflag;",
227	"        goto yyloop;",
228	"    }",
229	"    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&",
230	"            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)",
231	"    {",
232	"        yyn = yytable[yyn];",
233	"        goto yyreduce;",
234	"    }",
235	"    if (yyerrflag) goto yyinrecovery;",
236	"#if defined(__GNUC__)",
237	"    goto yynewerror;",
238	"#endif",
239	"yynewerror:",
240	"    yyerror(\"syntax error\");",
241	"#if defined(__GNUC__)",
242	"    goto yyerrlab;",
243	"#endif",
244	"yyerrlab:",
245	"    ++yynerrs;",
246	"yyinrecovery:",
247	"    if (yyerrflag < 3)",
248	"    {",
249	"        yyerrflag = 3;",
250	"        for (;;)",
251	"        {",
252	"            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&",
253	"                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)",
254	"            {",
255	"#if YYDEBUG",
256	"                if (yydebug)",
257	"                    printf(\"%sdebug: state %d, error recovery shifting\\",
258	" to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);",
259	"#endif",
260	"                if (yyssp >= yysslim && yygrowstack())",
261	"                {",
262	"                    goto yyoverflow;",
263	"                }",
264	"                *++yyssp = yystate = yytable[yyn];",
265	"                *++yyvsp = yylval;",
266	"                goto yyloop;",
267	"            }",
268	"            else",
269	"            {",
270	"#if YYDEBUG",
271	"                if (yydebug)",
272	"                    printf(\"%sdebug: error recovery discarding state %d\
273\\n\",",
274	"                            YYPREFIX, *yyssp);",
275	"#endif",
276	"                if (yyssp <= yyss) goto yyabort;",
277	"                --yyssp;",
278	"                --yyvsp;",
279	"            }",
280	"        }",
281	"    }",
282	"    else",
283	"    {",
284	"        if (yychar == 0) goto yyabort;",
285	"#if YYDEBUG",
286	"        if (yydebug)",
287	"        {",
288	"            yys = 0;",
289	"            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
290	"            if (!yys) yys = \"illegal-symbol\";",
291	"            printf(\"%sdebug: state %d, error recovery discards token %d\
292 (%s)\\n\",",
293	"                    YYPREFIX, yystate, yychar, yys);",
294	"        }",
295	"#endif",
296	"        yychar = (-1);",
297	"        goto yyloop;",
298	"    }",
299	"yyreduce:",
300	"#if YYDEBUG",
301	"    if (yydebug)",
302	"        printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",",
303	"                YYPREFIX, yystate, yyn, yyrule[yyn]);",
304	"#endif",
305	"    yym = yylen[yyn];",
306	"    if (yym)",
307	"        yyval = yyvsp[1-yym];",
308	"    else",
309	"        memset(&yyval, 0, sizeof yyval);",
310	"    switch (yyn)",
311	"    {",
312	NULL
313};
314
315
316char *trailer[] =
317{
318	"    }",
319	"    yyssp -= yym;",
320	"    yystate = *yyssp;",
321	"    yyvsp -= yym;",
322	"    yym = yylhs[yyn];",
323	"    if (yystate == 0 && yym == 0)",
324	"    {",
325	"#if YYDEBUG",
326	"        if (yydebug)",
327	"            printf(\"%sdebug: after reduction, shifting from state 0 to\\",
328	" state %d\\n\", YYPREFIX, YYFINAL);",
329	"#endif",
330	"        yystate = YYFINAL;",
331	"        *++yyssp = YYFINAL;",
332	"        *++yyvsp = yyval;",
333	"        if (yychar < 0)",
334	"        {",
335	"            if ((yychar = yylex()) < 0) yychar = 0;",
336	"#if YYDEBUG",
337	"            if (yydebug)",
338	"            {",
339	"                yys = 0;",
340	"                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];",
341	"                if (!yys) yys = \"illegal-symbol\";",
342	"                printf(\"%sdebug: state %d, reading %d (%s)\\n\",",
343	"                        YYPREFIX, YYFINAL, yychar, yys);",
344	"            }",
345	"#endif",
346	"        }",
347	"        if (yychar == 0) goto yyaccept;",
348	"        goto yyloop;",
349	"    }",
350	"    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&",
351	"            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)",
352	"        yystate = yytable[yyn];",
353	"    else",
354	"        yystate = yydgoto[yym];",
355	"#if YYDEBUG",
356	"    if (yydebug)",
357	"        printf(\"%sdebug: after reduction, shifting from state %d \\",
358	"to state %d\\n\", YYPREFIX, *yyssp, yystate);",
359	"#endif",
360	"    if (yyssp >= yysslim && yygrowstack())",
361	"    {",
362	"        goto yyoverflow;",
363	"    }",
364	"    *++yyssp = yystate;",
365	"    *++yyvsp = yyval;",
366	"    goto yyloop;",
367	"yyoverflow:",
368	"    yyerror(\"yacc stack overflow\");",
369	"yyabort:",
370	"    if (yyss)",
371	"            free(yyss);",
372	"    if (yyvs)",
373	"            free(yyvs);",
374	"    yyss = yyssp = NULL;",
375	"    yyvs = yyvsp = NULL;",
376	"    yystacksize = 0;",
377	"    return (1);",
378	"yyaccept:",
379	"    if (yyss)",
380	"            free(yyss);",
381	"    if (yyvs)",
382	"            free(yyvs);",
383	"    yyss = yyssp = NULL;",
384	"    yyvs = yyvsp = NULL;",
385	"    yystacksize = 0;",
386	"    return (0);",
387	"}",
388	NULL
389};
390
391
392void
393write_section(char *section[])
394{
395	int i;
396	char *s;
397
398	for (i = 0; (s = section[i]); ++i) {
399		++outline;
400		fputs(s, code_file);
401		putc('\n', code_file);
402	}
403}
404