skeleton.c (11766B)
1 /* $OpenBSD: skeleton.c,v 1.35 2014/03/16 18:38:30 guenther 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 50 char *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 66 char *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 85 char *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 NULL 113 }; 114 115 116 char *body[] = 117 { 118 "/* allocate initial stack or double stack size, up to YYMAXDEPTH */", 119 "static int yygrowstack(void)", 120 "{", 121 " unsigned int newsize;", 122 " long sslen;", 123 " short *newss;", 124 " YYSTYPE *newvs;", 125 "", 126 " if ((newsize = yystacksize) == 0)", 127 " newsize = YYINITSTACKSIZE;", 128 " else if (newsize >= YYMAXDEPTH)", 129 " return -1;", 130 " else if ((newsize *= 2) > YYMAXDEPTH)", 131 " newsize = YYMAXDEPTH;", 132 " sslen = yyssp - yyss;", 133 "#ifdef SIZE_MAX", 134 "#define YY_SIZE_MAX SIZE_MAX", 135 "#else", 136 "#define YY_SIZE_MAX 0xffffffffU", 137 "#endif", 138 " if (newsize && YY_SIZE_MAX / newsize < sizeof *newss)", 139 " goto bail;", 140 " newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :", 141 " (short *)malloc(newsize * sizeof *newss); /* overflow check above */", 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 = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :", 149 " (YYSTYPE *)malloc(newsize * sizeof *newvs); /* overflow check above */", 150 " if (newvs == NULL)", 151 " goto bail;", 152 " yyvs = newvs;", 153 " yyvsp = newvs + sslen;", 154 " yystacksize = newsize;", 155 " yysslim = yyss + newsize - 1;", 156 " return 0;", 157 "bail:", 158 " if (yyss)", 159 " free(yyss);", 160 " if (yyvs)", 161 " free(yyvs);", 162 " yyss = yyssp = NULL;", 163 " yyvs = yyvsp = NULL;", 164 " yystacksize = 0;", 165 " return -1;", 166 "}", 167 "", 168 "#define YYABORT goto yyabort", 169 "#define YYREJECT goto yyabort", 170 "#define YYACCEPT goto yyaccept", 171 "#define YYERROR goto yyerrlab", 172 "int", 173 "yyparse(void)", 174 "{", 175 " int yym, yyn, yystate;", 176 "#if YYDEBUG", 177 " const char *yys;", 178 "", 179 " if ((yys = getenv(\"YYDEBUG\")))", 180 " {", 181 " yyn = *yys;", 182 " if (yyn >= '0' && yyn <= '9')", 183 " yydebug = yyn - '0';", 184 " }", 185 "#endif /* YYDEBUG */", 186 "", 187 " yynerrs = 0;", 188 " yyerrflag = 0;", 189 " yychar = (-1);", 190 "", 191 " if (yyss == NULL && yygrowstack()) goto yyoverflow;", 192 " yyssp = yyss;", 193 " yyvsp = yyvs;", 194 " *yyssp = yystate = 0;", 195 "", 196 "yyloop:", 197 " if ((yyn = yydefred[yystate]) != 0) goto yyreduce;", 198 " if (yychar < 0)", 199 " {", 200 " if ((yychar = yylex()) < 0) yychar = 0;", 201 "#if YYDEBUG", 202 " if (yydebug)", 203 " {", 204 " yys = 0;", 205 " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", 206 " if (!yys) yys = \"illegal-symbol\";", 207 " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", 208 " YYPREFIX, yystate, yychar, yys);", 209 " }", 210 "#endif", 211 " }", 212 " if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&", 213 " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", 214 " {", 215 "#if YYDEBUG", 216 " if (yydebug)", 217 " printf(\"%sdebug: state %d, shifting to state %d\\n\",", 218 " YYPREFIX, yystate, yytable[yyn]);", 219 "#endif", 220 " if (yyssp >= yysslim && yygrowstack())", 221 " {", 222 " goto yyoverflow;", 223 " }", 224 " *++yyssp = yystate = yytable[yyn];", 225 " *++yyvsp = yylval;", 226 " yychar = (-1);", 227 " if (yyerrflag > 0) --yyerrflag;", 228 " goto yyloop;", 229 " }", 230 " if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&", 231 " yyn <= YYTABLESIZE && yycheck[yyn] == yychar)", 232 " {", 233 " yyn = yytable[yyn];", 234 " goto yyreduce;", 235 " }", 236 " if (yyerrflag) goto yyinrecovery;", 237 "#if defined(__GNUC__)", 238 " goto yynewerror;", 239 "#endif", 240 "yynewerror:", 241 " yyerror(\"syntax error\");", 242 "#if defined(__GNUC__)", 243 " goto yyerrlab;", 244 "#endif", 245 "yyerrlab:", 246 " ++yynerrs;", 247 "yyinrecovery:", 248 " if (yyerrflag < 3)", 249 " {", 250 " yyerrflag = 3;", 251 " for (;;)", 252 " {", 253 " if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&", 254 " yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)", 255 " {", 256 "#if YYDEBUG", 257 " if (yydebug)", 258 " printf(\"%sdebug: state %d, error recovery shifting\\", 259 " to state %d\\n\", YYPREFIX, *yyssp, yytable[yyn]);", 260 "#endif", 261 " if (yyssp >= yysslim && yygrowstack())", 262 " {", 263 " goto yyoverflow;", 264 " }", 265 " *++yyssp = yystate = yytable[yyn];", 266 " *++yyvsp = yylval;", 267 " goto yyloop;", 268 " }", 269 " else", 270 " {", 271 "#if YYDEBUG", 272 " if (yydebug)", 273 " printf(\"%sdebug: error recovery discarding state %d\ 274 \\n\",", 275 " YYPREFIX, *yyssp);", 276 "#endif", 277 " if (yyssp <= yyss) goto yyabort;", 278 " --yyssp;", 279 " --yyvsp;", 280 " }", 281 " }", 282 " }", 283 " else", 284 " {", 285 " if (yychar == 0) goto yyabort;", 286 "#if YYDEBUG", 287 " if (yydebug)", 288 " {", 289 " yys = 0;", 290 " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", 291 " if (!yys) yys = \"illegal-symbol\";", 292 " printf(\"%sdebug: state %d, error recovery discards token %d\ 293 (%s)\\n\",", 294 " YYPREFIX, yystate, yychar, yys);", 295 " }", 296 "#endif", 297 " yychar = (-1);", 298 " goto yyloop;", 299 " }", 300 "yyreduce:", 301 "#if YYDEBUG", 302 " if (yydebug)", 303 " printf(\"%sdebug: state %d, reducing by rule %d (%s)\\n\",", 304 " YYPREFIX, yystate, yyn, yyrule[yyn]);", 305 "#endif", 306 " yym = yylen[yyn];", 307 " if (yym)", 308 " yyval = yyvsp[1-yym];", 309 " else", 310 " memset(&yyval, 0, sizeof yyval);", 311 " switch (yyn)", 312 " {", 313 NULL 314 }; 315 316 317 char *trailer[] = 318 { 319 " }", 320 " yyssp -= yym;", 321 " yystate = *yyssp;", 322 " yyvsp -= yym;", 323 " yym = yylhs[yyn];", 324 " if (yystate == 0 && yym == 0)", 325 " {", 326 "#if YYDEBUG", 327 " if (yydebug)", 328 " printf(\"%sdebug: after reduction, shifting from state 0 to\\", 329 " state %d\\n\", YYPREFIX, YYFINAL);", 330 "#endif", 331 " yystate = YYFINAL;", 332 " *++yyssp = YYFINAL;", 333 " *++yyvsp = yyval;", 334 " if (yychar < 0)", 335 " {", 336 " if ((yychar = yylex()) < 0) yychar = 0;", 337 "#if YYDEBUG", 338 " if (yydebug)", 339 " {", 340 " yys = 0;", 341 " if (yychar <= YYMAXTOKEN) yys = yyname[yychar];", 342 " if (!yys) yys = \"illegal-symbol\";", 343 " printf(\"%sdebug: state %d, reading %d (%s)\\n\",", 344 " YYPREFIX, YYFINAL, yychar, yys);", 345 " }", 346 "#endif", 347 " }", 348 " if (yychar == 0) goto yyaccept;", 349 " goto yyloop;", 350 " }", 351 " if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&", 352 " yyn <= YYTABLESIZE && yycheck[yyn] == yystate)", 353 " yystate = yytable[yyn];", 354 " else", 355 " yystate = yydgoto[yym];", 356 "#if YYDEBUG", 357 " if (yydebug)", 358 " printf(\"%sdebug: after reduction, shifting from state %d \\", 359 "to state %d\\n\", YYPREFIX, *yyssp, yystate);", 360 "#endif", 361 " if (yyssp >= yysslim && yygrowstack())", 362 " {", 363 " goto yyoverflow;", 364 " }", 365 " *++yyssp = yystate;", 366 " *++yyvsp = yyval;", 367 " goto yyloop;", 368 "yyoverflow:", 369 " yyerror(\"yacc stack overflow\");", 370 "yyabort:", 371 " if (yyss)", 372 " free(yyss);", 373 " if (yyvs)", 374 " free(yyvs);", 375 " yyss = yyssp = NULL;", 376 " yyvs = yyvsp = NULL;", 377 " yystacksize = 0;", 378 " return (1);", 379 "yyaccept:", 380 " if (yyss)", 381 " free(yyss);", 382 " if (yyvs)", 383 " free(yyvs);", 384 " yyss = yyssp = NULL;", 385 " yyvs = yyvsp = NULL;", 386 " yystacksize = 0;", 387 " return (0);", 388 "}", 389 NULL 390 }; 391 392 393 void 394 write_section(char *section[]) 395 { 396 int i; 397 char *s; 398 399 for (i = 0; (s = section[i]); ++i) { 400 ++outline; 401 fputs(s, code_file); 402 putc('\n', code_file); 403 } 404 }