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