1 /* original parser id follows */ 2 /* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */ 3 /* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */ 4 5 #define YYBYACC 1 6 #define YYMAJOR 1 7 #define YYMINOR 9 8 #define YYCHECK "yyyymmdd" 9 10 #define YYEMPTY (-1) 11 #define yyclearin (yychar = YYEMPTY) 12 #define yyerrok (yyerrflag = 0) 13 #define YYRECOVERING() (yyerrflag != 0) 14 #define YYENOMEM (-2) 15 #define YYEOF 0 16 17 #ifndef yyparse 18 #define yyparse grammar_parse 19 #endif /* yyparse */ 20 21 #ifndef yylex 22 #define yylex grammar_lex 23 #endif /* yylex */ 24 25 #ifndef yyerror 26 #define yyerror grammar_error 27 #endif /* yyerror */ 28 29 #ifndef yychar 30 #define yychar grammar_char 31 #endif /* yychar */ 32 33 #ifndef yyval 34 #define yyval grammar_val 35 #endif /* yyval */ 36 37 #ifndef yylval 38 #define yylval grammar_lval 39 #endif /* yylval */ 40 41 #ifndef yydebug 42 #define yydebug grammar_debug 43 #endif /* yydebug */ 44 45 #ifndef yynerrs 46 #define yynerrs grammar_nerrs 47 #endif /* yynerrs */ 48 49 #ifndef yyerrflag 50 #define yyerrflag grammar_errflag 51 #endif /* yyerrflag */ 52 53 #ifndef yylhs 54 #define yylhs grammar_lhs 55 #endif /* yylhs */ 56 57 #ifndef yylen 58 #define yylen grammar_len 59 #endif /* yylen */ 60 61 #ifndef yydefred 62 #define yydefred grammar_defred 63 #endif /* yydefred */ 64 65 #ifndef yydgoto 66 #define yydgoto grammar_dgoto 67 #endif /* yydgoto */ 68 69 #ifndef yysindex 70 #define yysindex grammar_sindex 71 #endif /* yysindex */ 72 73 #ifndef yyrindex 74 #define yyrindex grammar_rindex 75 #endif /* yyrindex */ 76 77 #ifndef yygindex 78 #define yygindex grammar_gindex 79 #endif /* yygindex */ 80 81 #ifndef yytable 82 #define yytable grammar_table 83 #endif /* yytable */ 84 85 #ifndef yycheck 86 #define yycheck grammar_check 87 #endif /* yycheck */ 88 89 #ifndef yyname 90 #define yyname grammar_name 91 #endif /* yyname */ 92 93 #ifndef yyrule 94 #define yyrule grammar_rule 95 #endif /* yyrule */ 96 #define YYPREFIX "grammar_" 97 98 #define YYPURE 0 99 100 #line 9 "grammar.y" 101 #ifdef YYBISON 102 #include <stdlib.h> 103 #define YYSTYPE_IS_DECLARED 104 #define yyerror yaccError 105 #endif 106 107 #if defined(YYBISON) || !defined(YYBYACC) 108 static void yyerror(const char *s); 109 #endif 110 #line 81 "grammar.y" 111 #include <stdio.h> 112 #include <ctype.h> 113 #include <string.h> 114 115 #define OPT_LINTLIBRARY 1 116 117 #ifndef TRUE 118 #define TRUE (1) 119 #endif 120 121 #ifndef FALSE 122 #define FALSE (0) 123 #endif 124 125 /* #include "cproto.h" */ 126 #define MAX_TEXT_SIZE 1024 127 128 /* Prototype styles */ 129 #if OPT_LINTLIBRARY 130 #define PROTO_ANSI_LLIB -2 /* form ANSI lint-library source */ 131 #define PROTO_LINTLIBRARY -1 /* form lint-library source */ 132 #endif 133 #define PROTO_NONE 0 /* do not output any prototypes */ 134 #define PROTO_TRADITIONAL 1 /* comment out parameters */ 135 #define PROTO_ABSTRACT 2 /* comment out parameter names */ 136 #define PROTO_ANSI 3 /* ANSI C prototype */ 137 138 typedef int PrototypeStyle; 139 140 typedef char boolean; 141 142 extern boolean types_out; 143 extern PrototypeStyle proto_style; 144 145 #define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB) 146 #define knrLintLibrary() (proto_style == PROTO_LINTLIBRARY) 147 #define lintLibrary() (knrLintLibrary() || ansiLintLibrary()) 148 149 #if OPT_LINTLIBRARY 150 #define FUNC_UNKNOWN -1 /* unspecified */ 151 #else 152 #define FUNC_UNKNOWN 0 /* unspecified (same as FUNC_NONE) */ 153 #endif 154 #define FUNC_NONE 0 /* not a function definition */ 155 #define FUNC_TRADITIONAL 1 /* traditional style */ 156 #define FUNC_ANSI 2 /* ANSI style */ 157 #define FUNC_BOTH 3 /* both styles */ 158 159 typedef int FuncDefStyle; 160 161 /* Source file text */ 162 typedef struct text { 163 char text[MAX_TEXT_SIZE]; /* source text */ 164 long begin; /* offset in temporary file */ 165 } Text; 166 167 /* Declaration specifier flags */ 168 #define DS_NONE 0 /* default */ 169 #define DS_EXTERN 1 /* contains "extern" specifier */ 170 #define DS_STATIC 2 /* contains "static" specifier */ 171 #define DS_CHAR 4 /* contains "char" type specifier */ 172 #define DS_SHORT 8 /* contains "short" type specifier */ 173 #define DS_FLOAT 16 /* contains "float" type specifier */ 174 #define DS_INLINE 32 /* contains "inline" specifier */ 175 #define DS_JUNK 64 /* we're not interested in this declaration */ 176 177 /* This structure stores information about a declaration specifier. */ 178 typedef struct decl_spec { 179 unsigned short flags; /* flags defined above */ 180 char *text; /* source text */ 181 long begin; /* offset in temporary file */ 182 } DeclSpec; 183 184 /* This is a list of function parameters. */ 185 typedef struct _ParameterList { 186 struct parameter *first; /* pointer to first parameter in list */ 187 struct parameter *last; /* pointer to last parameter in list */ 188 long begin_comment; /* begin offset of comment */ 189 long end_comment; /* end offset of comment */ 190 char *comment; /* comment at start of parameter list */ 191 } ParameterList; 192 193 /* This structure stores information about a declarator. */ 194 typedef struct _Declarator { 195 char *name; /* name of variable or function */ 196 char *text; /* source text */ 197 long begin; /* offset in temporary file */ 198 long begin_comment; /* begin offset of comment */ 199 long end_comment; /* end offset of comment */ 200 FuncDefStyle func_def; /* style of function definition */ 201 ParameterList params; /* function parameters */ 202 boolean pointer; /* TRUE if it declares a pointer */ 203 struct _Declarator *head; /* head function declarator */ 204 struct _Declarator *func_stack; /* stack of function declarators */ 205 struct _Declarator *next; /* next declarator in list */ 206 } Declarator; 207 208 /* This structure stores information about a function parameter. */ 209 typedef struct parameter { 210 struct parameter *next; /* next parameter in list */ 211 DeclSpec decl_spec; 212 Declarator *declarator; 213 char *comment; /* comment following the parameter */ 214 } Parameter; 215 216 /* This is a list of declarators. */ 217 typedef struct declarator_list { 218 Declarator *first; /* pointer to first declarator in list */ 219 Declarator *last; /* pointer to last declarator in list */ 220 } DeclaratorList; 221 222 /* #include "symbol.h" */ 223 typedef struct symbol { 224 struct symbol *next; /* next symbol in list */ 225 char *name; /* name of symbol */ 226 char *value; /* value of symbol (for defines) */ 227 short flags; /* symbol attributes */ 228 } Symbol; 229 230 /* parser stack entry type */ 231 typedef union { 232 Text text; 233 DeclSpec decl_spec; 234 Parameter *parameter; 235 ParameterList param_list; 236 Declarator *declarator; 237 DeclaratorList decl_list; 238 } YYSTYPE; 239 240 /* The hash table length should be a prime number. */ 241 #define SYM_MAX_HASH 251 242 243 typedef struct symbol_table { 244 Symbol *bucket[SYM_MAX_HASH]; /* hash buckets */ 245 } SymbolTable; 246 247 extern SymbolTable *new_symbol_table /* Create symbol table */ 248 (void); 249 extern void free_symbol_table /* Destroy symbol table */ 250 (SymbolTable *s); 251 extern Symbol *find_symbol /* Lookup symbol name */ 252 (SymbolTable *s, const char *n); 253 extern Symbol *new_symbol /* Define new symbol */ 254 (SymbolTable *s, const char *n, const char *v, int f); 255 256 /* #include "semantic.h" */ 257 extern void new_decl_spec (DeclSpec *, const char *, long, int); 258 extern void free_decl_spec (DeclSpec *); 259 extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *); 260 extern void check_untagged (DeclSpec *); 261 extern Declarator *new_declarator (const char *, const char *, long); 262 extern void free_declarator (Declarator *); 263 extern void new_decl_list (DeclaratorList *, Declarator *); 264 extern void free_decl_list (DeclaratorList *); 265 extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *); 266 extern Parameter *new_parameter (DeclSpec *, Declarator *); 267 extern void free_parameter (Parameter *); 268 extern void new_param_list (ParameterList *, Parameter *); 269 extern void free_param_list (ParameterList *); 270 extern void add_param_list (ParameterList *, ParameterList *, Parameter *); 271 extern void new_ident_list (ParameterList *); 272 extern void add_ident_list (ParameterList *, ParameterList *, const char *); 273 extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *); 274 extern void gen_declarations (DeclSpec *, DeclaratorList *); 275 extern void gen_prototype (DeclSpec *, Declarator *); 276 extern void gen_func_declarator (Declarator *); 277 extern void gen_func_definition (DeclSpec *, Declarator *); 278 279 extern void init_parser (void); 280 extern void process_file (FILE *infile, char *name); 281 extern char *cur_text (void); 282 extern char *cur_file_name (void); 283 extern char *implied_typedef (void); 284 extern void include_file (char *name, int convert); 285 extern char *supply_parm (int count); 286 extern char *xstrdup (const char *); 287 extern int already_declared (char *name); 288 extern int is_actual_func (Declarator *d); 289 extern int lint_ellipsis (Parameter *p); 290 extern int want_typedef (void); 291 extern void begin_tracking (void); 292 extern void begin_typedef (void); 293 extern void copy_typedef (char *s); 294 extern void ellipsis_varargs (Declarator *d); 295 extern void end_typedef (void); 296 extern void flush_varargs (void); 297 extern void fmt_library (int code); 298 extern void imply_typedef (const char *s); 299 extern void indent (FILE *outf); 300 extern void put_blankline (FILE *outf); 301 extern void put_body (FILE *outf, DeclSpec *decl_spec, Declarator *declarator); 302 extern void put_char (FILE *outf, int c); 303 extern void put_error (void); 304 extern void put_newline (FILE *outf); 305 extern void put_padded (FILE *outf, const char *s); 306 extern void put_string (FILE *outf, const char *s); 307 extern void track_in (void); 308 309 extern boolean file_comments; 310 extern FuncDefStyle func_style; 311 extern char base_file[]; 312 313 extern int yylex (void); 314 315 /* declaration specifier attributes for the typedef statement currently being 316 * scanned 317 */ 318 static int cur_decl_spec_flags; 319 320 /* pointer to parameter list for the current function definition */ 321 static ParameterList *func_params; 322 323 /* A parser semantic action sets this pointer to the current declarator in 324 * a function parameter declaration in order to catch any comments following 325 * the parameter declaration on the same line. If the lexer scans a comment 326 * and <cur_declarator> is not NULL, then the comment is attached to the 327 * declarator. To ignore subsequent comments, the lexer sets this to NULL 328 * after scanning a comment or end of line. 329 */ 330 static Declarator *cur_declarator; 331 332 /* temporary string buffer */ 333 static char buf[MAX_TEXT_SIZE]; 334 335 /* table of typedef names */ 336 static SymbolTable *typedef_names; 337 338 /* table of define names */ 339 static SymbolTable *define_names; 340 341 /* table of type qualifiers */ 342 static SymbolTable *type_qualifiers; 343 344 /* information about the current input file */ 345 typedef struct { 346 char *base_name; /* base input file name */ 347 char *file_name; /* current file name */ 348 FILE *file; /* input file */ 349 unsigned line_num; /* current line number in input file */ 350 FILE *tmp_file; /* temporary file */ 351 long begin_comment; /* tmp file offset after last written ) or ; */ 352 long end_comment; /* tmp file offset after last comment */ 353 boolean convert; /* if TRUE, convert function definitions */ 354 boolean changed; /* TRUE if conversion done in this file */ 355 } IncludeStack; 356 357 static IncludeStack *cur_file; /* current input file */ 358 359 /* #include "yyerror.c" */ 360 361 static int haveAnsiParam (void); 362 363 364 /* Flags to enable us to find if a procedure returns a value. 365 */ 366 static int return_val; /* nonzero on BRACES iff return-expression found */ 367 368 static const char * 369 dft_decl_spec (void) 370 { 371 return (lintLibrary() && !return_val) ? "void" : "int"; 372 } 373 374 static int 375 haveAnsiParam (void) 376 { 377 Parameter *p; 378 if (func_params != 0) { 379 for (p = func_params->first; p != 0; p = p->next) { 380 if (p->declarator->func_def == FUNC_ANSI) { 381 return TRUE; 382 } 383 } 384 } 385 return FALSE; 386 } 387 #line 388 "grammar.tab.c" 388 389 /* compatibility with bison */ 390 #ifdef YYPARSE_PARAM 391 /* compatibility with FreeBSD */ 392 # ifdef YYPARSE_PARAM_TYPE 393 # define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) 394 # else 395 # define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) 396 # endif 397 #else 398 # define YYPARSE_DECL() yyparse(void) 399 #endif 400 401 /* Parameters sent to lex. */ 402 #ifdef YYLEX_PARAM 403 # define YYLEX_DECL() yylex(void *YYLEX_PARAM) 404 # define YYLEX yylex(YYLEX_PARAM) 405 #else 406 # define YYLEX_DECL() yylex(void) 407 # define YYLEX yylex() 408 #endif 409 410 /* Parameters sent to yyerror. */ 411 #ifndef YYERROR_DECL 412 #define YYERROR_DECL() yyerror(const char *s) 413 #endif 414 #ifndef YYERROR_CALL 415 #define YYERROR_CALL(msg) yyerror(msg) 416 #endif 417 418 extern int YYPARSE_DECL(); 419 420 #define T_IDENTIFIER 257 421 #define T_TYPEDEF_NAME 258 422 #define T_DEFINE_NAME 259 423 #define T_AUTO 260 424 #define T_EXTERN 261 425 #define T_REGISTER 262 426 #define T_STATIC 263 427 #define T_TYPEDEF 264 428 #define T_INLINE 265 429 #define T_EXTENSION 266 430 #define T_CHAR 267 431 #define T_DOUBLE 268 432 #define T_FLOAT 269 433 #define T_INT 270 434 #define T_VOID 271 435 #define T_LONG 272 436 #define T_SHORT 273 437 #define T_SIGNED 274 438 #define T_UNSIGNED 275 439 #define T_ENUM 276 440 #define T_STRUCT 277 441 #define T_UNION 278 442 #define T_Bool 279 443 #define T_Complex 280 444 #define T_Imaginary 281 445 #define T_TYPE_QUALIFIER 282 446 #define T_BRACKETS 283 447 #define T_LBRACE 284 448 #define T_MATCHRBRACE 285 449 #define T_ELLIPSIS 286 450 #define T_INITIALIZER 287 451 #define T_STRING_LITERAL 288 452 #define T_ASM 289 453 #define T_ASMARG 290 454 #define T_VA_DCL 291 455 #define YYERRCODE 256 456 typedef int YYINT; 457 static const YYINT grammar_lhs[] = { -1, 458 0, 0, 26, 26, 27, 27, 27, 27, 27, 27, 459 27, 31, 30, 30, 28, 28, 34, 28, 32, 32, 460 33, 33, 35, 35, 37, 38, 29, 39, 29, 36, 461 36, 36, 40, 40, 1, 1, 2, 2, 2, 3, 462 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 463 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 464 5, 5, 6, 6, 6, 19, 19, 8, 8, 9, 465 41, 9, 7, 7, 7, 25, 23, 23, 10, 10, 466 11, 11, 11, 11, 11, 20, 20, 21, 21, 22, 467 22, 14, 14, 15, 15, 16, 16, 16, 17, 17, 468 18, 18, 24, 24, 12, 12, 12, 13, 13, 13, 469 13, 13, 13, 13, 470 }; 471 static const YYINT grammar_len[] = { 2, 472 0, 1, 1, 2, 1, 1, 1, 1, 3, 2, 473 2, 2, 3, 3, 2, 3, 0, 5, 2, 1, 474 0, 1, 1, 3, 0, 0, 7, 0, 5, 0, 475 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 476 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 477 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 478 1, 1, 3, 2, 2, 1, 1, 1, 3, 1, 479 0, 4, 3, 2, 2, 1, 1, 1, 2, 1, 480 1, 3, 2, 4, 4, 2, 3, 0, 1, 1, 481 2, 1, 3, 1, 3, 2, 2, 1, 0, 1, 482 1, 3, 1, 2, 1, 2, 1, 3, 2, 1, 483 4, 3, 3, 2, 484 }; 485 static const YYINT grammar_defred[] = { 0, 486 0, 0, 0, 0, 77, 0, 62, 40, 0, 42, 487 43, 20, 44, 0, 46, 47, 48, 49, 54, 50, 488 51, 52, 53, 76, 66, 67, 55, 56, 57, 61, 489 0, 7, 0, 0, 35, 37, 38, 39, 59, 60, 490 28, 0, 0, 0, 103, 81, 0, 0, 3, 5, 491 6, 8, 0, 10, 11, 78, 0, 90, 0, 0, 492 104, 0, 19, 0, 41, 45, 15, 36, 0, 68, 493 0, 0, 0, 83, 0, 0, 64, 0, 0, 74, 494 4, 58, 0, 82, 87, 91, 0, 14, 13, 9, 495 16, 0, 71, 0, 31, 33, 0, 0, 0, 0, 496 0, 94, 0, 0, 101, 12, 63, 73, 0, 0, 497 69, 0, 0, 0, 34, 0, 110, 96, 97, 0, 498 0, 84, 0, 85, 0, 23, 0, 0, 72, 26, 499 29, 114, 0, 0, 0, 109, 0, 93, 95, 102, 500 18, 0, 0, 108, 113, 112, 0, 24, 27, 111, 501 }; 502 static const YYINT grammar_dgoto[] = { 33, 503 87, 35, 36, 37, 38, 39, 40, 69, 70, 41, 504 42, 119, 120, 100, 101, 102, 103, 104, 43, 44, 505 59, 60, 45, 46, 47, 48, 49, 50, 51, 52, 506 77, 53, 127, 109, 128, 97, 94, 143, 72, 98, 507 112, 508 }; 509 static const YYINT grammar_sindex[] = { -2, 510 -3, 27, -239, -177, 0, 0, 0, 0, -274, 0, 511 0, 0, 0, -246, 0, 0, 0, 0, 0, 0, 512 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 513 -266, 0, 0, 455, 0, 0, 0, 0, 0, 0, 514 0, -35, -245, 128, 0, 0, -245, -2, 0, 0, 515 0, 0, 642, 0, 0, 0, -15, 0, -12, -239, 516 0, 590, 0, -27, 0, 0, 0, 0, -10, 0, 517 -11, 534, -72, 0, -237, -232, 0, -35, -232, 0, 518 0, 0, 642, 0, 0, 0, 455, 0, 0, 0, 519 0, 27, 0, 534, 0, 0, -222, 617, 209, 34, 520 39, 0, 44, 42, 0, 0, 0, 0, 27, -11, 521 0, -200, -196, -195, 0, 174, 0, 0, 0, -33, 522 243, 0, 561, 0, -177, 0, 33, 49, 0, 0, 523 0, 0, 53, 55, 417, 0, -33, 0, 0, 0, 524 0, 27, -188, 0, 0, 0, 57, 0, 0, 0, 525 }; 526 static const YYINT grammar_rindex[] = { 99, 527 0, 0, 275, 0, 0, -38, 0, 0, 481, 0, 528 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 529 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 530 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 531 0, 30, 0, 0, 0, 0, 0, 101, 0, 0, 532 0, 0, 0, 0, 0, 0, 0, 0, 343, 309, 533 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 534 98, -182, 62, 0, 0, 133, 0, 64, 379, 0, 535 0, 0, -5, 0, 0, 0, 0, 0, 0, 0, 536 0, 0, 0, -182, 0, 0, 0, -180, -19, 0, 537 65, 0, 0, 68, 0, 0, 0, 0, 51, 9, 538 0, 0, 0, 0, 0, 0, 0, 0, 0, -13, 539 19, 0, 0, 0, 0, 0, 0, 52, 0, 0, 540 0, 0, 0, 0, 0, 0, 35, 0, 0, 0, 541 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542 }; 543 static const YYINT grammar_gindex[] = { 0, 544 11, -17, 0, 0, 13, 0, 0, 0, 20, 8, 545 -43, -1, -8, -89, 0, -9, 0, 0, 0, -44, 546 0, 0, 4, 0, 0, 0, 70, -53, 0, 0, 547 -18, 0, 0, 0, 0, 22, 0, 0, 0, 0, 548 0, 549 }; 550 #define YYTABLESIZE 924 551 static const YYINT grammar_table[] = { 58, 552 78, 58, 58, 58, 73, 58, 135, 61, 88, 57, 553 34, 5, 56, 62, 85, 58, 68, 63, 96, 7, 554 58, 98, 78, 64, 98, 84, 134, 107, 80, 3, 555 107, 90, 17, 92, 17, 4, 17, 2, 75, 3, 556 96, 71, 30, 89, 115, 147, 76, 106, 91, 93, 557 79, 75, 70, 17, 121, 55, 32, 107, 34, 105, 558 108, 114, 105, 83, 4, 68, 2, 70, 3, 68, 559 80, 121, 86, 80, 122, 106, 105, 78, 106, 5, 560 56, 68, 123, 99, 124, 125, 129, 130, 80, 131, 561 80, 141, 142, 144, 110, 145, 149, 150, 1, 110, 562 2, 30, 99, 32, 79, 92, 118, 79, 100, 21, 563 22, 111, 137, 139, 133, 113, 126, 81, 0, 0, 564 0, 0, 79, 57, 79, 0, 99, 0, 140, 0, 565 0, 0, 0, 99, 0, 0, 0, 0, 0, 0, 566 0, 70, 0, 0, 0, 99, 0, 0, 0, 148, 567 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 568 0, 0, 0, 0, 0, 4, 0, 2, 0, 0, 569 65, 0, 65, 65, 65, 0, 65, 0, 0, 0, 570 0, 0, 0, 0, 5, 6, 7, 8, 65, 10, 571 11, 65, 13, 66, 15, 16, 17, 18, 19, 20, 572 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 573 0, 4, 0, 116, 132, 3, 0, 0, 58, 58, 574 58, 58, 58, 58, 58, 78, 58, 58, 58, 58, 575 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 576 58, 58, 58, 58, 58, 78, 4, 74, 116, 136, 577 3, 17, 78, 1, 5, 6, 7, 8, 9, 10, 578 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 579 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 580 4, 54, 116, 5, 56, 0, 31, 80, 80, 80, 581 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 582 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 583 80, 80, 88, 80, 88, 88, 88, 0, 88, 0, 584 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 585 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 586 79, 79, 79, 79, 79, 79, 89, 79, 89, 89, 587 89, 0, 89, 0, 79, 25, 25, 25, 25, 25, 588 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 589 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 590 86, 25, 86, 86, 5, 56, 86, 0, 25, 65, 591 65, 65, 65, 65, 65, 65, 0, 65, 65, 65, 592 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 593 65, 65, 65, 65, 65, 65, 75, 0, 75, 75, 594 75, 0, 75, 0, 0, 0, 0, 0, 0, 0, 595 5, 6, 7, 8, 65, 10, 11, 75, 13, 66, 596 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 597 25, 26, 27, 28, 29, 30, 117, 146, 0, 0, 598 0, 0, 0, 0, 0, 5, 6, 7, 8, 65, 599 10, 11, 0, 13, 66, 15, 16, 17, 18, 19, 600 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 601 30, 117, 4, 0, 2, 0, 3, 0, 0, 5, 602 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 603 0, 0, 0, 67, 0, 0, 0, 0, 41, 0, 604 41, 0, 41, 0, 0, 117, 0, 0, 0, 0, 605 0, 88, 88, 0, 0, 0, 0, 0, 0, 41, 606 0, 0, 0, 0, 0, 0, 45, 0, 45, 0, 607 45, 0, 0, 0, 0, 0, 0, 88, 0, 0, 608 0, 0, 0, 0, 0, 89, 89, 45, 0, 0, 609 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 610 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611 0, 89, 0, 0, 0, 0, 0, 0, 0, 86, 612 86, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 614 0, 0, 0, 0, 0, 86, 0, 0, 0, 0, 615 0, 0, 0, 0, 0, 75, 75, 75, 75, 75, 616 75, 75, 0, 75, 75, 75, 75, 75, 75, 75, 617 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 618 75, 75, 0, 0, 0, 0, 0, 0, 0, 0, 619 0, 0, 0, 0, 82, 7, 8, 65, 10, 11, 620 0, 13, 66, 15, 16, 17, 18, 19, 20, 21, 621 22, 23, 24, 25, 26, 27, 28, 29, 30, 0, 622 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 623 0, 5, 6, 7, 8, 65, 10, 11, 0, 13, 624 66, 15, 16, 17, 18, 19, 20, 21, 22, 23, 625 24, 25, 26, 27, 28, 29, 30, 41, 41, 41, 626 41, 41, 41, 41, 0, 41, 41, 41, 41, 41, 627 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 628 41, 41, 41, 0, 0, 45, 45, 45, 45, 45, 629 45, 45, 0, 45, 45, 45, 45, 45, 45, 45, 630 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 631 45, 82, 7, 8, 65, 10, 11, 12, 13, 14, 632 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 633 25, 26, 27, 28, 29, 30, 0, 0, 82, 7, 634 8, 65, 10, 11, 95, 13, 66, 15, 16, 17, 635 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 636 28, 29, 30, 0, 0, 0, 138, 82, 7, 8, 637 65, 10, 11, 12, 13, 14, 15, 16, 17, 18, 638 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 639 29, 30, 0, 75, 82, 7, 8, 65, 10, 11, 640 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 641 22, 23, 24, 25, 26, 27, 28, 29, 30, 82, 642 7, 8, 65, 10, 11, 0, 13, 66, 15, 16, 643 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 644 27, 28, 29, 30, 645 }; 646 static const YYINT grammar_check[] = { 38, 647 44, 40, 41, 42, 40, 44, 40, 4, 62, 2, 648 0, 257, 258, 288, 59, 3, 34, 264, 72, 259, 649 59, 41, 61, 290, 44, 41, 116, 41, 47, 42, 650 44, 59, 38, 44, 40, 38, 42, 40, 284, 42, 651 94, 34, 282, 62, 98, 135, 43, 285, 59, 61, 652 47, 284, 44, 59, 99, 59, 59, 76, 48, 41, 653 79, 284, 44, 53, 38, 83, 40, 59, 42, 87, 654 41, 116, 60, 44, 41, 41, 73, 121, 44, 257, 655 258, 99, 44, 73, 41, 44, 287, 284, 59, 285, 656 61, 59, 44, 41, 87, 41, 285, 41, 0, 92, 657 0, 284, 41, 284, 41, 41, 99, 44, 41, 59, 658 59, 92, 121, 123, 116, 94, 109, 48, -1, -1, 659 -1, -1, 59, 116, 61, -1, 116, -1, 125, -1, 660 -1, -1, -1, 123, -1, -1, -1, -1, -1, -1, 661 -1, 44, -1, -1, -1, 135, -1, -1, -1, 142, 662 -1, -1, -1, -1, -1, -1, 59, -1, -1, -1, 663 -1, -1, -1, -1, -1, 38, -1, 40, -1, -1, 664 38, -1, 40, 41, 42, -1, 44, -1, -1, -1, 665 -1, -1, -1, -1, 257, 258, 259, 260, 261, 262, 666 263, 59, 265, 266, 267, 268, 269, 270, 271, 272, 667 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 668 -1, 38, -1, 40, 41, 42, -1, -1, 257, 258, 669 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 670 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 671 279, 280, 281, 282, 283, 284, 38, 283, 40, 283, 672 42, 257, 291, 256, 257, 258, 259, 260, 261, 262, 673 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 674 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 675 38, 285, 40, 257, 258, -1, 289, 258, 259, 260, 676 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 677 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 678 281, 282, 38, 284, 40, 41, 42, -1, 44, -1, 679 291, 258, 259, 260, 261, 262, 263, 264, 265, 266, 680 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 681 277, 278, 279, 280, 281, 282, 38, 284, 40, 41, 682 42, -1, 44, -1, 291, 258, 259, 260, 261, 262, 683 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 684 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 685 38, 284, 40, 41, 257, 258, 44, -1, 291, 257, 686 258, 259, 260, 261, 262, 263, -1, 265, 266, 267, 687 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 688 278, 279, 280, 281, 282, 283, 38, -1, 40, 41, 689 42, -1, 44, -1, -1, -1, -1, -1, -1, -1, 690 257, 258, 259, 260, 261, 262, 263, 59, 265, 266, 691 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 692 277, 278, 279, 280, 281, 282, 283, 41, -1, -1, 693 -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, 694 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 695 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 696 282, 283, 38, -1, 40, -1, 42, -1, -1, 257, 697 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, 698 -1, -1, -1, 59, -1, -1, -1, -1, 38, -1, 699 40, -1, 42, -1, -1, 283, -1, -1, -1, -1, 700 -1, 257, 258, -1, -1, -1, -1, -1, -1, 59, 701 -1, -1, -1, -1, -1, -1, 38, -1, 40, -1, 702 42, -1, -1, -1, -1, -1, -1, 283, -1, -1, 703 -1, -1, -1, -1, -1, 257, 258, 59, -1, -1, 704 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 705 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 706 -1, 283, -1, -1, -1, -1, -1, -1, -1, 257, 707 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, 708 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 709 -1, -1, -1, -1, -1, 283, -1, -1, -1, -1, 710 -1, -1, -1, -1, -1, 257, 258, 259, 260, 261, 711 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 712 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 713 282, 283, -1, -1, -1, -1, -1, -1, -1, -1, 714 -1, -1, -1, -1, 258, 259, 260, 261, 262, 263, 715 -1, 265, 266, 267, 268, 269, 270, 271, 272, 273, 716 274, 275, 276, 277, 278, 279, 280, 281, 282, -1, 717 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 718 -1, 257, 258, 259, 260, 261, 262, 263, -1, 265, 719 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 720 276, 277, 278, 279, 280, 281, 282, 257, 258, 259, 721 260, 261, 262, 263, -1, 265, 266, 267, 268, 269, 722 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 723 280, 281, 282, -1, -1, 257, 258, 259, 260, 261, 724 262, 263, -1, 265, 266, 267, 268, 269, 270, 271, 725 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 726 282, 258, 259, 260, 261, 262, 263, 264, 265, 266, 727 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 728 277, 278, 279, 280, 281, 282, -1, -1, 258, 259, 729 260, 261, 262, 263, 291, 265, 266, 267, 268, 269, 730 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 731 280, 281, 282, -1, -1, -1, 286, 258, 259, 260, 732 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 733 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 734 281, 282, -1, 284, 258, 259, 260, 261, 262, 263, 735 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 736 274, 275, 276, 277, 278, 279, 280, 281, 282, 258, 737 259, 260, 261, 262, 263, -1, 265, 266, 267, 268, 738 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 739 279, 280, 281, 282, 740 }; 741 #define YYFINAL 33 742 #ifndef YYDEBUG 743 #define YYDEBUG 0 744 #endif 745 #define YYMAXTOKEN 291 746 #define YYUNDFTOKEN 335 747 #define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a)) 748 #if YYDEBUG 749 static const char *const grammar_name[] = { 750 751 "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 752 0,0,0,0,"'&'",0,"'('","')'","'*'",0,"','",0,0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0, 753 "'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 754 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 755 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 756 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 757 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 758 "T_IDENTIFIER","T_TYPEDEF_NAME","T_DEFINE_NAME","T_AUTO","T_EXTERN", 759 "T_REGISTER","T_STATIC","T_TYPEDEF","T_INLINE","T_EXTENSION","T_CHAR", 760 "T_DOUBLE","T_FLOAT","T_INT","T_VOID","T_LONG","T_SHORT","T_SIGNED", 761 "T_UNSIGNED","T_ENUM","T_STRUCT","T_UNION","T_Bool","T_Complex","T_Imaginary", 762 "T_TYPE_QUALIFIER","T_BRACKETS","T_LBRACE","T_MATCHRBRACE","T_ELLIPSIS", 763 "T_INITIALIZER","T_STRING_LITERAL","T_ASM","T_ASMARG","T_VA_DCL",0,0,0,0,0,0,0, 764 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 765 "illegal-symbol", 766 }; 767 static const char *const grammar_rule[] = { 768 "$accept : program", 769 "program :", 770 "program : translation_unit", 771 "translation_unit : external_declaration", 772 "translation_unit : translation_unit external_declaration", 773 "external_declaration : declaration", 774 "external_declaration : function_definition", 775 "external_declaration : ';'", 776 "external_declaration : linkage_specification", 777 "external_declaration : T_ASM T_ASMARG ';'", 778 "external_declaration : error T_MATCHRBRACE", 779 "external_declaration : error ';'", 780 "braces : T_LBRACE T_MATCHRBRACE", 781 "linkage_specification : T_EXTERN T_STRING_LITERAL braces", 782 "linkage_specification : T_EXTERN T_STRING_LITERAL declaration", 783 "declaration : decl_specifiers ';'", 784 "declaration : decl_specifiers init_declarator_list ';'", 785 "$$1 :", 786 "declaration : any_typedef decl_specifiers $$1 opt_declarator_list ';'", 787 "any_typedef : T_EXTENSION T_TYPEDEF", 788 "any_typedef : T_TYPEDEF", 789 "opt_declarator_list :", 790 "opt_declarator_list : declarator_list", 791 "declarator_list : declarator", 792 "declarator_list : declarator_list ',' declarator", 793 "$$2 :", 794 "$$3 :", 795 "function_definition : decl_specifiers declarator $$2 opt_declaration_list T_LBRACE $$3 T_MATCHRBRACE", 796 "$$4 :", 797 "function_definition : declarator $$4 opt_declaration_list T_LBRACE T_MATCHRBRACE", 798 "opt_declaration_list :", 799 "opt_declaration_list : T_VA_DCL", 800 "opt_declaration_list : declaration_list", 801 "declaration_list : declaration", 802 "declaration_list : declaration_list declaration", 803 "decl_specifiers : decl_specifier", 804 "decl_specifiers : decl_specifiers decl_specifier", 805 "decl_specifier : storage_class", 806 "decl_specifier : type_specifier", 807 "decl_specifier : type_qualifier", 808 "storage_class : T_AUTO", 809 "storage_class : T_EXTERN", 810 "storage_class : T_REGISTER", 811 "storage_class : T_STATIC", 812 "storage_class : T_INLINE", 813 "storage_class : T_EXTENSION", 814 "type_specifier : T_CHAR", 815 "type_specifier : T_DOUBLE", 816 "type_specifier : T_FLOAT", 817 "type_specifier : T_INT", 818 "type_specifier : T_LONG", 819 "type_specifier : T_SHORT", 820 "type_specifier : T_SIGNED", 821 "type_specifier : T_UNSIGNED", 822 "type_specifier : T_VOID", 823 "type_specifier : T_Bool", 824 "type_specifier : T_Complex", 825 "type_specifier : T_Imaginary", 826 "type_specifier : T_TYPEDEF_NAME", 827 "type_specifier : struct_or_union_specifier", 828 "type_specifier : enum_specifier", 829 "type_qualifier : T_TYPE_QUALIFIER", 830 "type_qualifier : T_DEFINE_NAME", 831 "struct_or_union_specifier : struct_or_union any_id braces", 832 "struct_or_union_specifier : struct_or_union braces", 833 "struct_or_union_specifier : struct_or_union any_id", 834 "struct_or_union : T_STRUCT", 835 "struct_or_union : T_UNION", 836 "init_declarator_list : init_declarator", 837 "init_declarator_list : init_declarator_list ',' init_declarator", 838 "init_declarator : declarator", 839 "$$5 :", 840 "init_declarator : declarator '=' $$5 T_INITIALIZER", 841 "enum_specifier : enumeration any_id braces", 842 "enum_specifier : enumeration braces", 843 "enum_specifier : enumeration any_id", 844 "enumeration : T_ENUM", 845 "any_id : T_IDENTIFIER", 846 "any_id : T_TYPEDEF_NAME", 847 "declarator : pointer direct_declarator", 848 "declarator : direct_declarator", 849 "direct_declarator : identifier_or_ref", 850 "direct_declarator : '(' declarator ')'", 851 "direct_declarator : direct_declarator T_BRACKETS", 852 "direct_declarator : direct_declarator '(' parameter_type_list ')'", 853 "direct_declarator : direct_declarator '(' opt_identifier_list ')'", 854 "pointer : '*' opt_type_qualifiers", 855 "pointer : '*' opt_type_qualifiers pointer", 856 "opt_type_qualifiers :", 857 "opt_type_qualifiers : type_qualifier_list", 858 "type_qualifier_list : type_qualifier", 859 "type_qualifier_list : type_qualifier_list type_qualifier", 860 "parameter_type_list : parameter_list", 861 "parameter_type_list : parameter_list ',' T_ELLIPSIS", 862 "parameter_list : parameter_declaration", 863 "parameter_list : parameter_list ',' parameter_declaration", 864 "parameter_declaration : decl_specifiers declarator", 865 "parameter_declaration : decl_specifiers abs_declarator", 866 "parameter_declaration : decl_specifiers", 867 "opt_identifier_list :", 868 "opt_identifier_list : identifier_list", 869 "identifier_list : any_id", 870 "identifier_list : identifier_list ',' any_id", 871 "identifier_or_ref : any_id", 872 "identifier_or_ref : '&' any_id", 873 "abs_declarator : pointer", 874 "abs_declarator : pointer direct_abs_declarator", 875 "abs_declarator : direct_abs_declarator", 876 "direct_abs_declarator : '(' abs_declarator ')'", 877 "direct_abs_declarator : direct_abs_declarator T_BRACKETS", 878 "direct_abs_declarator : T_BRACKETS", 879 "direct_abs_declarator : direct_abs_declarator '(' parameter_type_list ')'", 880 "direct_abs_declarator : direct_abs_declarator '(' ')'", 881 "direct_abs_declarator : '(' parameter_type_list ')'", 882 "direct_abs_declarator : '(' ')'", 883 884 }; 885 #endif 886 887 int yydebug; 888 int yynerrs; 889 890 int yyerrflag; 891 int yychar; 892 YYSTYPE yyval; 893 YYSTYPE yylval; 894 895 /* define the initial stack-sizes */ 896 #ifdef YYSTACKSIZE 897 #undef YYMAXDEPTH 898 #define YYMAXDEPTH YYSTACKSIZE 899 #else 900 #ifdef YYMAXDEPTH 901 #define YYSTACKSIZE YYMAXDEPTH 902 #else 903 #define YYSTACKSIZE 10000 904 #define YYMAXDEPTH 10000 905 #endif 906 #endif 907 908 #define YYINITSTACKSIZE 200 909 910 typedef struct { 911 unsigned stacksize; 912 YYINT *s_base; 913 YYINT *s_mark; 914 YYINT *s_last; 915 YYSTYPE *l_base; 916 YYSTYPE *l_mark; 917 } YYSTACKDATA; 918 /* variables for the parser stack */ 919 static YYSTACKDATA yystack; 920 #line 1014 "grammar.y" 921 922 /* lex.yy.c */ 923 #define BEGIN yy_start = 1 + 2 * 924 925 #define CPP1 1 926 #define INIT1 2 927 #define INIT2 3 928 #define CURLY 4 929 #define LEXYACC 5 930 #define ASM 6 931 #define CPP_INLINE 7 932 933 extern char *yytext; 934 extern FILE *yyin, *yyout; 935 936 static int curly; /* number of curly brace nesting levels */ 937 static int ly_count; /* number of occurances of %% */ 938 static int inc_depth; /* include nesting level */ 939 static SymbolTable *included_files; /* files already included */ 940 static int yy_start = 0; /* start state number */ 941 942 #define grammar_error(s) yaccError(s) 943 944 static void 945 yaccError (const char *msg) 946 { 947 func_params = NULL; 948 put_error(); /* tell what line we're on, and what file */ 949 fprintf(stderr, "%s at token '%s'\n", msg, yytext); 950 } 951 952 /* Initialize the table of type qualifier keywords recognized by the lexical 953 * analyzer. 954 */ 955 void 956 init_parser (void) 957 { 958 static const char *keywords[] = { 959 "const", 960 "restrict", 961 "volatile", 962 "interrupt", 963 #ifdef vms 964 "noshare", 965 "readonly", 966 #endif 967 #if defined(MSDOS) || defined(OS2) 968 "__cdecl", 969 "__export", 970 "__far", 971 "__fastcall", 972 "__fortran", 973 "__huge", 974 "__inline", 975 "__interrupt", 976 "__loadds", 977 "__near", 978 "__pascal", 979 "__saveregs", 980 "__segment", 981 "__stdcall", 982 "__syscall", 983 "_cdecl", 984 "_cs", 985 "_ds", 986 "_es", 987 "_export", 988 "_far", 989 "_fastcall", 990 "_fortran", 991 "_huge", 992 "_interrupt", 993 "_loadds", 994 "_near", 995 "_pascal", 996 "_saveregs", 997 "_seg", 998 "_segment", 999 "_ss", 1000 "cdecl", 1001 "far", 1002 "huge", 1003 "near", 1004 "pascal", 1005 #ifdef OS2 1006 "__far16", 1007 #endif 1008 #endif 1009 #ifdef __GNUC__ 1010 /* gcc aliases */ 1011 "__builtin_va_arg", 1012 "__builtin_va_list", 1013 "__const", 1014 "__const__", 1015 "__inline", 1016 "__inline__", 1017 "__restrict", 1018 "__restrict__", 1019 "__volatile", 1020 "__volatile__", 1021 #endif 1022 }; 1023 unsigned i; 1024 1025 /* Initialize type qualifier table. */ 1026 type_qualifiers = new_symbol_table(); 1027 for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) { 1028 new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE); 1029 } 1030 } 1031 1032 /* Process the C source file. Write function prototypes to the standard 1033 * output. Convert function definitions and write the converted source 1034 * code to a temporary file. 1035 */ 1036 void 1037 process_file (FILE *infile, char *name) 1038 { 1039 char *s; 1040 1041 if (strlen(name) > 2) { 1042 s = name + strlen(name) - 2; 1043 if (*s == '.') { 1044 ++s; 1045 if (*s == 'l' || *s == 'y') 1046 BEGIN LEXYACC; 1047 #if defined(MSDOS) || defined(OS2) 1048 if (*s == 'L' || *s == 'Y') 1049 BEGIN LEXYACC; 1050 #endif 1051 } 1052 } 1053 1054 included_files = new_symbol_table(); 1055 typedef_names = new_symbol_table(); 1056 define_names = new_symbol_table(); 1057 inc_depth = -1; 1058 curly = 0; 1059 ly_count = 0; 1060 func_params = NULL; 1061 yyin = infile; 1062 include_file(strcpy(base_file, name), func_style != FUNC_NONE); 1063 if (file_comments) { 1064 #if OPT_LINTLIBRARY 1065 if (lintLibrary()) { 1066 put_blankline(stdout); 1067 begin_tracking(); 1068 } 1069 #endif 1070 put_string(stdout, "/* "); 1071 put_string(stdout, cur_file_name()); 1072 put_string(stdout, " */\n"); 1073 } 1074 yyparse(); 1075 free_symbol_table(define_names); 1076 free_symbol_table(typedef_names); 1077 free_symbol_table(included_files); 1078 } 1079 1080 #ifdef NO_LEAKS 1081 void 1082 free_parser(void) 1083 { 1084 free_symbol_table (type_qualifiers); 1085 #ifdef FLEX_SCANNER 1086 if (yy_current_buffer != 0) 1087 yy_delete_buffer(yy_current_buffer); 1088 #endif 1089 } 1090 #endif 1091 #line 1092 "grammar.tab.c" 1092 1093 #if YYDEBUG 1094 #include <stdio.h> /* needed for printf */ 1095 #endif 1096 1097 #include <stdlib.h> /* needed for malloc, etc */ 1098 #include <string.h> /* needed for memset */ 1099 1100 /* allocate initial stack or double stack size, up to YYMAXDEPTH */ 1101 static int yygrowstack(YYSTACKDATA *data) 1102 { 1103 int i; 1104 unsigned newsize; 1105 YYINT *newss; 1106 YYSTYPE *newvs; 1107 1108 if ((newsize = data->stacksize) == 0) 1109 newsize = YYINITSTACKSIZE; 1110 else if (newsize >= YYMAXDEPTH) 1111 return YYENOMEM; 1112 else if ((newsize *= 2) > YYMAXDEPTH) 1113 newsize = YYMAXDEPTH; 1114 1115 i = (int) (data->s_mark - data->s_base); 1116 newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); 1117 if (newss == 0) 1118 return YYENOMEM; 1119 1120 data->s_base = newss; 1121 data->s_mark = newss + i; 1122 1123 newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); 1124 if (newvs == 0) 1125 return YYENOMEM; 1126 1127 data->l_base = newvs; 1128 data->l_mark = newvs + i; 1129 1130 data->stacksize = newsize; 1131 data->s_last = data->s_base + newsize - 1; 1132 return 0; 1133 } 1134 1135 #if YYPURE || defined(YY_NO_LEAKS) 1136 static void yyfreestack(YYSTACKDATA *data) 1137 { 1138 free(data->s_base); 1139 free(data->l_base); 1140 memset(data, 0, sizeof(*data)); 1141 } 1142 #else 1143 #define yyfreestack(data) /* nothing */ 1144 #endif 1145 1146 #define YYABORT goto yyabort 1147 #define YYREJECT goto yyabort 1148 #define YYACCEPT goto yyaccept 1149 #define YYERROR goto yyerrlab 1150 1151 int 1152 YYPARSE_DECL() 1153 { 1154 int yym, yyn, yystate; 1155 #if YYDEBUG 1156 const char *yys; 1157 1158 if ((yys = getenv("YYDEBUG")) != 0) 1159 { 1160 yyn = *yys; 1161 if (yyn >= '0' && yyn <= '9') 1162 yydebug = yyn - '0'; 1163 } 1164 #endif 1165 1166 yym = 0; 1167 yyn = 0; 1168 yynerrs = 0; 1169 yyerrflag = 0; 1170 yychar = YYEMPTY; 1171 yystate = 0; 1172 1173 #if YYPURE 1174 memset(&yystack, 0, sizeof(yystack)); 1175 #endif 1176 1177 if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 1178 yystack.s_mark = yystack.s_base; 1179 yystack.l_mark = yystack.l_base; 1180 yystate = 0; 1181 *yystack.s_mark = 0; 1182 1183 yyloop: 1184 if ((yyn = yydefred[yystate]) != 0) goto yyreduce; 1185 if (yychar < 0) 1186 { 1187 yychar = YYLEX; 1188 if (yychar < 0) yychar = YYEOF; 1189 #if YYDEBUG 1190 if (yydebug) 1191 { 1192 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 1193 printf("%sdebug: state %d, reading %d (%s)\n", 1194 YYPREFIX, yystate, yychar, yys); 1195 } 1196 #endif 1197 } 1198 if (((yyn = yysindex[yystate]) != 0) && (yyn += yychar) >= 0 && 1199 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 1200 { 1201 #if YYDEBUG 1202 if (yydebug) 1203 printf("%sdebug: state %d, shifting to state %d\n", 1204 YYPREFIX, yystate, yytable[yyn]); 1205 #endif 1206 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 1207 yystate = yytable[yyn]; 1208 *++yystack.s_mark = yytable[yyn]; 1209 *++yystack.l_mark = yylval; 1210 yychar = YYEMPTY; 1211 if (yyerrflag > 0) --yyerrflag; 1212 goto yyloop; 1213 } 1214 if (((yyn = yyrindex[yystate]) != 0) && (yyn += yychar) >= 0 && 1215 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yychar) 1216 { 1217 yyn = yytable[yyn]; 1218 goto yyreduce; 1219 } 1220 if (yyerrflag != 0) goto yyinrecovery; 1221 1222 YYERROR_CALL("syntax error"); 1223 1224 goto yyerrlab; /* redundant goto avoids 'unused label' warning */ 1225 yyerrlab: 1226 ++yynerrs; 1227 1228 yyinrecovery: 1229 if (yyerrflag < 3) 1230 { 1231 yyerrflag = 3; 1232 for (;;) 1233 { 1234 if (((yyn = yysindex[*yystack.s_mark]) != 0) && (yyn += YYERRCODE) >= 0 && 1235 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) YYERRCODE) 1236 { 1237 #if YYDEBUG 1238 if (yydebug) 1239 printf("%sdebug: state %d, error recovery shifting\ 1240 to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); 1241 #endif 1242 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 1243 yystate = yytable[yyn]; 1244 *++yystack.s_mark = yytable[yyn]; 1245 *++yystack.l_mark = yylval; 1246 goto yyloop; 1247 } 1248 else 1249 { 1250 #if YYDEBUG 1251 if (yydebug) 1252 printf("%sdebug: error recovery discarding state %d\n", 1253 YYPREFIX, *yystack.s_mark); 1254 #endif 1255 if (yystack.s_mark <= yystack.s_base) goto yyabort; 1256 --yystack.s_mark; 1257 --yystack.l_mark; 1258 } 1259 } 1260 } 1261 else 1262 { 1263 if (yychar == YYEOF) goto yyabort; 1264 #if YYDEBUG 1265 if (yydebug) 1266 { 1267 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 1268 printf("%sdebug: state %d, error recovery discards token %d (%s)\n", 1269 YYPREFIX, yystate, yychar, yys); 1270 } 1271 #endif 1272 yychar = YYEMPTY; 1273 goto yyloop; 1274 } 1275 1276 yyreduce: 1277 #if YYDEBUG 1278 if (yydebug) 1279 printf("%sdebug: state %d, reducing by rule %d (%s)\n", 1280 YYPREFIX, yystate, yyn, yyrule[yyn]); 1281 #endif 1282 yym = yylen[yyn]; 1283 if (yym > 0) 1284 yyval = yystack.l_mark[1-yym]; 1285 else 1286 memset(&yyval, 0, sizeof yyval); 1287 1288 switch (yyn) 1289 { 1290 case 10: 1291 #line 377 "grammar.y" 1292 { 1293 yyerrok; 1294 } 1295 break; 1296 case 11: 1297 #line 381 "grammar.y" 1298 { 1299 yyerrok; 1300 } 1301 break; 1302 case 13: 1303 #line 392 "grammar.y" 1304 { 1305 /* Provide an empty action here so bison will not complain about 1306 * incompatible types in the default action it normally would 1307 * have generated. 1308 */ 1309 } 1310 break; 1311 case 14: 1312 #line 399 "grammar.y" 1313 { 1314 /* empty */ 1315 } 1316 break; 1317 case 15: 1318 #line 406 "grammar.y" 1319 { 1320 #if OPT_LINTLIBRARY 1321 if (types_out && want_typedef()) { 1322 gen_declarations(&yystack.l_mark[-1].decl_spec, (DeclaratorList *)0); 1323 flush_varargs(); 1324 } 1325 #endif 1326 free_decl_spec(&yystack.l_mark[-1].decl_spec); 1327 end_typedef(); 1328 } 1329 break; 1330 case 16: 1331 #line 417 "grammar.y" 1332 { 1333 if (func_params != NULL) { 1334 set_param_types(func_params, &yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); 1335 } else { 1336 gen_declarations(&yystack.l_mark[-2].decl_spec, &yystack.l_mark[-1].decl_list); 1337 #if OPT_LINTLIBRARY 1338 flush_varargs(); 1339 #endif 1340 free_decl_list(&yystack.l_mark[-1].decl_list); 1341 } 1342 free_decl_spec(&yystack.l_mark[-2].decl_spec); 1343 end_typedef(); 1344 } 1345 break; 1346 case 17: 1347 #line 431 "grammar.y" 1348 { 1349 cur_decl_spec_flags = yystack.l_mark[0].decl_spec.flags; 1350 free_decl_spec(&yystack.l_mark[0].decl_spec); 1351 } 1352 break; 1353 case 18: 1354 #line 436 "grammar.y" 1355 { 1356 end_typedef(); 1357 } 1358 break; 1359 case 19: 1360 #line 443 "grammar.y" 1361 { 1362 begin_typedef(); 1363 } 1364 break; 1365 case 20: 1366 #line 447 "grammar.y" 1367 { 1368 begin_typedef(); 1369 } 1370 break; 1371 case 23: 1372 #line 459 "grammar.y" 1373 { 1374 int flags = cur_decl_spec_flags; 1375 1376 /* If the typedef is a pointer type, then reset the short type 1377 * flags so it does not get promoted. 1378 */ 1379 if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) 1380 flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); 1381 new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); 1382 free_declarator(yystack.l_mark[0].declarator); 1383 } 1384 break; 1385 case 24: 1386 #line 471 "grammar.y" 1387 { 1388 int flags = cur_decl_spec_flags; 1389 1390 if (strcmp(yystack.l_mark[0].declarator->text, yystack.l_mark[0].declarator->name) != 0) 1391 flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT); 1392 new_symbol(typedef_names, yystack.l_mark[0].declarator->name, NULL, flags); 1393 free_declarator(yystack.l_mark[0].declarator); 1394 } 1395 break; 1396 case 25: 1397 #line 483 "grammar.y" 1398 { 1399 check_untagged(&yystack.l_mark[-1].decl_spec); 1400 if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { 1401 yyerror("syntax error"); 1402 YYERROR; 1403 } 1404 func_params = &(yystack.l_mark[0].declarator->head->params); 1405 func_params->begin_comment = cur_file->begin_comment; 1406 func_params->end_comment = cur_file->end_comment; 1407 } 1408 break; 1409 case 26: 1410 #line 494 "grammar.y" 1411 { 1412 /* If we're converting to K&R and we've got a nominally K&R 1413 * function which has a parameter which is ANSI (i.e., a prototyped 1414 * function pointer), then we must override the deciphered value of 1415 * 'func_def' so that the parameter will be converted. 1416 */ 1417 if (func_style == FUNC_TRADITIONAL 1418 && haveAnsiParam() 1419 && yystack.l_mark[-3].declarator->head->func_def == func_style) { 1420 yystack.l_mark[-3].declarator->head->func_def = FUNC_BOTH; 1421 } 1422 1423 func_params = NULL; 1424 1425 if (cur_file->convert) 1426 gen_func_definition(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); 1427 gen_prototype(&yystack.l_mark[-4].decl_spec, yystack.l_mark[-3].declarator); 1428 #if OPT_LINTLIBRARY 1429 flush_varargs(); 1430 #endif 1431 free_decl_spec(&yystack.l_mark[-4].decl_spec); 1432 free_declarator(yystack.l_mark[-3].declarator); 1433 } 1434 break; 1435 case 28: 1436 #line 519 "grammar.y" 1437 { 1438 if (yystack.l_mark[0].declarator->func_def == FUNC_NONE) { 1439 yyerror("syntax error"); 1440 YYERROR; 1441 } 1442 func_params = &(yystack.l_mark[0].declarator->head->params); 1443 func_params->begin_comment = cur_file->begin_comment; 1444 func_params->end_comment = cur_file->end_comment; 1445 } 1446 break; 1447 case 29: 1448 #line 529 "grammar.y" 1449 { 1450 DeclSpec decl_spec; 1451 1452 func_params = NULL; 1453 1454 new_decl_spec(&decl_spec, dft_decl_spec(), yystack.l_mark[-4].declarator->begin, DS_NONE); 1455 if (cur_file->convert) 1456 gen_func_definition(&decl_spec, yystack.l_mark[-4].declarator); 1457 gen_prototype(&decl_spec, yystack.l_mark[-4].declarator); 1458 #if OPT_LINTLIBRARY 1459 flush_varargs(); 1460 #endif 1461 free_decl_spec(&decl_spec); 1462 free_declarator(yystack.l_mark[-4].declarator); 1463 } 1464 break; 1465 case 36: 1466 #line 560 "grammar.y" 1467 { 1468 join_decl_specs(&yyval.decl_spec, &yystack.l_mark[-1].decl_spec, &yystack.l_mark[0].decl_spec); 1469 free(yystack.l_mark[-1].decl_spec.text); 1470 free(yystack.l_mark[0].decl_spec.text); 1471 } 1472 break; 1473 case 40: 1474 #line 575 "grammar.y" 1475 { 1476 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1477 } 1478 break; 1479 case 41: 1480 #line 579 "grammar.y" 1481 { 1482 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_EXTERN); 1483 } 1484 break; 1485 case 42: 1486 #line 583 "grammar.y" 1487 { 1488 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1489 } 1490 break; 1491 case 43: 1492 #line 587 "grammar.y" 1493 { 1494 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_STATIC); 1495 } 1496 break; 1497 case 44: 1498 #line 591 "grammar.y" 1499 { 1500 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_INLINE); 1501 } 1502 break; 1503 case 45: 1504 #line 595 "grammar.y" 1505 { 1506 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_JUNK); 1507 } 1508 break; 1509 case 46: 1510 #line 602 "grammar.y" 1511 { 1512 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); 1513 } 1514 break; 1515 case 47: 1516 #line 606 "grammar.y" 1517 { 1518 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1519 } 1520 break; 1521 case 48: 1522 #line 610 "grammar.y" 1523 { 1524 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_FLOAT); 1525 } 1526 break; 1527 case 49: 1528 #line 614 "grammar.y" 1529 { 1530 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1531 } 1532 break; 1533 case 50: 1534 #line 618 "grammar.y" 1535 { 1536 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1537 } 1538 break; 1539 case 51: 1540 #line 622 "grammar.y" 1541 { 1542 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_SHORT); 1543 } 1544 break; 1545 case 52: 1546 #line 626 "grammar.y" 1547 { 1548 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1549 } 1550 break; 1551 case 53: 1552 #line 630 "grammar.y" 1553 { 1554 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1555 } 1556 break; 1557 case 54: 1558 #line 634 "grammar.y" 1559 { 1560 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1561 } 1562 break; 1563 case 55: 1564 #line 638 "grammar.y" 1565 { 1566 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_CHAR); 1567 } 1568 break; 1569 case 56: 1570 #line 642 "grammar.y" 1571 { 1572 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1573 } 1574 break; 1575 case 57: 1576 #line 646 "grammar.y" 1577 { 1578 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1579 } 1580 break; 1581 case 58: 1582 #line 650 "grammar.y" 1583 { 1584 Symbol *s; 1585 s = find_symbol(typedef_names, yystack.l_mark[0].text.text); 1586 if (s != NULL) 1587 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); 1588 } 1589 break; 1590 case 61: 1591 #line 662 "grammar.y" 1592 { 1593 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, DS_NONE); 1594 } 1595 break; 1596 case 62: 1597 #line 666 "grammar.y" 1598 { 1599 /* This rule allows the <pointer> nonterminal to scan #define 1600 * names as if they were type modifiers. 1601 */ 1602 Symbol *s; 1603 s = find_symbol(define_names, yystack.l_mark[0].text.text); 1604 if (s != NULL) 1605 new_decl_spec(&yyval.decl_spec, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin, s->flags); 1606 } 1607 break; 1608 case 63: 1609 #line 679 "grammar.y" 1610 { 1611 char *s; 1612 if ((s = implied_typedef()) == 0) 1613 (void)sprintf(s = buf, "%s %s", yystack.l_mark[-2].text.text, yystack.l_mark[-1].text.text); 1614 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); 1615 } 1616 break; 1617 case 64: 1618 #line 686 "grammar.y" 1619 { 1620 char *s; 1621 if ((s = implied_typedef()) == 0) 1622 (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); 1623 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); 1624 } 1625 break; 1626 case 65: 1627 #line 693 "grammar.y" 1628 { 1629 (void)sprintf(buf, "%s %s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); 1630 new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); 1631 } 1632 break; 1633 case 66: 1634 #line 701 "grammar.y" 1635 { 1636 imply_typedef(yyval.text.text); 1637 } 1638 break; 1639 case 67: 1640 #line 705 "grammar.y" 1641 { 1642 imply_typedef(yyval.text.text); 1643 } 1644 break; 1645 case 68: 1646 #line 712 "grammar.y" 1647 { 1648 new_decl_list(&yyval.decl_list, yystack.l_mark[0].declarator); 1649 } 1650 break; 1651 case 69: 1652 #line 716 "grammar.y" 1653 { 1654 add_decl_list(&yyval.decl_list, &yystack.l_mark[-2].decl_list, yystack.l_mark[0].declarator); 1655 } 1656 break; 1657 case 70: 1658 #line 723 "grammar.y" 1659 { 1660 if (yystack.l_mark[0].declarator->func_def != FUNC_NONE && func_params == NULL && 1661 func_style == FUNC_TRADITIONAL && cur_file->convert) { 1662 gen_func_declarator(yystack.l_mark[0].declarator); 1663 fputs(cur_text(), cur_file->tmp_file); 1664 } 1665 cur_declarator = yyval.declarator; 1666 } 1667 break; 1668 case 71: 1669 #line 732 "grammar.y" 1670 { 1671 if (yystack.l_mark[-1].declarator->func_def != FUNC_NONE && func_params == NULL && 1672 func_style == FUNC_TRADITIONAL && cur_file->convert) { 1673 gen_func_declarator(yystack.l_mark[-1].declarator); 1674 fputs(" =", cur_file->tmp_file); 1675 } 1676 } 1677 break; 1678 case 73: 1679 #line 744 "grammar.y" 1680 { 1681 char *s; 1682 if ((s = implied_typedef()) == 0) 1683 (void)sprintf(s = buf, "enum %s", yystack.l_mark[-1].text.text); 1684 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-2].text.begin, DS_NONE); 1685 } 1686 break; 1687 case 74: 1688 #line 751 "grammar.y" 1689 { 1690 char *s; 1691 if ((s = implied_typedef()) == 0) 1692 (void)sprintf(s = buf, "%s {}", yystack.l_mark[-1].text.text); 1693 new_decl_spec(&yyval.decl_spec, s, yystack.l_mark[-1].text.begin, DS_NONE); 1694 } 1695 break; 1696 case 75: 1697 #line 758 "grammar.y" 1698 { 1699 (void)sprintf(buf, "enum %s", yystack.l_mark[0].text.text); 1700 new_decl_spec(&yyval.decl_spec, buf, yystack.l_mark[-1].text.begin, DS_NONE); 1701 } 1702 break; 1703 case 76: 1704 #line 766 "grammar.y" 1705 { 1706 imply_typedef("enum"); 1707 yyval.text = yystack.l_mark[0].text; 1708 } 1709 break; 1710 case 79: 1711 #line 779 "grammar.y" 1712 { 1713 yyval.declarator = yystack.l_mark[0].declarator; 1714 (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); 1715 free(yyval.declarator->text); 1716 yyval.declarator->text = xstrdup(buf); 1717 yyval.declarator->begin = yystack.l_mark[-1].text.begin; 1718 yyval.declarator->pointer = TRUE; 1719 } 1720 break; 1721 case 81: 1722 #line 792 "grammar.y" 1723 { 1724 yyval.declarator = new_declarator(yystack.l_mark[0].text.text, yystack.l_mark[0].text.text, yystack.l_mark[0].text.begin); 1725 } 1726 break; 1727 case 82: 1728 #line 796 "grammar.y" 1729 { 1730 yyval.declarator = yystack.l_mark[-1].declarator; 1731 (void)sprintf(buf, "(%s)", yyval.declarator->text); 1732 free(yyval.declarator->text); 1733 yyval.declarator->text = xstrdup(buf); 1734 yyval.declarator->begin = yystack.l_mark[-2].text.begin; 1735 } 1736 break; 1737 case 83: 1738 #line 804 "grammar.y" 1739 { 1740 yyval.declarator = yystack.l_mark[-1].declarator; 1741 (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); 1742 free(yyval.declarator->text); 1743 yyval.declarator->text = xstrdup(buf); 1744 } 1745 break; 1746 case 84: 1747 #line 811 "grammar.y" 1748 { 1749 yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); 1750 yyval.declarator->params = yystack.l_mark[-1].param_list; 1751 yyval.declarator->func_stack = yystack.l_mark[-3].declarator; 1752 yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; 1753 yyval.declarator->func_def = FUNC_ANSI; 1754 } 1755 break; 1756 case 85: 1757 #line 819 "grammar.y" 1758 { 1759 yyval.declarator = new_declarator("%s()", yystack.l_mark[-3].declarator->name, yystack.l_mark[-3].declarator->begin); 1760 yyval.declarator->params = yystack.l_mark[-1].param_list; 1761 yyval.declarator->func_stack = yystack.l_mark[-3].declarator; 1762 yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; 1763 yyval.declarator->func_def = FUNC_TRADITIONAL; 1764 } 1765 break; 1766 case 86: 1767 #line 830 "grammar.y" 1768 { 1769 (void)sprintf(yyval.text.text, "*%s", yystack.l_mark[0].text.text); 1770 yyval.text.begin = yystack.l_mark[-1].text.begin; 1771 } 1772 break; 1773 case 87: 1774 #line 835 "grammar.y" 1775 { 1776 (void)sprintf(yyval.text.text, "*%s%s", yystack.l_mark[-1].text.text, yystack.l_mark[0].text.text); 1777 yyval.text.begin = yystack.l_mark[-2].text.begin; 1778 } 1779 break; 1780 case 88: 1781 #line 843 "grammar.y" 1782 { 1783 strcpy(yyval.text.text, ""); 1784 yyval.text.begin = 0L; 1785 } 1786 break; 1787 case 90: 1788 #line 852 "grammar.y" 1789 { 1790 (void)sprintf(yyval.text.text, "%s ", yystack.l_mark[0].decl_spec.text); 1791 yyval.text.begin = yystack.l_mark[0].decl_spec.begin; 1792 free(yystack.l_mark[0].decl_spec.text); 1793 } 1794 break; 1795 case 91: 1796 #line 858 "grammar.y" 1797 { 1798 (void)sprintf(yyval.text.text, "%s%s ", yystack.l_mark[-1].text.text, yystack.l_mark[0].decl_spec.text); 1799 yyval.text.begin = yystack.l_mark[-1].text.begin; 1800 free(yystack.l_mark[0].decl_spec.text); 1801 } 1802 break; 1803 case 93: 1804 #line 868 "grammar.y" 1805 { 1806 add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, "..."); 1807 } 1808 break; 1809 case 94: 1810 #line 875 "grammar.y" 1811 { 1812 new_param_list(&yyval.param_list, yystack.l_mark[0].parameter); 1813 } 1814 break; 1815 case 95: 1816 #line 879 "grammar.y" 1817 { 1818 add_param_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].parameter); 1819 } 1820 break; 1821 case 96: 1822 #line 886 "grammar.y" 1823 { 1824 check_untagged(&yystack.l_mark[-1].decl_spec); 1825 yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); 1826 } 1827 break; 1828 case 97: 1829 #line 891 "grammar.y" 1830 { 1831 check_untagged(&yystack.l_mark[-1].decl_spec); 1832 yyval.parameter = new_parameter(&yystack.l_mark[-1].decl_spec, yystack.l_mark[0].declarator); 1833 } 1834 break; 1835 case 98: 1836 #line 896 "grammar.y" 1837 { 1838 check_untagged(&yystack.l_mark[0].decl_spec); 1839 yyval.parameter = new_parameter(&yystack.l_mark[0].decl_spec, (Declarator *)0); 1840 } 1841 break; 1842 case 99: 1843 #line 904 "grammar.y" 1844 { 1845 new_ident_list(&yyval.param_list); 1846 } 1847 break; 1848 case 101: 1849 #line 912 "grammar.y" 1850 { 1851 new_ident_list(&yyval.param_list); 1852 add_ident_list(&yyval.param_list, &yyval.param_list, yystack.l_mark[0].text.text); 1853 } 1854 break; 1855 case 102: 1856 #line 917 "grammar.y" 1857 { 1858 add_ident_list(&yyval.param_list, &yystack.l_mark[-2].param_list, yystack.l_mark[0].text.text); 1859 } 1860 break; 1861 case 103: 1862 #line 924 "grammar.y" 1863 { 1864 yyval.text = yystack.l_mark[0].text; 1865 } 1866 break; 1867 case 104: 1868 #line 928 "grammar.y" 1869 { 1870 #if OPT_LINTLIBRARY 1871 if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */ 1872 yyval.text = yystack.l_mark[0].text; 1873 } else 1874 #endif 1875 (void)sprintf(yyval.text.text, "&%s", yystack.l_mark[0].text.text); 1876 yyval.text.begin = yystack.l_mark[-1].text.begin; 1877 } 1878 break; 1879 case 105: 1880 #line 941 "grammar.y" 1881 { 1882 yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); 1883 } 1884 break; 1885 case 106: 1886 #line 945 "grammar.y" 1887 { 1888 yyval.declarator = yystack.l_mark[0].declarator; 1889 (void)sprintf(buf, "%s%s", yystack.l_mark[-1].text.text, yyval.declarator->text); 1890 free(yyval.declarator->text); 1891 yyval.declarator->text = xstrdup(buf); 1892 yyval.declarator->begin = yystack.l_mark[-1].text.begin; 1893 } 1894 break; 1895 case 108: 1896 #line 957 "grammar.y" 1897 { 1898 yyval.declarator = yystack.l_mark[-1].declarator; 1899 (void)sprintf(buf, "(%s)", yyval.declarator->text); 1900 free(yyval.declarator->text); 1901 yyval.declarator->text = xstrdup(buf); 1902 yyval.declarator->begin = yystack.l_mark[-2].text.begin; 1903 } 1904 break; 1905 case 109: 1906 #line 965 "grammar.y" 1907 { 1908 yyval.declarator = yystack.l_mark[-1].declarator; 1909 (void)sprintf(buf, "%s%s", yyval.declarator->text, yystack.l_mark[0].text.text); 1910 free(yyval.declarator->text); 1911 yyval.declarator->text = xstrdup(buf); 1912 } 1913 break; 1914 case 110: 1915 #line 972 "grammar.y" 1916 { 1917 yyval.declarator = new_declarator(yystack.l_mark[0].text.text, "", yystack.l_mark[0].text.begin); 1918 } 1919 break; 1920 case 111: 1921 #line 976 "grammar.y" 1922 { 1923 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-3].declarator->begin); 1924 yyval.declarator->params = yystack.l_mark[-1].param_list; 1925 yyval.declarator->func_stack = yystack.l_mark[-3].declarator; 1926 yyval.declarator->head = (yystack.l_mark[-3].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-3].declarator->head; 1927 yyval.declarator->func_def = FUNC_ANSI; 1928 } 1929 break; 1930 case 112: 1931 #line 984 "grammar.y" 1932 { 1933 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].declarator->begin); 1934 yyval.declarator->func_stack = yystack.l_mark[-2].declarator; 1935 yyval.declarator->head = (yystack.l_mark[-2].declarator->func_stack == NULL) ? yyval.declarator : yystack.l_mark[-2].declarator->head; 1936 yyval.declarator->func_def = FUNC_ANSI; 1937 } 1938 break; 1939 case 113: 1940 #line 991 "grammar.y" 1941 { 1942 Declarator *d; 1943 1944 d = new_declarator("", "", yystack.l_mark[-2].text.begin); 1945 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-2].text.begin); 1946 yyval.declarator->params = yystack.l_mark[-1].param_list; 1947 yyval.declarator->func_stack = d; 1948 yyval.declarator->head = yyval.declarator; 1949 yyval.declarator->func_def = FUNC_ANSI; 1950 } 1951 break; 1952 case 114: 1953 #line 1002 "grammar.y" 1954 { 1955 Declarator *d; 1956 1957 d = new_declarator("", "", yystack.l_mark[-1].text.begin); 1958 yyval.declarator = new_declarator("%s()", "", yystack.l_mark[-1].text.begin); 1959 yyval.declarator->func_stack = d; 1960 yyval.declarator->head = yyval.declarator; 1961 yyval.declarator->func_def = FUNC_ANSI; 1962 } 1963 break; 1964 #line 1965 "grammar.tab.c" 1965 } 1966 yystack.s_mark -= yym; 1967 yystate = *yystack.s_mark; 1968 yystack.l_mark -= yym; 1969 yym = yylhs[yyn]; 1970 if (yystate == 0 && yym == 0) 1971 { 1972 #if YYDEBUG 1973 if (yydebug) 1974 printf("%sdebug: after reduction, shifting from state 0 to\ 1975 state %d\n", YYPREFIX, YYFINAL); 1976 #endif 1977 yystate = YYFINAL; 1978 *++yystack.s_mark = YYFINAL; 1979 *++yystack.l_mark = yyval; 1980 if (yychar < 0) 1981 { 1982 yychar = YYLEX; 1983 if (yychar < 0) yychar = YYEOF; 1984 #if YYDEBUG 1985 if (yydebug) 1986 { 1987 if ((yys = yyname[YYTRANSLATE(yychar)]) == NULL) yys = yyname[YYUNDFTOKEN]; 1988 printf("%sdebug: state %d, reading %d (%s)\n", 1989 YYPREFIX, YYFINAL, yychar, yys); 1990 } 1991 #endif 1992 } 1993 if (yychar == YYEOF) goto yyaccept; 1994 goto yyloop; 1995 } 1996 if (((yyn = yygindex[yym]) != 0) && (yyn += yystate) >= 0 && 1997 yyn <= YYTABLESIZE && yycheck[yyn] == (YYINT) yystate) 1998 yystate = yytable[yyn]; 1999 else 2000 yystate = yydgoto[yym]; 2001 #if YYDEBUG 2002 if (yydebug) 2003 printf("%sdebug: after reduction, shifting from state %d \ 2004 to state %d\n", YYPREFIX, *yystack.s_mark, yystate); 2005 #endif 2006 if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; 2007 *++yystack.s_mark = (YYINT) yystate; 2008 *++yystack.l_mark = yyval; 2009 goto yyloop; 2010 2011 yyoverflow: 2012 YYERROR_CALL("yacc stack overflow"); 2013 2014 yyabort: 2015 yyfreestack(&yystack); 2016 return (1); 2017 2018 yyaccept: 2019 yyfreestack(&yystack); 2020 return (0); 2021 } 2022