xref: /freebsd/contrib/byacc/test/grammar.y (revision b53bb29fed3e69c2561e93c1aee32b92ffe9117f)
1*b53bb29fSJung-uk Kim /* $Id: grammar.y,v 1.7 2020/03/30 23:55:49 tom Exp $
298e903e7SBaptiste Daroussin  *
398e903e7SBaptiste Daroussin  * yacc grammar for C function prototype generator
498e903e7SBaptiste Daroussin  * This was derived from the grammar in Appendix A of
598e903e7SBaptiste Daroussin  * "The C Programming Language" by Kernighan and Ritchie.
698e903e7SBaptiste Daroussin  */
798e903e7SBaptiste Daroussin %expect 1
898e903e7SBaptiste Daroussin %{
998e903e7SBaptiste Daroussin #ifdef YYBISON
1098e903e7SBaptiste Daroussin #include <stdlib.h>
1198e903e7SBaptiste Daroussin #define YYSTYPE_IS_DECLARED
1298e903e7SBaptiste Daroussin #define yyerror yaccError
1398e903e7SBaptiste Daroussin #endif
1498e903e7SBaptiste Daroussin 
1598e903e7SBaptiste Daroussin #if defined(YYBISON) || !defined(YYBYACC)
1698e903e7SBaptiste Daroussin static void yyerror(const char *s);
1798e903e7SBaptiste Daroussin #endif
1898e903e7SBaptiste Daroussin %}
1998e903e7SBaptiste Daroussin 
2098e903e7SBaptiste Daroussin %token <text> '(' '*' '&'
2198e903e7SBaptiste Daroussin 	/* identifiers that are not reserved words */
2298e903e7SBaptiste Daroussin 	T_IDENTIFIER T_TYPEDEF_NAME T_DEFINE_NAME
2398e903e7SBaptiste Daroussin 
2498e903e7SBaptiste Daroussin 	/* storage class */
2598e903e7SBaptiste Daroussin 	T_AUTO T_EXTERN T_REGISTER T_STATIC T_TYPEDEF
2698e903e7SBaptiste Daroussin 	/* This keyword included for compatibility with C++. */
2798e903e7SBaptiste Daroussin 	T_INLINE
2898e903e7SBaptiste Daroussin 	/* This keyword included for compatibility with GCC */
2998e903e7SBaptiste Daroussin 	T_EXTENSION
3098e903e7SBaptiste Daroussin 
3198e903e7SBaptiste Daroussin 	/* type specifiers */
3298e903e7SBaptiste Daroussin 	T_CHAR T_DOUBLE T_FLOAT T_INT T_VOID
3398e903e7SBaptiste Daroussin 	T_LONG T_SHORT T_SIGNED T_UNSIGNED
3498e903e7SBaptiste Daroussin 	T_ENUM T_STRUCT T_UNION
3598e903e7SBaptiste Daroussin 	/* C9X new types */
3698e903e7SBaptiste Daroussin 	T_Bool T_Complex T_Imaginary
3798e903e7SBaptiste Daroussin 
3898e903e7SBaptiste Daroussin 	/* type qualifiers */
3998e903e7SBaptiste Daroussin 	T_TYPE_QUALIFIER
4098e903e7SBaptiste Daroussin 
4198e903e7SBaptiste Daroussin 	/* paired square brackets and everything between them: [ ... ] */
4298e903e7SBaptiste Daroussin 	T_BRACKETS
4398e903e7SBaptiste Daroussin 
4498e903e7SBaptiste Daroussin %token
4598e903e7SBaptiste Daroussin 	/* left brace */
4698e903e7SBaptiste Daroussin 	T_LBRACE
4798e903e7SBaptiste Daroussin 	/* all input to the matching right brace */
4898e903e7SBaptiste Daroussin 	T_MATCHRBRACE
4998e903e7SBaptiste Daroussin 
5098e903e7SBaptiste Daroussin 	/* three periods */
5198e903e7SBaptiste Daroussin 	T_ELLIPSIS
5298e903e7SBaptiste Daroussin 
5398e903e7SBaptiste Daroussin 	/* constant expression or paired braces following an equal sign */
5498e903e7SBaptiste Daroussin 	T_INITIALIZER
5598e903e7SBaptiste Daroussin 
5698e903e7SBaptiste Daroussin 	/* string literal */
5798e903e7SBaptiste Daroussin 	T_STRING_LITERAL
5898e903e7SBaptiste Daroussin 
5998e903e7SBaptiste Daroussin 	/* asm */
6098e903e7SBaptiste Daroussin 	T_ASM
6198e903e7SBaptiste Daroussin 	/* ( "string literal" ) following asm keyword */
6298e903e7SBaptiste Daroussin 	T_ASMARG
6398e903e7SBaptiste Daroussin 
6498e903e7SBaptiste Daroussin 	/* va_dcl from <varargs.h> */
6598e903e7SBaptiste Daroussin 	T_VA_DCL
6698e903e7SBaptiste Daroussin 
6798e903e7SBaptiste Daroussin %type <decl_spec> decl_specifiers decl_specifier
6898e903e7SBaptiste Daroussin %type <decl_spec> storage_class type_specifier type_qualifier
6998e903e7SBaptiste Daroussin %type <decl_spec> struct_or_union_specifier enum_specifier
7098e903e7SBaptiste Daroussin %type <decl_list> init_declarator_list
7198e903e7SBaptiste Daroussin %type <declarator> init_declarator declarator direct_declarator
7298e903e7SBaptiste Daroussin %type <declarator> abs_declarator direct_abs_declarator
7398e903e7SBaptiste Daroussin %type <param_list> parameter_type_list parameter_list
7498e903e7SBaptiste Daroussin %type <parameter> parameter_declaration
7598e903e7SBaptiste Daroussin %type <param_list> opt_identifier_list identifier_list
7698e903e7SBaptiste Daroussin %type <text> struct_or_union pointer opt_type_qualifiers type_qualifier_list
7798e903e7SBaptiste Daroussin 	any_id identifier_or_ref
7898e903e7SBaptiste Daroussin %type <text> enumeration
7998e903e7SBaptiste Daroussin 
8098e903e7SBaptiste Daroussin %{
8198e903e7SBaptiste Daroussin #include <stdio.h>
8298e903e7SBaptiste Daroussin #include <ctype.h>
8398e903e7SBaptiste Daroussin #include <string.h>
8498e903e7SBaptiste Daroussin 
8598e903e7SBaptiste Daroussin #define OPT_LINTLIBRARY 1
8698e903e7SBaptiste Daroussin 
8798e903e7SBaptiste Daroussin #ifndef TRUE
8898e903e7SBaptiste Daroussin #define	TRUE	(1)
8998e903e7SBaptiste Daroussin #endif
9098e903e7SBaptiste Daroussin 
9198e903e7SBaptiste Daroussin #ifndef FALSE
9298e903e7SBaptiste Daroussin #define	FALSE	(0)
9398e903e7SBaptiste Daroussin #endif
9498e903e7SBaptiste Daroussin 
9598e903e7SBaptiste Daroussin /* #include "cproto.h" */
9698e903e7SBaptiste Daroussin #define MAX_TEXT_SIZE 1024
97*b53bb29fSJung-uk Kim #define TEXT_LEN (MAX_TEXT_SIZE / 2 - 3)
9898e903e7SBaptiste Daroussin 
9998e903e7SBaptiste Daroussin /* Prototype styles */
10098e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
10198e903e7SBaptiste Daroussin #define PROTO_ANSI_LLIB		-2	/* form ANSI lint-library source */
10298e903e7SBaptiste Daroussin #define PROTO_LINTLIBRARY	-1	/* form lint-library source */
10398e903e7SBaptiste Daroussin #endif
10498e903e7SBaptiste Daroussin #define PROTO_NONE		0	/* do not output any prototypes */
10598e903e7SBaptiste Daroussin #define PROTO_TRADITIONAL	1	/* comment out parameters */
10698e903e7SBaptiste Daroussin #define PROTO_ABSTRACT		2	/* comment out parameter names */
10798e903e7SBaptiste Daroussin #define PROTO_ANSI		3	/* ANSI C prototype */
10898e903e7SBaptiste Daroussin 
10998e903e7SBaptiste Daroussin typedef int PrototypeStyle;
11098e903e7SBaptiste Daroussin 
11198e903e7SBaptiste Daroussin typedef char boolean;
11298e903e7SBaptiste Daroussin 
11398e903e7SBaptiste Daroussin extern boolean types_out;
11498e903e7SBaptiste Daroussin extern PrototypeStyle proto_style;
11598e903e7SBaptiste Daroussin 
11698e903e7SBaptiste Daroussin #define ansiLintLibrary() (proto_style == PROTO_ANSI_LLIB)
11798e903e7SBaptiste Daroussin #define knrLintLibrary()  (proto_style == PROTO_LINTLIBRARY)
11898e903e7SBaptiste Daroussin #define lintLibrary()     (knrLintLibrary() || ansiLintLibrary())
11998e903e7SBaptiste Daroussin 
12098e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
12198e903e7SBaptiste Daroussin #define FUNC_UNKNOWN		-1	/* unspecified */
12298e903e7SBaptiste Daroussin #else
12398e903e7SBaptiste Daroussin #define FUNC_UNKNOWN		0	/* unspecified (same as FUNC_NONE) */
12498e903e7SBaptiste Daroussin #endif
12598e903e7SBaptiste Daroussin #define FUNC_NONE		0	/* not a function definition */
12698e903e7SBaptiste Daroussin #define FUNC_TRADITIONAL	1	/* traditional style */
12798e903e7SBaptiste Daroussin #define FUNC_ANSI		2	/* ANSI style */
12898e903e7SBaptiste Daroussin #define FUNC_BOTH		3	/* both styles */
12998e903e7SBaptiste Daroussin 
13098e903e7SBaptiste Daroussin typedef int FuncDefStyle;
13198e903e7SBaptiste Daroussin 
13298e903e7SBaptiste Daroussin /* Source file text */
13398e903e7SBaptiste Daroussin typedef struct text {
13498e903e7SBaptiste Daroussin     char text[MAX_TEXT_SIZE];	/* source text */
13598e903e7SBaptiste Daroussin     long begin; 		/* offset in temporary file */
13698e903e7SBaptiste Daroussin } Text;
13798e903e7SBaptiste Daroussin 
13898e903e7SBaptiste Daroussin /* Declaration specifier flags */
13998e903e7SBaptiste Daroussin #define DS_NONE 	0	/* default */
14098e903e7SBaptiste Daroussin #define DS_EXTERN	1	/* contains "extern" specifier */
14198e903e7SBaptiste Daroussin #define DS_STATIC	2	/* contains "static" specifier */
14298e903e7SBaptiste Daroussin #define DS_CHAR 	4	/* contains "char" type specifier */
14398e903e7SBaptiste Daroussin #define DS_SHORT	8	/* contains "short" type specifier */
14498e903e7SBaptiste Daroussin #define DS_FLOAT	16	/* contains "float" type specifier */
14598e903e7SBaptiste Daroussin #define DS_INLINE	32	/* contains "inline" specifier */
14698e903e7SBaptiste Daroussin #define DS_JUNK 	64	/* we're not interested in this declaration */
14798e903e7SBaptiste Daroussin 
14898e903e7SBaptiste Daroussin /* This structure stores information about a declaration specifier. */
14998e903e7SBaptiste Daroussin typedef struct decl_spec {
15098e903e7SBaptiste Daroussin     unsigned short flags;	/* flags defined above */
15198e903e7SBaptiste Daroussin     char *text; 		/* source text */
15298e903e7SBaptiste Daroussin     long begin; 		/* offset in temporary file */
15398e903e7SBaptiste Daroussin } DeclSpec;
15498e903e7SBaptiste Daroussin 
15598e903e7SBaptiste Daroussin /* This is a list of function parameters. */
15698e903e7SBaptiste Daroussin typedef struct _ParameterList {
15798e903e7SBaptiste Daroussin     struct parameter *first;	/* pointer to first parameter in list */
15898e903e7SBaptiste Daroussin     struct parameter *last;	/* pointer to last parameter in list */
15998e903e7SBaptiste Daroussin     long begin_comment; 	/* begin offset of comment */
16098e903e7SBaptiste Daroussin     long end_comment;		/* end offset of comment */
16198e903e7SBaptiste Daroussin     char *comment;		/* comment at start of parameter list */
16298e903e7SBaptiste Daroussin } ParameterList;
16398e903e7SBaptiste Daroussin 
16498e903e7SBaptiste Daroussin /* This structure stores information about a declarator. */
16598e903e7SBaptiste Daroussin typedef struct _Declarator {
16698e903e7SBaptiste Daroussin     char *name; 			/* name of variable or function */
16798e903e7SBaptiste Daroussin     char *text; 			/* source text */
16898e903e7SBaptiste Daroussin     long begin; 			/* offset in temporary file */
16998e903e7SBaptiste Daroussin     long begin_comment; 		/* begin offset of comment */
17098e903e7SBaptiste Daroussin     long end_comment;			/* end offset of comment */
17198e903e7SBaptiste Daroussin     FuncDefStyle func_def;		/* style of function definition */
17298e903e7SBaptiste Daroussin     ParameterList params;		/* function parameters */
17398e903e7SBaptiste Daroussin     boolean pointer;			/* TRUE if it declares a pointer */
17498e903e7SBaptiste Daroussin     struct _Declarator *head;		/* head function declarator */
17598e903e7SBaptiste Daroussin     struct _Declarator *func_stack;	/* stack of function declarators */
17698e903e7SBaptiste Daroussin     struct _Declarator *next;		/* next declarator in list */
17798e903e7SBaptiste Daroussin } Declarator;
17898e903e7SBaptiste Daroussin 
17998e903e7SBaptiste Daroussin /* This structure stores information about a function parameter. */
18098e903e7SBaptiste Daroussin typedef struct parameter {
18198e903e7SBaptiste Daroussin     struct parameter *next;	/* next parameter in list */
18298e903e7SBaptiste Daroussin     DeclSpec decl_spec;
18398e903e7SBaptiste Daroussin     Declarator *declarator;
18498e903e7SBaptiste Daroussin     char *comment;		/* comment following the parameter */
18598e903e7SBaptiste Daroussin } Parameter;
18698e903e7SBaptiste Daroussin 
18798e903e7SBaptiste Daroussin /* This is a list of declarators. */
18898e903e7SBaptiste Daroussin typedef struct declarator_list {
18998e903e7SBaptiste Daroussin     Declarator *first;		/* pointer to first declarator in list */
19098e903e7SBaptiste Daroussin     Declarator *last;		/* pointer to last declarator in list */
19198e903e7SBaptiste Daroussin } DeclaratorList;
19298e903e7SBaptiste Daroussin 
19398e903e7SBaptiste Daroussin /* #include "symbol.h" */
19498e903e7SBaptiste Daroussin typedef struct symbol {
19598e903e7SBaptiste Daroussin     struct symbol *next;	/* next symbol in list */
19698e903e7SBaptiste Daroussin     char *name; 		/* name of symbol */
19798e903e7SBaptiste Daroussin     char *value;		/* value of symbol (for defines) */
19898e903e7SBaptiste Daroussin     short flags;		/* symbol attributes */
19998e903e7SBaptiste Daroussin } Symbol;
20098e903e7SBaptiste Daroussin 
20198e903e7SBaptiste Daroussin /* parser stack entry type */
20298e903e7SBaptiste Daroussin typedef union {
20398e903e7SBaptiste Daroussin     Text text;
20498e903e7SBaptiste Daroussin     DeclSpec decl_spec;
20598e903e7SBaptiste Daroussin     Parameter *parameter;
20698e903e7SBaptiste Daroussin     ParameterList param_list;
20798e903e7SBaptiste Daroussin     Declarator *declarator;
20898e903e7SBaptiste Daroussin     DeclaratorList decl_list;
20998e903e7SBaptiste Daroussin } YYSTYPE;
21098e903e7SBaptiste Daroussin 
21198e903e7SBaptiste Daroussin /* The hash table length should be a prime number. */
21298e903e7SBaptiste Daroussin #define SYM_MAX_HASH 251
21398e903e7SBaptiste Daroussin 
21498e903e7SBaptiste Daroussin typedef struct symbol_table {
21598e903e7SBaptiste Daroussin     Symbol *bucket[SYM_MAX_HASH];	/* hash buckets */
21698e903e7SBaptiste Daroussin } SymbolTable;
21798e903e7SBaptiste Daroussin 
21898e903e7SBaptiste Daroussin extern SymbolTable *new_symbol_table	/* Create symbol table */
21998e903e7SBaptiste Daroussin 	(void);
22098e903e7SBaptiste Daroussin extern void free_symbol_table		/* Destroy symbol table */
22198e903e7SBaptiste Daroussin 	(SymbolTable *s);
22298e903e7SBaptiste Daroussin extern Symbol *find_symbol		/* Lookup symbol name */
22398e903e7SBaptiste Daroussin 	(SymbolTable *s, const char *n);
22498e903e7SBaptiste Daroussin extern Symbol *new_symbol		/* Define new symbol */
22598e903e7SBaptiste Daroussin 	(SymbolTable *s, const char *n, const char *v, int f);
22698e903e7SBaptiste Daroussin 
22798e903e7SBaptiste Daroussin /* #include "semantic.h" */
22898e903e7SBaptiste Daroussin extern void new_decl_spec (DeclSpec *, const char *, long, int);
22998e903e7SBaptiste Daroussin extern void free_decl_spec (DeclSpec *);
23098e903e7SBaptiste Daroussin extern void join_decl_specs (DeclSpec *, DeclSpec *, DeclSpec *);
23198e903e7SBaptiste Daroussin extern void check_untagged (DeclSpec *);
23298e903e7SBaptiste Daroussin extern Declarator *new_declarator (const char *, const char *, long);
23398e903e7SBaptiste Daroussin extern void free_declarator (Declarator *);
23498e903e7SBaptiste Daroussin extern void new_decl_list (DeclaratorList *, Declarator *);
23598e903e7SBaptiste Daroussin extern void free_decl_list (DeclaratorList *);
23698e903e7SBaptiste Daroussin extern void add_decl_list (DeclaratorList *, DeclaratorList *, Declarator *);
23798e903e7SBaptiste Daroussin extern Parameter *new_parameter (DeclSpec *, Declarator *);
23898e903e7SBaptiste Daroussin extern void free_parameter (Parameter *);
23998e903e7SBaptiste Daroussin extern void new_param_list (ParameterList *, Parameter *);
24098e903e7SBaptiste Daroussin extern void free_param_list (ParameterList *);
24198e903e7SBaptiste Daroussin extern void add_param_list (ParameterList *, ParameterList *, Parameter *);
24298e903e7SBaptiste Daroussin extern void new_ident_list (ParameterList *);
24398e903e7SBaptiste Daroussin extern void add_ident_list (ParameterList *, ParameterList *, const char *);
24498e903e7SBaptiste Daroussin extern void set_param_types (ParameterList *, DeclSpec *, DeclaratorList *);
24598e903e7SBaptiste Daroussin extern void gen_declarations (DeclSpec *, DeclaratorList *);
24698e903e7SBaptiste Daroussin extern void gen_prototype (DeclSpec *, Declarator *);
24798e903e7SBaptiste Daroussin extern void gen_func_declarator (Declarator *);
24898e903e7SBaptiste Daroussin extern void gen_func_definition (DeclSpec *, Declarator *);
24998e903e7SBaptiste Daroussin 
25098e903e7SBaptiste Daroussin extern void init_parser     (void);
25198e903e7SBaptiste Daroussin extern void process_file    (FILE *infile, char *name);
25298e903e7SBaptiste Daroussin extern char *cur_text       (void);
25398e903e7SBaptiste Daroussin extern char *cur_file_name  (void);
25498e903e7SBaptiste Daroussin extern char *implied_typedef (void);
25598e903e7SBaptiste Daroussin extern void include_file    (char *name, int convert);
25698e903e7SBaptiste Daroussin extern char *supply_parm    (int count);
25798e903e7SBaptiste Daroussin extern char *xstrdup        (const char *);
25898e903e7SBaptiste Daroussin extern int already_declared (char *name);
25998e903e7SBaptiste Daroussin extern int is_actual_func   (Declarator *d);
26098e903e7SBaptiste Daroussin extern int lint_ellipsis    (Parameter *p);
26198e903e7SBaptiste Daroussin extern int want_typedef     (void);
26298e903e7SBaptiste Daroussin extern void begin_tracking  (void);
26398e903e7SBaptiste Daroussin extern void begin_typedef   (void);
26498e903e7SBaptiste Daroussin extern void copy_typedef    (char *s);
26598e903e7SBaptiste Daroussin extern void ellipsis_varargs (Declarator *d);
26698e903e7SBaptiste Daroussin extern void end_typedef     (void);
26798e903e7SBaptiste Daroussin extern void flush_varargs   (void);
26898e903e7SBaptiste Daroussin extern void fmt_library     (int code);
26998e903e7SBaptiste Daroussin extern void imply_typedef   (const char *s);
27098e903e7SBaptiste Daroussin extern void indent          (FILE *outf);
27198e903e7SBaptiste Daroussin extern void put_blankline   (FILE *outf);
27298e903e7SBaptiste Daroussin extern void put_body        (FILE *outf, DeclSpec *decl_spec, Declarator *declarator);
27398e903e7SBaptiste Daroussin extern void put_char        (FILE *outf, int c);
27498e903e7SBaptiste Daroussin extern void put_error       (void);
27598e903e7SBaptiste Daroussin extern void put_newline     (FILE *outf);
27698e903e7SBaptiste Daroussin extern void put_padded      (FILE *outf, const char *s);
27798e903e7SBaptiste Daroussin extern void put_string      (FILE *outf, const char *s);
27898e903e7SBaptiste Daroussin extern void track_in        (void);
27998e903e7SBaptiste Daroussin 
28098e903e7SBaptiste Daroussin extern boolean file_comments;
28198e903e7SBaptiste Daroussin extern FuncDefStyle func_style;
28298e903e7SBaptiste Daroussin extern char base_file[];
28398e903e7SBaptiste Daroussin 
28498e903e7SBaptiste Daroussin extern	int	yylex (void);
28598e903e7SBaptiste Daroussin 
28698e903e7SBaptiste Daroussin /* declaration specifier attributes for the typedef statement currently being
28798e903e7SBaptiste Daroussin  * scanned
28898e903e7SBaptiste Daroussin  */
28998e903e7SBaptiste Daroussin static int cur_decl_spec_flags;
29098e903e7SBaptiste Daroussin 
29198e903e7SBaptiste Daroussin /* pointer to parameter list for the current function definition */
29298e903e7SBaptiste Daroussin static ParameterList *func_params;
29398e903e7SBaptiste Daroussin 
29498e903e7SBaptiste Daroussin /* A parser semantic action sets this pointer to the current declarator in
29598e903e7SBaptiste Daroussin  * a function parameter declaration in order to catch any comments following
29698e903e7SBaptiste Daroussin  * the parameter declaration on the same line.  If the lexer scans a comment
29798e903e7SBaptiste Daroussin  * and <cur_declarator> is not NULL, then the comment is attached to the
29898e903e7SBaptiste Daroussin  * declarator.  To ignore subsequent comments, the lexer sets this to NULL
29998e903e7SBaptiste Daroussin  * after scanning a comment or end of line.
30098e903e7SBaptiste Daroussin  */
30198e903e7SBaptiste Daroussin static Declarator *cur_declarator;
30298e903e7SBaptiste Daroussin 
30398e903e7SBaptiste Daroussin /* temporary string buffer */
30498e903e7SBaptiste Daroussin static char buf[MAX_TEXT_SIZE];
30598e903e7SBaptiste Daroussin 
30698e903e7SBaptiste Daroussin /* table of typedef names */
30798e903e7SBaptiste Daroussin static SymbolTable *typedef_names;
30898e903e7SBaptiste Daroussin 
30998e903e7SBaptiste Daroussin /* table of define names */
31098e903e7SBaptiste Daroussin static SymbolTable *define_names;
31198e903e7SBaptiste Daroussin 
31298e903e7SBaptiste Daroussin /* table of type qualifiers */
31398e903e7SBaptiste Daroussin static SymbolTable *type_qualifiers;
31498e903e7SBaptiste Daroussin 
31598e903e7SBaptiste Daroussin /* information about the current input file */
31698e903e7SBaptiste Daroussin typedef struct {
31798e903e7SBaptiste Daroussin     char *base_name;		/* base input file name */
31898e903e7SBaptiste Daroussin     char *file_name;		/* current file name */
31998e903e7SBaptiste Daroussin     FILE *file; 		/* input file */
32098e903e7SBaptiste Daroussin     unsigned line_num;		/* current line number in input file */
32198e903e7SBaptiste Daroussin     FILE *tmp_file;		/* temporary file */
32298e903e7SBaptiste Daroussin     long begin_comment; 	/* tmp file offset after last written ) or ; */
32398e903e7SBaptiste Daroussin     long end_comment;		/* tmp file offset after last comment */
32498e903e7SBaptiste Daroussin     boolean convert;		/* if TRUE, convert function definitions */
32598e903e7SBaptiste Daroussin     boolean changed;		/* TRUE if conversion done in this file */
32698e903e7SBaptiste Daroussin } IncludeStack;
32798e903e7SBaptiste Daroussin 
32898e903e7SBaptiste Daroussin static IncludeStack *cur_file;	/* current input file */
32998e903e7SBaptiste Daroussin 
33098e903e7SBaptiste Daroussin /* #include "yyerror.c" */
33198e903e7SBaptiste Daroussin 
33298e903e7SBaptiste Daroussin static int haveAnsiParam (void);
33398e903e7SBaptiste Daroussin 
33498e903e7SBaptiste Daroussin 
33598e903e7SBaptiste Daroussin /* Flags to enable us to find if a procedure returns a value.
33698e903e7SBaptiste Daroussin  */
33798e903e7SBaptiste Daroussin static int return_val;	/* nonzero on BRACES iff return-expression found */
33898e903e7SBaptiste Daroussin 
33998e903e7SBaptiste Daroussin static const char *
dft_decl_spec(void)34098e903e7SBaptiste Daroussin dft_decl_spec (void)
34198e903e7SBaptiste Daroussin {
34298e903e7SBaptiste Daroussin     return (lintLibrary() && !return_val) ? "void" : "int";
34398e903e7SBaptiste Daroussin }
34498e903e7SBaptiste Daroussin 
34598e903e7SBaptiste Daroussin static int
haveAnsiParam(void)34698e903e7SBaptiste Daroussin haveAnsiParam (void)
34798e903e7SBaptiste Daroussin {
34898e903e7SBaptiste Daroussin     Parameter *p;
34998e903e7SBaptiste Daroussin     if (func_params != 0) {
35098e903e7SBaptiste Daroussin 	for (p = func_params->first; p != 0; p = p->next) {
35198e903e7SBaptiste Daroussin 	    if (p->declarator->func_def == FUNC_ANSI) {
35298e903e7SBaptiste Daroussin 		return TRUE;
35398e903e7SBaptiste Daroussin 	    }
35498e903e7SBaptiste Daroussin 	}
35598e903e7SBaptiste Daroussin     }
35698e903e7SBaptiste Daroussin     return FALSE;
35798e903e7SBaptiste Daroussin }
35898e903e7SBaptiste Daroussin %}
35998e903e7SBaptiste Daroussin %%
36098e903e7SBaptiste Daroussin 
36198e903e7SBaptiste Daroussin program
36298e903e7SBaptiste Daroussin 	: /* empty */
36398e903e7SBaptiste Daroussin 	| translation_unit
36498e903e7SBaptiste Daroussin 	;
36598e903e7SBaptiste Daroussin 
36698e903e7SBaptiste Daroussin translation_unit
36798e903e7SBaptiste Daroussin 	: external_declaration
36898e903e7SBaptiste Daroussin 	| translation_unit external_declaration
36998e903e7SBaptiste Daroussin 	;
37098e903e7SBaptiste Daroussin 
37198e903e7SBaptiste Daroussin external_declaration
37298e903e7SBaptiste Daroussin 	: declaration
37398e903e7SBaptiste Daroussin 	| function_definition
37498e903e7SBaptiste Daroussin 	| ';'
37598e903e7SBaptiste Daroussin 	| linkage_specification
37698e903e7SBaptiste Daroussin 	| T_ASM T_ASMARG ';'
37798e903e7SBaptiste Daroussin 	| error T_MATCHRBRACE
37898e903e7SBaptiste Daroussin 	{
37998e903e7SBaptiste Daroussin 	    yyerrok;
38098e903e7SBaptiste Daroussin 	}
38198e903e7SBaptiste Daroussin 	| error ';'
38298e903e7SBaptiste Daroussin 	{
38398e903e7SBaptiste Daroussin 	    yyerrok;
38498e903e7SBaptiste Daroussin 	}
38598e903e7SBaptiste Daroussin 	;
38698e903e7SBaptiste Daroussin 
38798e903e7SBaptiste Daroussin braces
38898e903e7SBaptiste Daroussin 	: T_LBRACE T_MATCHRBRACE
38998e903e7SBaptiste Daroussin 	;
39098e903e7SBaptiste Daroussin 
39198e903e7SBaptiste Daroussin linkage_specification
39298e903e7SBaptiste Daroussin 	: T_EXTERN T_STRING_LITERAL braces
39398e903e7SBaptiste Daroussin 	{
39498e903e7SBaptiste Daroussin 	    /* Provide an empty action here so bison will not complain about
39598e903e7SBaptiste Daroussin 	     * incompatible types in the default action it normally would
39698e903e7SBaptiste Daroussin 	     * have generated.
39798e903e7SBaptiste Daroussin 	     */
39898e903e7SBaptiste Daroussin 	}
39998e903e7SBaptiste Daroussin 	| T_EXTERN T_STRING_LITERAL declaration
40098e903e7SBaptiste Daroussin 	{
40198e903e7SBaptiste Daroussin 	    /* empty */
40298e903e7SBaptiste Daroussin 	}
40398e903e7SBaptiste Daroussin 	;
40498e903e7SBaptiste Daroussin 
40598e903e7SBaptiste Daroussin declaration
40698e903e7SBaptiste Daroussin 	: decl_specifiers ';'
40798e903e7SBaptiste Daroussin 	{
40898e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
40998e903e7SBaptiste Daroussin 	    if (types_out && want_typedef()) {
41098e903e7SBaptiste Daroussin 		gen_declarations(&$1, (DeclaratorList *)0);
41198e903e7SBaptiste Daroussin 		flush_varargs();
41298e903e7SBaptiste Daroussin 	    }
41398e903e7SBaptiste Daroussin #endif
41498e903e7SBaptiste Daroussin 	    free_decl_spec(&$1);
41598e903e7SBaptiste Daroussin 	    end_typedef();
41698e903e7SBaptiste Daroussin 	}
41798e903e7SBaptiste Daroussin 	| decl_specifiers init_declarator_list ';'
41898e903e7SBaptiste Daroussin 	{
41998e903e7SBaptiste Daroussin 	    if (func_params != NULL) {
42098e903e7SBaptiste Daroussin 		set_param_types(func_params, &$1, &$2);
42198e903e7SBaptiste Daroussin 	    } else {
42298e903e7SBaptiste Daroussin 		gen_declarations(&$1, &$2);
42398e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
42498e903e7SBaptiste Daroussin 		flush_varargs();
42598e903e7SBaptiste Daroussin #endif
42698e903e7SBaptiste Daroussin 		free_decl_list(&$2);
42798e903e7SBaptiste Daroussin 	    }
42898e903e7SBaptiste Daroussin 	    free_decl_spec(&$1);
42998e903e7SBaptiste Daroussin 	    end_typedef();
43098e903e7SBaptiste Daroussin 	}
43198e903e7SBaptiste Daroussin 	| any_typedef decl_specifiers
43298e903e7SBaptiste Daroussin 	{
43398e903e7SBaptiste Daroussin 	    cur_decl_spec_flags = $2.flags;
43498e903e7SBaptiste Daroussin 	    free_decl_spec(&$2);
43598e903e7SBaptiste Daroussin 	}
43698e903e7SBaptiste Daroussin 	  opt_declarator_list ';'
43798e903e7SBaptiste Daroussin 	{
43898e903e7SBaptiste Daroussin 	    end_typedef();
43998e903e7SBaptiste Daroussin 	}
44098e903e7SBaptiste Daroussin 	;
44198e903e7SBaptiste Daroussin 
44298e903e7SBaptiste Daroussin any_typedef
44398e903e7SBaptiste Daroussin 	: T_EXTENSION T_TYPEDEF
44498e903e7SBaptiste Daroussin 	{
44598e903e7SBaptiste Daroussin 	    begin_typedef();
44698e903e7SBaptiste Daroussin 	}
44798e903e7SBaptiste Daroussin 	| T_TYPEDEF
44898e903e7SBaptiste Daroussin 	{
44998e903e7SBaptiste Daroussin 	    begin_typedef();
45098e903e7SBaptiste Daroussin 	}
45198e903e7SBaptiste Daroussin 	;
45298e903e7SBaptiste Daroussin 
45398e903e7SBaptiste Daroussin opt_declarator_list
45498e903e7SBaptiste Daroussin 	: /* empty */
45598e903e7SBaptiste Daroussin 	| declarator_list
45698e903e7SBaptiste Daroussin 	;
45798e903e7SBaptiste Daroussin 
45898e903e7SBaptiste Daroussin declarator_list
45998e903e7SBaptiste Daroussin 	: declarator
46098e903e7SBaptiste Daroussin 	{
46198e903e7SBaptiste Daroussin 	    int flags = cur_decl_spec_flags;
46298e903e7SBaptiste Daroussin 
46398e903e7SBaptiste Daroussin 	    /* If the typedef is a pointer type, then reset the short type
46498e903e7SBaptiste Daroussin 	     * flags so it does not get promoted.
46598e903e7SBaptiste Daroussin 	     */
46698e903e7SBaptiste Daroussin 	    if (strcmp($1->text, $1->name) != 0)
46798e903e7SBaptiste Daroussin 		flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT);
46898e903e7SBaptiste Daroussin 	    new_symbol(typedef_names, $1->name, NULL, flags);
46998e903e7SBaptiste Daroussin 	    free_declarator($1);
47098e903e7SBaptiste Daroussin 	}
47198e903e7SBaptiste Daroussin 	| declarator_list ',' declarator
47298e903e7SBaptiste Daroussin 	{
47398e903e7SBaptiste Daroussin 	    int flags = cur_decl_spec_flags;
47498e903e7SBaptiste Daroussin 
47598e903e7SBaptiste Daroussin 	    if (strcmp($3->text, $3->name) != 0)
47698e903e7SBaptiste Daroussin 		flags &= ~(DS_CHAR | DS_SHORT | DS_FLOAT);
47798e903e7SBaptiste Daroussin 	    new_symbol(typedef_names, $3->name, NULL, flags);
47898e903e7SBaptiste Daroussin 	    free_declarator($3);
47998e903e7SBaptiste Daroussin 	}
48098e903e7SBaptiste Daroussin 	;
48198e903e7SBaptiste Daroussin 
48298e903e7SBaptiste Daroussin function_definition
48398e903e7SBaptiste Daroussin 	: decl_specifiers declarator
48498e903e7SBaptiste Daroussin 	{
48598e903e7SBaptiste Daroussin 	    check_untagged(&$1);
48698e903e7SBaptiste Daroussin 	    if ($2->func_def == FUNC_NONE) {
48798e903e7SBaptiste Daroussin 		yyerror("syntax error");
48898e903e7SBaptiste Daroussin 		YYERROR;
48998e903e7SBaptiste Daroussin 	    }
49098e903e7SBaptiste Daroussin 	    func_params = &($2->head->params);
49198e903e7SBaptiste Daroussin 	    func_params->begin_comment = cur_file->begin_comment;
49298e903e7SBaptiste Daroussin 	    func_params->end_comment = cur_file->end_comment;
49398e903e7SBaptiste Daroussin 	}
49498e903e7SBaptiste Daroussin 	  opt_declaration_list T_LBRACE
49598e903e7SBaptiste Daroussin 	{
49698e903e7SBaptiste Daroussin 	    /* If we're converting to K&R and we've got a nominally K&R
49798e903e7SBaptiste Daroussin 	     * function which has a parameter which is ANSI (i.e., a prototyped
49898e903e7SBaptiste Daroussin 	     * function pointer), then we must override the deciphered value of
49998e903e7SBaptiste Daroussin 	     * 'func_def' so that the parameter will be converted.
50098e903e7SBaptiste Daroussin 	     */
50198e903e7SBaptiste Daroussin 	    if (func_style == FUNC_TRADITIONAL
50298e903e7SBaptiste Daroussin 	     && haveAnsiParam()
50398e903e7SBaptiste Daroussin 	     && $2->head->func_def == func_style) {
50498e903e7SBaptiste Daroussin 		$2->head->func_def = FUNC_BOTH;
50598e903e7SBaptiste Daroussin 	    }
50698e903e7SBaptiste Daroussin 
50798e903e7SBaptiste Daroussin 	    func_params = NULL;
50898e903e7SBaptiste Daroussin 
50998e903e7SBaptiste Daroussin 	    if (cur_file->convert)
51098e903e7SBaptiste Daroussin 		gen_func_definition(&$1, $2);
51198e903e7SBaptiste Daroussin 	    gen_prototype(&$1, $2);
51298e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
51398e903e7SBaptiste Daroussin 	    flush_varargs();
51498e903e7SBaptiste Daroussin #endif
51598e903e7SBaptiste Daroussin 	    free_decl_spec(&$1);
51698e903e7SBaptiste Daroussin 	    free_declarator($2);
51798e903e7SBaptiste Daroussin 	}
51898e903e7SBaptiste Daroussin 	  T_MATCHRBRACE
51998e903e7SBaptiste Daroussin 	| declarator
52098e903e7SBaptiste Daroussin 	{
52198e903e7SBaptiste Daroussin 	    if ($1->func_def == FUNC_NONE) {
52298e903e7SBaptiste Daroussin 		yyerror("syntax error");
52398e903e7SBaptiste Daroussin 		YYERROR;
52498e903e7SBaptiste Daroussin 	    }
52598e903e7SBaptiste Daroussin 	    func_params = &($1->head->params);
52698e903e7SBaptiste Daroussin 	    func_params->begin_comment = cur_file->begin_comment;
52798e903e7SBaptiste Daroussin 	    func_params->end_comment = cur_file->end_comment;
52898e903e7SBaptiste Daroussin 	}
52998e903e7SBaptiste Daroussin 	  opt_declaration_list T_LBRACE T_MATCHRBRACE
53098e903e7SBaptiste Daroussin 	{
53198e903e7SBaptiste Daroussin 	    DeclSpec decl_spec;
53298e903e7SBaptiste Daroussin 
53398e903e7SBaptiste Daroussin 	    func_params = NULL;
53498e903e7SBaptiste Daroussin 
53598e903e7SBaptiste Daroussin 	    new_decl_spec(&decl_spec, dft_decl_spec(), $1->begin, DS_NONE);
53698e903e7SBaptiste Daroussin 	    if (cur_file->convert)
53798e903e7SBaptiste Daroussin 		gen_func_definition(&decl_spec, $1);
53898e903e7SBaptiste Daroussin 	    gen_prototype(&decl_spec, $1);
53998e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
54098e903e7SBaptiste Daroussin 	    flush_varargs();
54198e903e7SBaptiste Daroussin #endif
54298e903e7SBaptiste Daroussin 	    free_decl_spec(&decl_spec);
54398e903e7SBaptiste Daroussin 	    free_declarator($1);
54498e903e7SBaptiste Daroussin 	}
54598e903e7SBaptiste Daroussin 	;
54698e903e7SBaptiste Daroussin 
54798e903e7SBaptiste Daroussin opt_declaration_list
54898e903e7SBaptiste Daroussin 	: /* empty */
54998e903e7SBaptiste Daroussin 	| T_VA_DCL
55098e903e7SBaptiste Daroussin 	| declaration_list
55198e903e7SBaptiste Daroussin 	;
55298e903e7SBaptiste Daroussin 
55398e903e7SBaptiste Daroussin declaration_list
55498e903e7SBaptiste Daroussin 	: declaration
55598e903e7SBaptiste Daroussin 	| declaration_list declaration
55698e903e7SBaptiste Daroussin 	;
55798e903e7SBaptiste Daroussin 
55898e903e7SBaptiste Daroussin decl_specifiers
55998e903e7SBaptiste Daroussin 	: decl_specifier
56098e903e7SBaptiste Daroussin 	| decl_specifiers decl_specifier
56198e903e7SBaptiste Daroussin 	{
56298e903e7SBaptiste Daroussin 	    join_decl_specs(&$$, &$1, &$2);
56398e903e7SBaptiste Daroussin 	    free($1.text);
56498e903e7SBaptiste Daroussin 	    free($2.text);
56598e903e7SBaptiste Daroussin 	}
56698e903e7SBaptiste Daroussin 	;
56798e903e7SBaptiste Daroussin 
56898e903e7SBaptiste Daroussin decl_specifier
56998e903e7SBaptiste Daroussin 	: storage_class
57098e903e7SBaptiste Daroussin 	| type_specifier
57198e903e7SBaptiste Daroussin 	| type_qualifier
57298e903e7SBaptiste Daroussin 	;
57398e903e7SBaptiste Daroussin 
57498e903e7SBaptiste Daroussin storage_class
57598e903e7SBaptiste Daroussin 	: T_AUTO
57698e903e7SBaptiste Daroussin 	{
57798e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
57898e903e7SBaptiste Daroussin 	}
57998e903e7SBaptiste Daroussin 	| T_EXTERN
58098e903e7SBaptiste Daroussin 	{
58198e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_EXTERN);
58298e903e7SBaptiste Daroussin 	}
58398e903e7SBaptiste Daroussin 	| T_REGISTER
58498e903e7SBaptiste Daroussin 	{
58598e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
58698e903e7SBaptiste Daroussin 	}
58798e903e7SBaptiste Daroussin 	| T_STATIC
58898e903e7SBaptiste Daroussin 	{
58998e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_STATIC);
59098e903e7SBaptiste Daroussin 	}
59198e903e7SBaptiste Daroussin 	| T_INLINE
59298e903e7SBaptiste Daroussin 	{
59398e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_INLINE);
59498e903e7SBaptiste Daroussin 	}
59598e903e7SBaptiste Daroussin 	| T_EXTENSION
59698e903e7SBaptiste Daroussin 	{
59798e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_JUNK);
59898e903e7SBaptiste Daroussin 	}
59998e903e7SBaptiste Daroussin 	;
60098e903e7SBaptiste Daroussin 
60198e903e7SBaptiste Daroussin type_specifier
60298e903e7SBaptiste Daroussin 	: T_CHAR
60398e903e7SBaptiste Daroussin 	{
60498e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR);
60598e903e7SBaptiste Daroussin 	}
60698e903e7SBaptiste Daroussin 	| T_DOUBLE
60798e903e7SBaptiste Daroussin 	{
60898e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
60998e903e7SBaptiste Daroussin 	}
61098e903e7SBaptiste Daroussin 	| T_FLOAT
61198e903e7SBaptiste Daroussin 	{
61298e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_FLOAT);
61398e903e7SBaptiste Daroussin 	}
61498e903e7SBaptiste Daroussin 	| T_INT
61598e903e7SBaptiste Daroussin 	{
61698e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
61798e903e7SBaptiste Daroussin 	}
61898e903e7SBaptiste Daroussin 	| T_LONG
61998e903e7SBaptiste Daroussin 	{
62098e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
62198e903e7SBaptiste Daroussin 	}
62298e903e7SBaptiste Daroussin 	| T_SHORT
62398e903e7SBaptiste Daroussin 	{
62498e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_SHORT);
62598e903e7SBaptiste Daroussin 	}
62698e903e7SBaptiste Daroussin 	| T_SIGNED
62798e903e7SBaptiste Daroussin 	{
62898e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
62998e903e7SBaptiste Daroussin 	}
63098e903e7SBaptiste Daroussin 	| T_UNSIGNED
63198e903e7SBaptiste Daroussin 	{
63298e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
63398e903e7SBaptiste Daroussin 	}
63498e903e7SBaptiste Daroussin 	| T_VOID
63598e903e7SBaptiste Daroussin 	{
63698e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
63798e903e7SBaptiste Daroussin 	}
63898e903e7SBaptiste Daroussin 	| T_Bool
63998e903e7SBaptiste Daroussin 	{
64098e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_CHAR);
64198e903e7SBaptiste Daroussin 	}
64298e903e7SBaptiste Daroussin 	| T_Complex
64398e903e7SBaptiste Daroussin 	{
64498e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
64598e903e7SBaptiste Daroussin 	}
64698e903e7SBaptiste Daroussin 	| T_Imaginary
64798e903e7SBaptiste Daroussin 	{
64898e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
64998e903e7SBaptiste Daroussin 	}
65098e903e7SBaptiste Daroussin 	| T_TYPEDEF_NAME
65198e903e7SBaptiste Daroussin 	{
65298e903e7SBaptiste Daroussin 	    Symbol *s;
65398e903e7SBaptiste Daroussin 	    s = find_symbol(typedef_names, $1.text);
65498e903e7SBaptiste Daroussin 	    if (s != NULL)
65598e903e7SBaptiste Daroussin 		new_decl_spec(&$$, $1.text, $1.begin, s->flags);
65698e903e7SBaptiste Daroussin 	}
65798e903e7SBaptiste Daroussin 	| struct_or_union_specifier
65898e903e7SBaptiste Daroussin 	| enum_specifier
65998e903e7SBaptiste Daroussin 	;
66098e903e7SBaptiste Daroussin 
66198e903e7SBaptiste Daroussin type_qualifier
66298e903e7SBaptiste Daroussin 	: T_TYPE_QUALIFIER
66398e903e7SBaptiste Daroussin 	{
66498e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, $1.text, $1.begin, DS_NONE);
66598e903e7SBaptiste Daroussin 	}
66698e903e7SBaptiste Daroussin 	| T_DEFINE_NAME
66798e903e7SBaptiste Daroussin 	{
66898e903e7SBaptiste Daroussin 	    /* This rule allows the <pointer> nonterminal to scan #define
66998e903e7SBaptiste Daroussin 	     * names as if they were type modifiers.
67098e903e7SBaptiste Daroussin 	     */
67198e903e7SBaptiste Daroussin 	    Symbol *s;
67298e903e7SBaptiste Daroussin 	    s = find_symbol(define_names, $1.text);
67398e903e7SBaptiste Daroussin 	    if (s != NULL)
67498e903e7SBaptiste Daroussin 		new_decl_spec(&$$, $1.text, $1.begin, s->flags);
67598e903e7SBaptiste Daroussin 	}
67698e903e7SBaptiste Daroussin 	;
67798e903e7SBaptiste Daroussin 
67898e903e7SBaptiste Daroussin struct_or_union_specifier
67998e903e7SBaptiste Daroussin 	: struct_or_union any_id braces
68098e903e7SBaptiste Daroussin 	{
68198e903e7SBaptiste Daroussin 	    char *s;
68298e903e7SBaptiste Daroussin 	    if ((s = implied_typedef()) == 0)
683*b53bb29fSJung-uk Kim 	        (void)sprintf(s = buf, "%.*s %.*s", TEXT_LEN, $1.text, TEXT_LEN, $2.text);
68498e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, s, $1.begin, DS_NONE);
68598e903e7SBaptiste Daroussin 	}
68698e903e7SBaptiste Daroussin 	| struct_or_union braces
68798e903e7SBaptiste Daroussin 	{
68898e903e7SBaptiste Daroussin 	    char *s;
68998e903e7SBaptiste Daroussin 	    if ((s = implied_typedef()) == 0)
690*b53bb29fSJung-uk Kim 		(void)sprintf(s = buf, "%.*s {}", TEXT_LEN, $1.text);
69198e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, s, $1.begin, DS_NONE);
69298e903e7SBaptiste Daroussin 	}
69398e903e7SBaptiste Daroussin 	| struct_or_union any_id
69498e903e7SBaptiste Daroussin 	{
695*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "%.*s %.*s", TEXT_LEN, $1.text, TEXT_LEN, $2.text);
69698e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, buf, $1.begin, DS_NONE);
69798e903e7SBaptiste Daroussin 	}
69898e903e7SBaptiste Daroussin 	;
69998e903e7SBaptiste Daroussin 
70098e903e7SBaptiste Daroussin struct_or_union
70198e903e7SBaptiste Daroussin 	: T_STRUCT
70298e903e7SBaptiste Daroussin 	{
70398e903e7SBaptiste Daroussin 	    imply_typedef($$.text);
70498e903e7SBaptiste Daroussin 	}
70598e903e7SBaptiste Daroussin 	| T_UNION
70698e903e7SBaptiste Daroussin 	{
70798e903e7SBaptiste Daroussin 	    imply_typedef($$.text);
70898e903e7SBaptiste Daroussin 	}
70998e903e7SBaptiste Daroussin 	;
71098e903e7SBaptiste Daroussin 
71198e903e7SBaptiste Daroussin init_declarator_list
71298e903e7SBaptiste Daroussin 	: init_declarator
71398e903e7SBaptiste Daroussin 	{
71498e903e7SBaptiste Daroussin 	    new_decl_list(&$$, $1);
71598e903e7SBaptiste Daroussin 	}
71698e903e7SBaptiste Daroussin 	| init_declarator_list ',' init_declarator
71798e903e7SBaptiste Daroussin 	{
71898e903e7SBaptiste Daroussin 	    add_decl_list(&$$, &$1, $3);
71998e903e7SBaptiste Daroussin 	}
72098e903e7SBaptiste Daroussin 	;
72198e903e7SBaptiste Daroussin 
72298e903e7SBaptiste Daroussin init_declarator
72398e903e7SBaptiste Daroussin 	: declarator
72498e903e7SBaptiste Daroussin 	{
72598e903e7SBaptiste Daroussin 	    if ($1->func_def != FUNC_NONE && func_params == NULL &&
72698e903e7SBaptiste Daroussin 		func_style == FUNC_TRADITIONAL && cur_file->convert) {
72798e903e7SBaptiste Daroussin 		gen_func_declarator($1);
72898e903e7SBaptiste Daroussin 		fputs(cur_text(), cur_file->tmp_file);
72998e903e7SBaptiste Daroussin 	    }
73098e903e7SBaptiste Daroussin 	    cur_declarator = $$;
73198e903e7SBaptiste Daroussin 	}
73298e903e7SBaptiste Daroussin 	| declarator '='
73398e903e7SBaptiste Daroussin 	{
73498e903e7SBaptiste Daroussin 	    if ($1->func_def != FUNC_NONE && func_params == NULL &&
73598e903e7SBaptiste Daroussin 		func_style == FUNC_TRADITIONAL && cur_file->convert) {
73698e903e7SBaptiste Daroussin 		gen_func_declarator($1);
73798e903e7SBaptiste Daroussin 		fputs(" =", cur_file->tmp_file);
73898e903e7SBaptiste Daroussin 	    }
73998e903e7SBaptiste Daroussin 	}
74098e903e7SBaptiste Daroussin 	  T_INITIALIZER
74198e903e7SBaptiste Daroussin 	;
74298e903e7SBaptiste Daroussin 
74398e903e7SBaptiste Daroussin enum_specifier
74498e903e7SBaptiste Daroussin 	: enumeration any_id braces
74598e903e7SBaptiste Daroussin 	{
74698e903e7SBaptiste Daroussin 	    char *s;
74798e903e7SBaptiste Daroussin 	    if ((s = implied_typedef()) == 0)
748*b53bb29fSJung-uk Kim 		(void)sprintf(s = buf, "enum %.*s", TEXT_LEN, $2.text);
74998e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, s, $1.begin, DS_NONE);
75098e903e7SBaptiste Daroussin 	}
75198e903e7SBaptiste Daroussin 	| enumeration braces
75298e903e7SBaptiste Daroussin 	{
75398e903e7SBaptiste Daroussin 	    char *s;
75498e903e7SBaptiste Daroussin 	    if ((s = implied_typedef()) == 0)
755*b53bb29fSJung-uk Kim 		(void)sprintf(s = buf, "%.*s {}", TEXT_LEN, $1.text);
75698e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, s, $1.begin, DS_NONE);
75798e903e7SBaptiste Daroussin 	}
75898e903e7SBaptiste Daroussin 	| enumeration any_id
75998e903e7SBaptiste Daroussin 	{
760*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "enum %.*s", TEXT_LEN, $2.text);
76198e903e7SBaptiste Daroussin 	    new_decl_spec(&$$, buf, $1.begin, DS_NONE);
76298e903e7SBaptiste Daroussin 	}
76398e903e7SBaptiste Daroussin 	;
76498e903e7SBaptiste Daroussin 
76598e903e7SBaptiste Daroussin enumeration
76698e903e7SBaptiste Daroussin 	: T_ENUM
76798e903e7SBaptiste Daroussin 	{
76898e903e7SBaptiste Daroussin 	    imply_typedef("enum");
76998e903e7SBaptiste Daroussin 	    $$ = $1;
77098e903e7SBaptiste Daroussin 	}
77198e903e7SBaptiste Daroussin 	;
77298e903e7SBaptiste Daroussin 
77398e903e7SBaptiste Daroussin any_id
77498e903e7SBaptiste Daroussin 	: T_IDENTIFIER
77598e903e7SBaptiste Daroussin 	| T_TYPEDEF_NAME
77698e903e7SBaptiste Daroussin 	;
77798e903e7SBaptiste Daroussin 
77898e903e7SBaptiste Daroussin declarator
77998e903e7SBaptiste Daroussin 	: pointer direct_declarator
78098e903e7SBaptiste Daroussin 	{
78198e903e7SBaptiste Daroussin 	    $$ = $2;
782*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "%.*s%.*s", TEXT_LEN, $1.text, TEXT_LEN, $$->text);
78398e903e7SBaptiste Daroussin 	    free($$->text);
78498e903e7SBaptiste Daroussin 	    $$->text = xstrdup(buf);
78598e903e7SBaptiste Daroussin 	    $$->begin = $1.begin;
78698e903e7SBaptiste Daroussin 	    $$->pointer = TRUE;
78798e903e7SBaptiste Daroussin 	}
78898e903e7SBaptiste Daroussin 	| direct_declarator
78998e903e7SBaptiste Daroussin 	;
79098e903e7SBaptiste Daroussin 
79198e903e7SBaptiste Daroussin direct_declarator
79298e903e7SBaptiste Daroussin 	: identifier_or_ref
79398e903e7SBaptiste Daroussin 	{
79498e903e7SBaptiste Daroussin 	    $$ = new_declarator($1.text, $1.text, $1.begin);
79598e903e7SBaptiste Daroussin 	}
79698e903e7SBaptiste Daroussin 	| '(' declarator ')'
79798e903e7SBaptiste Daroussin 	{
79898e903e7SBaptiste Daroussin 	    $$ = $2;
799*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "(%.*s)", TEXT_LEN, $$->text);
80098e903e7SBaptiste Daroussin 	    free($$->text);
80198e903e7SBaptiste Daroussin 	    $$->text = xstrdup(buf);
80298e903e7SBaptiste Daroussin 	    $$->begin = $1.begin;
80398e903e7SBaptiste Daroussin 	}
80498e903e7SBaptiste Daroussin 	| direct_declarator T_BRACKETS
80598e903e7SBaptiste Daroussin 	{
80698e903e7SBaptiste Daroussin 	    $$ = $1;
807*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "%.*s%.*s", TEXT_LEN, $$->text, TEXT_LEN, $2.text);
80898e903e7SBaptiste Daroussin 	    free($$->text);
80998e903e7SBaptiste Daroussin 	    $$->text = xstrdup(buf);
81098e903e7SBaptiste Daroussin 	}
81198e903e7SBaptiste Daroussin 	| direct_declarator '(' parameter_type_list ')'
81298e903e7SBaptiste Daroussin 	{
81398e903e7SBaptiste Daroussin 	    $$ = new_declarator("%s()", $1->name, $1->begin);
81498e903e7SBaptiste Daroussin 	    $$->params = $3;
81598e903e7SBaptiste Daroussin 	    $$->func_stack = $1;
81698e903e7SBaptiste Daroussin 	    $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
81798e903e7SBaptiste Daroussin 	    $$->func_def = FUNC_ANSI;
81898e903e7SBaptiste Daroussin 	}
81998e903e7SBaptiste Daroussin 	| direct_declarator '(' opt_identifier_list ')'
82098e903e7SBaptiste Daroussin 	{
82198e903e7SBaptiste Daroussin 	    $$ = new_declarator("%s()", $1->name, $1->begin);
82298e903e7SBaptiste Daroussin 	    $$->params = $3;
82398e903e7SBaptiste Daroussin 	    $$->func_stack = $1;
82498e903e7SBaptiste Daroussin 	    $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
82598e903e7SBaptiste Daroussin 	    $$->func_def = FUNC_TRADITIONAL;
82698e903e7SBaptiste Daroussin 	}
82798e903e7SBaptiste Daroussin 	;
82898e903e7SBaptiste Daroussin 
82998e903e7SBaptiste Daroussin pointer
83098e903e7SBaptiste Daroussin 	: '*' opt_type_qualifiers
83198e903e7SBaptiste Daroussin 	{
832*b53bb29fSJung-uk Kim 	    (void)sprintf($$.text, "*%.*s", TEXT_LEN, $2.text);
83398e903e7SBaptiste Daroussin 	    $$.begin = $1.begin;
83498e903e7SBaptiste Daroussin 	}
83598e903e7SBaptiste Daroussin 	| '*' opt_type_qualifiers pointer
83698e903e7SBaptiste Daroussin 	{
837*b53bb29fSJung-uk Kim 	    (void)sprintf($$.text, "*%.*s%.*s", TEXT_LEN, $2.text, TEXT_LEN, $3.text);
83898e903e7SBaptiste Daroussin 	    $$.begin = $1.begin;
83998e903e7SBaptiste Daroussin 	}
84098e903e7SBaptiste Daroussin 	;
84198e903e7SBaptiste Daroussin 
84298e903e7SBaptiste Daroussin opt_type_qualifiers
84398e903e7SBaptiste Daroussin 	: /* empty */
84498e903e7SBaptiste Daroussin 	{
84598e903e7SBaptiste Daroussin 	    strcpy($$.text, "");
84698e903e7SBaptiste Daroussin 	    $$.begin = 0L;
84798e903e7SBaptiste Daroussin 	}
84898e903e7SBaptiste Daroussin 	| type_qualifier_list
84998e903e7SBaptiste Daroussin 	;
85098e903e7SBaptiste Daroussin 
85198e903e7SBaptiste Daroussin type_qualifier_list
85298e903e7SBaptiste Daroussin 	: type_qualifier
85398e903e7SBaptiste Daroussin 	{
85498e903e7SBaptiste Daroussin 	    (void)sprintf($$.text, "%s ", $1.text);
85598e903e7SBaptiste Daroussin 	    $$.begin = $1.begin;
85698e903e7SBaptiste Daroussin 	    free($1.text);
85798e903e7SBaptiste Daroussin 	}
85898e903e7SBaptiste Daroussin 	| type_qualifier_list type_qualifier
85998e903e7SBaptiste Daroussin 	{
860*b53bb29fSJung-uk Kim 	    (void)sprintf($$.text, "%.*s%.*s ", TEXT_LEN, $1.text, TEXT_LEN, $2.text);
86198e903e7SBaptiste Daroussin 	    $$.begin = $1.begin;
86298e903e7SBaptiste Daroussin 	    free($2.text);
86398e903e7SBaptiste Daroussin 	}
86498e903e7SBaptiste Daroussin 	;
86598e903e7SBaptiste Daroussin 
86698e903e7SBaptiste Daroussin parameter_type_list
86798e903e7SBaptiste Daroussin 	: parameter_list
86898e903e7SBaptiste Daroussin 	| parameter_list ',' T_ELLIPSIS
86998e903e7SBaptiste Daroussin 	{
87098e903e7SBaptiste Daroussin 	    add_ident_list(&$$, &$1, "...");
87198e903e7SBaptiste Daroussin 	}
87298e903e7SBaptiste Daroussin 	;
87398e903e7SBaptiste Daroussin 
87498e903e7SBaptiste Daroussin parameter_list
87598e903e7SBaptiste Daroussin 	: parameter_declaration
87698e903e7SBaptiste Daroussin 	{
87798e903e7SBaptiste Daroussin 	    new_param_list(&$$, $1);
87898e903e7SBaptiste Daroussin 	}
87998e903e7SBaptiste Daroussin 	| parameter_list ',' parameter_declaration
88098e903e7SBaptiste Daroussin 	{
88198e903e7SBaptiste Daroussin 	    add_param_list(&$$, &$1, $3);
88298e903e7SBaptiste Daroussin 	}
88398e903e7SBaptiste Daroussin 	;
88498e903e7SBaptiste Daroussin 
88598e903e7SBaptiste Daroussin parameter_declaration
88698e903e7SBaptiste Daroussin 	: decl_specifiers declarator
88798e903e7SBaptiste Daroussin 	{
88898e903e7SBaptiste Daroussin 	    check_untagged(&$1);
88998e903e7SBaptiste Daroussin 	    $$ = new_parameter(&$1, $2);
89098e903e7SBaptiste Daroussin 	}
89198e903e7SBaptiste Daroussin 	| decl_specifiers abs_declarator
89298e903e7SBaptiste Daroussin 	{
89398e903e7SBaptiste Daroussin 	    check_untagged(&$1);
89498e903e7SBaptiste Daroussin 	    $$ = new_parameter(&$1, $2);
89598e903e7SBaptiste Daroussin 	}
89698e903e7SBaptiste Daroussin 	| decl_specifiers
89798e903e7SBaptiste Daroussin 	{
89898e903e7SBaptiste Daroussin 	    check_untagged(&$1);
89998e903e7SBaptiste Daroussin 	    $$ = new_parameter(&$1, (Declarator *)0);
90098e903e7SBaptiste Daroussin 	}
90198e903e7SBaptiste Daroussin 	;
90298e903e7SBaptiste Daroussin 
90398e903e7SBaptiste Daroussin opt_identifier_list
90498e903e7SBaptiste Daroussin 	: /* empty */
90598e903e7SBaptiste Daroussin 	{
90698e903e7SBaptiste Daroussin 	    new_ident_list(&$$);
90798e903e7SBaptiste Daroussin 	}
90898e903e7SBaptiste Daroussin 	| identifier_list
90998e903e7SBaptiste Daroussin 	;
91098e903e7SBaptiste Daroussin 
91198e903e7SBaptiste Daroussin identifier_list
91298e903e7SBaptiste Daroussin 	: any_id
91398e903e7SBaptiste Daroussin 	{
91498e903e7SBaptiste Daroussin 	    new_ident_list(&$$);
91598e903e7SBaptiste Daroussin 	    add_ident_list(&$$, &$$, $1.text);
91698e903e7SBaptiste Daroussin 	}
91798e903e7SBaptiste Daroussin 	| identifier_list ',' any_id
91898e903e7SBaptiste Daroussin 	{
91998e903e7SBaptiste Daroussin 	    add_ident_list(&$$, &$1, $3.text);
92098e903e7SBaptiste Daroussin 	}
92198e903e7SBaptiste Daroussin 	;
92298e903e7SBaptiste Daroussin 
92398e903e7SBaptiste Daroussin identifier_or_ref
92498e903e7SBaptiste Daroussin 	: any_id
92598e903e7SBaptiste Daroussin 	{
92698e903e7SBaptiste Daroussin 	    $$ = $1;
92798e903e7SBaptiste Daroussin 	}
92898e903e7SBaptiste Daroussin 	| '&' any_id
92998e903e7SBaptiste Daroussin 	{
93098e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
93198e903e7SBaptiste Daroussin 	    if (lintLibrary()) { /* Lint doesn't grok C++ ref variables */
93298e903e7SBaptiste Daroussin 		$$ = $2;
93398e903e7SBaptiste Daroussin 	    } else
93498e903e7SBaptiste Daroussin #endif
935*b53bb29fSJung-uk Kim 		(void)sprintf($$.text, "&%.*s", TEXT_LEN, $2.text);
93698e903e7SBaptiste Daroussin 	    $$.begin = $1.begin;
93798e903e7SBaptiste Daroussin 	}
93898e903e7SBaptiste Daroussin 	;
93998e903e7SBaptiste Daroussin 
94098e903e7SBaptiste Daroussin abs_declarator
94198e903e7SBaptiste Daroussin 	: pointer
94298e903e7SBaptiste Daroussin 	{
94398e903e7SBaptiste Daroussin 	    $$ = new_declarator($1.text, "", $1.begin);
94498e903e7SBaptiste Daroussin 	}
94598e903e7SBaptiste Daroussin 	| pointer direct_abs_declarator
94698e903e7SBaptiste Daroussin 	{
94798e903e7SBaptiste Daroussin 	    $$ = $2;
948*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "%.*s%.*s", TEXT_LEN, $1.text, TEXT_LEN, $$->text);
94998e903e7SBaptiste Daroussin 	    free($$->text);
95098e903e7SBaptiste Daroussin 	    $$->text = xstrdup(buf);
95198e903e7SBaptiste Daroussin 	    $$->begin = $1.begin;
95298e903e7SBaptiste Daroussin 	}
95398e903e7SBaptiste Daroussin 	| direct_abs_declarator
95498e903e7SBaptiste Daroussin 	;
95598e903e7SBaptiste Daroussin 
95698e903e7SBaptiste Daroussin direct_abs_declarator
95798e903e7SBaptiste Daroussin 	: '(' abs_declarator ')'
95898e903e7SBaptiste Daroussin 	{
95998e903e7SBaptiste Daroussin 	    $$ = $2;
960*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "(%.*s)", TEXT_LEN, $$->text);
96198e903e7SBaptiste Daroussin 	    free($$->text);
96298e903e7SBaptiste Daroussin 	    $$->text = xstrdup(buf);
96398e903e7SBaptiste Daroussin 	    $$->begin = $1.begin;
96498e903e7SBaptiste Daroussin 	}
96598e903e7SBaptiste Daroussin 	| direct_abs_declarator T_BRACKETS
96698e903e7SBaptiste Daroussin 	{
96798e903e7SBaptiste Daroussin 	    $$ = $1;
968*b53bb29fSJung-uk Kim 	    (void)sprintf(buf, "%.*s%.*s", TEXT_LEN, $$->text, TEXT_LEN, $2.text);
96998e903e7SBaptiste Daroussin 	    free($$->text);
97098e903e7SBaptiste Daroussin 	    $$->text = xstrdup(buf);
97198e903e7SBaptiste Daroussin 	}
97298e903e7SBaptiste Daroussin 	| T_BRACKETS
97398e903e7SBaptiste Daroussin 	{
97498e903e7SBaptiste Daroussin 	    $$ = new_declarator($1.text, "", $1.begin);
97598e903e7SBaptiste Daroussin 	}
97698e903e7SBaptiste Daroussin 	| direct_abs_declarator '(' parameter_type_list ')'
97798e903e7SBaptiste Daroussin 	{
97898e903e7SBaptiste Daroussin 	    $$ = new_declarator("%s()", "", $1->begin);
97998e903e7SBaptiste Daroussin 	    $$->params = $3;
98098e903e7SBaptiste Daroussin 	    $$->func_stack = $1;
98198e903e7SBaptiste Daroussin 	    $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
98298e903e7SBaptiste Daroussin 	    $$->func_def = FUNC_ANSI;
98398e903e7SBaptiste Daroussin 	}
98498e903e7SBaptiste Daroussin 	| direct_abs_declarator '(' ')'
98598e903e7SBaptiste Daroussin 	{
98698e903e7SBaptiste Daroussin 	    $$ = new_declarator("%s()", "", $1->begin);
98798e903e7SBaptiste Daroussin 	    $$->func_stack = $1;
98898e903e7SBaptiste Daroussin 	    $$->head = ($1->func_stack == NULL) ? $$ : $1->head;
98998e903e7SBaptiste Daroussin 	    $$->func_def = FUNC_ANSI;
99098e903e7SBaptiste Daroussin 	}
99198e903e7SBaptiste Daroussin 	| '(' parameter_type_list ')'
99298e903e7SBaptiste Daroussin 	{
99398e903e7SBaptiste Daroussin 	    Declarator *d;
99498e903e7SBaptiste Daroussin 
99598e903e7SBaptiste Daroussin 	    d = new_declarator("", "", $1.begin);
99698e903e7SBaptiste Daroussin 	    $$ = new_declarator("%s()", "", $1.begin);
99798e903e7SBaptiste Daroussin 	    $$->params = $2;
99898e903e7SBaptiste Daroussin 	    $$->func_stack = d;
99998e903e7SBaptiste Daroussin 	    $$->head = $$;
100098e903e7SBaptiste Daroussin 	    $$->func_def = FUNC_ANSI;
100198e903e7SBaptiste Daroussin 	}
100298e903e7SBaptiste Daroussin 	| '(' ')'
100398e903e7SBaptiste Daroussin 	{
100498e903e7SBaptiste Daroussin 	    Declarator *d;
100598e903e7SBaptiste Daroussin 
100698e903e7SBaptiste Daroussin 	    d = new_declarator("", "", $1.begin);
100798e903e7SBaptiste Daroussin 	    $$ = new_declarator("%s()", "", $1.begin);
100898e903e7SBaptiste Daroussin 	    $$->func_stack = d;
100998e903e7SBaptiste Daroussin 	    $$->head = $$;
101098e903e7SBaptiste Daroussin 	    $$->func_def = FUNC_ANSI;
101198e903e7SBaptiste Daroussin 	}
101298e903e7SBaptiste Daroussin 	;
101398e903e7SBaptiste Daroussin 
101498e903e7SBaptiste Daroussin %%
101598e903e7SBaptiste Daroussin 
101698e903e7SBaptiste Daroussin /* lex.yy.c */
101798e903e7SBaptiste Daroussin #define BEGIN yy_start = 1 + 2 *
101898e903e7SBaptiste Daroussin 
101998e903e7SBaptiste Daroussin #define CPP1 1
102098e903e7SBaptiste Daroussin #define INIT1 2
102198e903e7SBaptiste Daroussin #define INIT2 3
102298e903e7SBaptiste Daroussin #define CURLY 4
102398e903e7SBaptiste Daroussin #define LEXYACC 5
102498e903e7SBaptiste Daroussin #define ASM 6
102598e903e7SBaptiste Daroussin #define CPP_INLINE 7
102698e903e7SBaptiste Daroussin 
102798e903e7SBaptiste Daroussin extern char *yytext;
102898e903e7SBaptiste Daroussin extern FILE *yyin, *yyout;
102998e903e7SBaptiste Daroussin 
103098e903e7SBaptiste Daroussin static int curly;			/* number of curly brace nesting levels */
1031*b53bb29fSJung-uk Kim static int ly_count;			/* number of occurrences of %% */
103298e903e7SBaptiste Daroussin static int inc_depth;			/* include nesting level */
103398e903e7SBaptiste Daroussin static SymbolTable *included_files;	/* files already included */
103498e903e7SBaptiste Daroussin static int yy_start = 0;		/* start state number */
103598e903e7SBaptiste Daroussin 
103698e903e7SBaptiste Daroussin #define grammar_error(s) yaccError(s)
103798e903e7SBaptiste Daroussin 
103898e903e7SBaptiste Daroussin static void
yaccError(const char * msg)103998e903e7SBaptiste Daroussin yaccError (const char *msg)
104098e903e7SBaptiste Daroussin {
104198e903e7SBaptiste Daroussin     func_params = NULL;
104298e903e7SBaptiste Daroussin     put_error();		/* tell what line we're on, and what file */
104398e903e7SBaptiste Daroussin     fprintf(stderr, "%s at token '%s'\n", msg, yytext);
104498e903e7SBaptiste Daroussin }
104598e903e7SBaptiste Daroussin 
104698e903e7SBaptiste Daroussin /* Initialize the table of type qualifier keywords recognized by the lexical
104798e903e7SBaptiste Daroussin  * analyzer.
104898e903e7SBaptiste Daroussin  */
104998e903e7SBaptiste Daroussin void
init_parser(void)105098e903e7SBaptiste Daroussin init_parser (void)
105198e903e7SBaptiste Daroussin {
105298e903e7SBaptiste Daroussin     static const char *keywords[] = {
105398e903e7SBaptiste Daroussin 	"const",
105498e903e7SBaptiste Daroussin 	"restrict",
105598e903e7SBaptiste Daroussin 	"volatile",
105698e903e7SBaptiste Daroussin 	"interrupt",
105798e903e7SBaptiste Daroussin #ifdef vms
105898e903e7SBaptiste Daroussin 	"noshare",
105998e903e7SBaptiste Daroussin 	"readonly",
106098e903e7SBaptiste Daroussin #endif
106198e903e7SBaptiste Daroussin #if defined(MSDOS) || defined(OS2)
106298e903e7SBaptiste Daroussin 	"__cdecl",
106398e903e7SBaptiste Daroussin 	"__export",
106498e903e7SBaptiste Daroussin 	"__far",
106598e903e7SBaptiste Daroussin 	"__fastcall",
106698e903e7SBaptiste Daroussin 	"__fortran",
106798e903e7SBaptiste Daroussin 	"__huge",
106898e903e7SBaptiste Daroussin 	"__inline",
106998e903e7SBaptiste Daroussin 	"__interrupt",
107098e903e7SBaptiste Daroussin 	"__loadds",
107198e903e7SBaptiste Daroussin 	"__near",
107298e903e7SBaptiste Daroussin 	"__pascal",
107398e903e7SBaptiste Daroussin 	"__saveregs",
107498e903e7SBaptiste Daroussin 	"__segment",
107598e903e7SBaptiste Daroussin 	"__stdcall",
107698e903e7SBaptiste Daroussin 	"__syscall",
107798e903e7SBaptiste Daroussin 	"_cdecl",
107898e903e7SBaptiste Daroussin 	"_cs",
107998e903e7SBaptiste Daroussin 	"_ds",
108098e903e7SBaptiste Daroussin 	"_es",
108198e903e7SBaptiste Daroussin 	"_export",
108298e903e7SBaptiste Daroussin 	"_far",
108398e903e7SBaptiste Daroussin 	"_fastcall",
108498e903e7SBaptiste Daroussin 	"_fortran",
108598e903e7SBaptiste Daroussin 	"_huge",
108698e903e7SBaptiste Daroussin 	"_interrupt",
108798e903e7SBaptiste Daroussin 	"_loadds",
108898e903e7SBaptiste Daroussin 	"_near",
108998e903e7SBaptiste Daroussin 	"_pascal",
109098e903e7SBaptiste Daroussin 	"_saveregs",
109198e903e7SBaptiste Daroussin 	"_seg",
109298e903e7SBaptiste Daroussin 	"_segment",
109398e903e7SBaptiste Daroussin 	"_ss",
109498e903e7SBaptiste Daroussin 	"cdecl",
109598e903e7SBaptiste Daroussin 	"far",
109698e903e7SBaptiste Daroussin 	"huge",
109798e903e7SBaptiste Daroussin 	"near",
109898e903e7SBaptiste Daroussin 	"pascal",
109998e903e7SBaptiste Daroussin #ifdef OS2
110098e903e7SBaptiste Daroussin 	"__far16",
110198e903e7SBaptiste Daroussin #endif
110298e903e7SBaptiste Daroussin #endif
110398e903e7SBaptiste Daroussin #ifdef __GNUC__
110498e903e7SBaptiste Daroussin 	/* gcc aliases */
110598e903e7SBaptiste Daroussin 	"__builtin_va_arg",
110698e903e7SBaptiste Daroussin 	"__builtin_va_list",
110798e903e7SBaptiste Daroussin 	"__const",
110898e903e7SBaptiste Daroussin 	"__const__",
110998e903e7SBaptiste Daroussin 	"__inline",
111098e903e7SBaptiste Daroussin 	"__inline__",
111198e903e7SBaptiste Daroussin 	"__restrict",
111298e903e7SBaptiste Daroussin 	"__restrict__",
111398e903e7SBaptiste Daroussin 	"__volatile",
111498e903e7SBaptiste Daroussin 	"__volatile__",
111598e903e7SBaptiste Daroussin #endif
111698e903e7SBaptiste Daroussin     };
111798e903e7SBaptiste Daroussin     unsigned i;
111898e903e7SBaptiste Daroussin 
111998e903e7SBaptiste Daroussin     /* Initialize type qualifier table. */
112098e903e7SBaptiste Daroussin     type_qualifiers = new_symbol_table();
112198e903e7SBaptiste Daroussin     for (i = 0; i < sizeof(keywords)/sizeof(keywords[0]); ++i) {
112298e903e7SBaptiste Daroussin 	new_symbol(type_qualifiers, keywords[i], NULL, DS_NONE);
112398e903e7SBaptiste Daroussin     }
112498e903e7SBaptiste Daroussin }
112598e903e7SBaptiste Daroussin 
112698e903e7SBaptiste Daroussin /* Process the C source file.  Write function prototypes to the standard
112798e903e7SBaptiste Daroussin  * output.  Convert function definitions and write the converted source
112898e903e7SBaptiste Daroussin  * code to a temporary file.
112998e903e7SBaptiste Daroussin  */
113098e903e7SBaptiste Daroussin void
process_file(FILE * infile,char * name)113198e903e7SBaptiste Daroussin process_file (FILE *infile, char *name)
113298e903e7SBaptiste Daroussin {
113398e903e7SBaptiste Daroussin     char *s;
113498e903e7SBaptiste Daroussin 
113598e903e7SBaptiste Daroussin     if (strlen(name) > 2) {
113698e903e7SBaptiste Daroussin 	s = name + strlen(name) - 2;
113798e903e7SBaptiste Daroussin 	if (*s == '.') {
113898e903e7SBaptiste Daroussin 	    ++s;
113998e903e7SBaptiste Daroussin 	    if (*s == 'l' || *s == 'y')
114098e903e7SBaptiste Daroussin 		BEGIN LEXYACC;
114198e903e7SBaptiste Daroussin #if defined(MSDOS) || defined(OS2)
114298e903e7SBaptiste Daroussin 	    if (*s == 'L' || *s == 'Y')
114398e903e7SBaptiste Daroussin 		BEGIN LEXYACC;
114498e903e7SBaptiste Daroussin #endif
114598e903e7SBaptiste Daroussin 	}
114698e903e7SBaptiste Daroussin     }
114798e903e7SBaptiste Daroussin 
114898e903e7SBaptiste Daroussin     included_files = new_symbol_table();
114998e903e7SBaptiste Daroussin     typedef_names = new_symbol_table();
115098e903e7SBaptiste Daroussin     define_names = new_symbol_table();
115198e903e7SBaptiste Daroussin     inc_depth = -1;
115298e903e7SBaptiste Daroussin     curly = 0;
115398e903e7SBaptiste Daroussin     ly_count = 0;
115498e903e7SBaptiste Daroussin     func_params = NULL;
115598e903e7SBaptiste Daroussin     yyin = infile;
115698e903e7SBaptiste Daroussin     include_file(strcpy(base_file, name), func_style != FUNC_NONE);
115798e903e7SBaptiste Daroussin     if (file_comments) {
115898e903e7SBaptiste Daroussin #if OPT_LINTLIBRARY
115998e903e7SBaptiste Daroussin     	if (lintLibrary()) {
116098e903e7SBaptiste Daroussin 	    put_blankline(stdout);
116198e903e7SBaptiste Daroussin 	    begin_tracking();
116298e903e7SBaptiste Daroussin 	}
116398e903e7SBaptiste Daroussin #endif
116498e903e7SBaptiste Daroussin 	put_string(stdout, "/* ");
116598e903e7SBaptiste Daroussin 	put_string(stdout, cur_file_name());
116698e903e7SBaptiste Daroussin 	put_string(stdout, " */\n");
116798e903e7SBaptiste Daroussin     }
116898e903e7SBaptiste Daroussin     yyparse();
116998e903e7SBaptiste Daroussin     free_symbol_table(define_names);
117098e903e7SBaptiste Daroussin     free_symbol_table(typedef_names);
117198e903e7SBaptiste Daroussin     free_symbol_table(included_files);
117298e903e7SBaptiste Daroussin }
117398e903e7SBaptiste Daroussin 
117498e903e7SBaptiste Daroussin #ifdef NO_LEAKS
117598e903e7SBaptiste Daroussin void
free_parser(void)117698e903e7SBaptiste Daroussin free_parser(void)
117798e903e7SBaptiste Daroussin {
117898e903e7SBaptiste Daroussin     free_symbol_table (type_qualifiers);
117998e903e7SBaptiste Daroussin #ifdef FLEX_SCANNER
118098e903e7SBaptiste Daroussin     if (yy_current_buffer != 0)
118198e903e7SBaptiste Daroussin 	yy_delete_buffer(yy_current_buffer);
118298e903e7SBaptiste Daroussin #endif
118398e903e7SBaptiste Daroussin }
118498e903e7SBaptiste Daroussin #endif
1185