00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 struct fileloc {
00024 const char *file;
00025 int line;
00026 };
00027
00028
00029 enum typekind {
00030 TYPE_SCALAR,
00031 TYPE_STRING,
00032 TYPE_STRUCT,
00033 TYPE_UNION,
00034 TYPE_POINTER,
00035 TYPE_ARRAY,
00036 TYPE_LANG_STRUCT,
00037 TYPE_PARAM_STRUCT
00038 };
00039
00040 typedef struct pair *pair_p;
00041 typedef struct type *type_p;
00042 typedef unsigned lang_bitmap;
00043
00044
00045 struct nested_ptr_data {
00046 type_p type;
00047 const char *convert_to;
00048 const char *convert_from;
00049 };
00050
00051
00052 typedef struct options {
00053 struct options *next;
00054 const char *name;
00055 const char *info;
00056 } *options_p;
00057
00058
00059 struct pair {
00060 pair_p next;
00061 const char *name;
00062 type_p type;
00063 struct fileloc line;
00064 options_p opt;
00065 };
00066
00067 #define NUM_PARAM 10
00068
00069
00070 enum gc_used_enum
00071 {
00072 GC_UNUSED = 0,
00073 GC_USED,
00074 GC_MAYBE_POINTED_TO,
00075 GC_POINTED_TO
00076 };
00077
00078 struct type {
00079 enum typekind kind;
00080 type_p next;
00081 type_p pointer_to;
00082 enum gc_used_enum gc_used;
00083 union {
00084 type_p p;
00085 struct {
00086 const char *tag;
00087 struct fileloc line;
00088 pair_p fields;
00089 options_p opt;
00090 lang_bitmap bitmap;
00091 type_p lang_struct;
00092 } s;
00093 char *sc;
00094 struct {
00095 type_p p;
00096 const char *len;
00097 } a;
00098 struct {
00099 type_p stru;
00100 type_p param[NUM_PARAM];
00101 struct fileloc line;
00102 } param_struct;
00103 } u;
00104 };
00105
00106 #define UNION_P(x) \
00107 ((x)->kind == TYPE_UNION || \
00108 ((x)->kind == TYPE_LANG_STRUCT \
00109 && (x)->u.s.lang_struct->kind == TYPE_UNION))
00110 #define UNION_OR_STRUCT_P(x) \
00111 ((x)->kind == TYPE_UNION \
00112 || (x)->kind == TYPE_STRUCT \
00113 || (x)->kind == TYPE_LANG_STRUCT)
00114
00115
00116 extern struct type string_type;
00117
00118
00119 extern int lexer_toplevel_done;
00120 extern struct fileloc lexer_line;
00121
00122
00123 extern void error_at_line
00124 (struct fileloc *pos, const char *msg, ...) ATTRIBUTE_PRINTF_2;
00125
00126
00127 extern int xvasprintf (char **, const char *, va_list)
00128 ATTRIBUTE_PRINTF (2, 0);
00129
00130 extern char * xasprintf (const char *, ...)
00131 ATTRIBUTE_PRINTF_1;
00132
00133
00134 extern void do_typedef (const char *s, type_p t, struct fileloc *pos);
00135 extern type_p resolve_typedef (const char *s, struct fileloc *pos);
00136 extern void new_structure (const char *name, int isunion,
00137 struct fileloc *pos, pair_p fields,
00138 options_p o);
00139 extern type_p find_structure (const char *s, int isunion);
00140 extern type_p create_scalar_type (const char *name, size_t name_len);
00141 extern type_p create_pointer (type_p t);
00142 extern type_p create_array (type_p t, const char *len);
00143 extern options_p create_option (const char *name, void *info);
00144 extern type_p adjust_field_type (type_p, options_p);
00145 extern void note_variable (const char *s, type_p t, options_p o,
00146 struct fileloc *pos);
00147 extern void note_yacc_type (options_p o, pair_p fields,
00148 pair_p typeinfo, struct fileloc *pos);
00149
00150
00151 extern int yylex (void);
00152 extern void yyerror (const char *);
00153 extern int yyparse (void);
00154 extern void parse_file (const char *name);
00155
00156
00157
00158
00159 struct outf
00160 {
00161 struct outf *next;
00162 const char *name;
00163 size_t buflength;
00164 size_t bufused;
00165 char *buf;
00166 };
00167
00168 typedef struct outf * outf_p;
00169
00170
00171
00172
00173 extern outf_p get_output_file_with_visibility
00174 (const char *input_file);
00175 const char *get_output_file_name (const char *);
00176
00177
00178
00179 extern outf_p base_files[];
00180
00181
00182
00183
00184 extern lang_bitmap get_base_file_bitmap (const char *input_file);
00185
00186
00187 extern void oprintf (outf_p o, const char *S, ...)
00188 ATTRIBUTE_PRINTF_2;