mlang/tests: Reduce the size of the test output a little.
[wine] / tools / widl / widltypes.h
1 /*
2  * IDL Compiler
3  *
4  * Copyright 2002 Ove Kaaven
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 #ifndef __WIDL_WIDLTYPES_H
22 #define __WIDL_WIDLTYPES_H
23
24 #include <stdarg.h>
25 #include "guiddef.h"
26 #include "wine/rpcfc.h"
27 #include "wine/list.h"
28
29 #ifndef UUID_DEFINED
30 #define UUID_DEFINED
31 typedef GUID UUID;
32 #endif
33
34 #define TRUE 1
35 #define FALSE 0
36
37 #define RPC_FC_COCLASS  0xfd
38 #define RPC_FC_FUNCTION 0xfe
39
40 typedef struct _loc_info_t loc_info_t;
41 typedef struct _attr_t attr_t;
42 typedef struct _expr_t expr_t;
43 typedef struct _type_t type_t;
44 typedef struct _typeref_t typeref_t;
45 typedef struct _var_t var_t;
46 typedef struct _declarator_t declarator_t;
47 typedef struct _func_t func_t;
48 typedef struct _ifref_t ifref_t;
49 typedef struct _typelib_entry_t typelib_entry_t;
50 typedef struct _importlib_t importlib_t;
51 typedef struct _importinfo_t importinfo_t;
52 typedef struct _typelib_t typelib_t;
53 typedef struct _user_type_t user_type_t;
54 typedef struct _user_type_t context_handle_t;
55 typedef struct _type_list_t type_list_t;
56 typedef struct _statement_t statement_t;
57
58 typedef struct list attr_list_t;
59 typedef struct list str_list_t;
60 typedef struct list func_list_t;
61 typedef struct list expr_list_t;
62 typedef struct list var_list_t;
63 typedef struct list declarator_list_t;
64 typedef struct list ifref_list_t;
65 typedef struct list array_dims_t;
66 typedef struct list user_type_list_t;
67 typedef struct list context_handle_list_t;
68 typedef struct list statement_list_t;
69
70 enum attr_type
71 {
72     ATTR_AGGREGATABLE,
73     ATTR_APPOBJECT,
74     ATTR_ASYNC,
75     ATTR_AUTO_HANDLE,
76     ATTR_BINDABLE,
77     ATTR_BROADCAST,
78     ATTR_CALLAS,
79     ATTR_CALLCONV, /* calling convention pseudo-attribute */
80     ATTR_CASE,
81     ATTR_CONST, /* const pseudo-attribute */
82     ATTR_CONTEXTHANDLE,
83     ATTR_CONTROL,
84     ATTR_DEFAULT,
85     ATTR_DEFAULTCOLLELEM,
86     ATTR_DEFAULTVALUE,
87     ATTR_DEFAULTVTABLE,
88     ATTR_DISPINTERFACE,
89     ATTR_DISPLAYBIND,
90     ATTR_DLLNAME,
91     ATTR_DUAL,
92     ATTR_ENDPOINT,
93     ATTR_ENTRY,
94     ATTR_EXPLICIT_HANDLE,
95     ATTR_HANDLE,
96     ATTR_HELPCONTEXT,
97     ATTR_HELPFILE,
98     ATTR_HELPSTRING,
99     ATTR_HELPSTRINGCONTEXT,
100     ATTR_HELPSTRINGDLL,
101     ATTR_HIDDEN,
102     ATTR_ID,
103     ATTR_IDEMPOTENT,
104     ATTR_IIDIS,
105     ATTR_IMMEDIATEBIND,
106     ATTR_IMPLICIT_HANDLE,
107     ATTR_IN,
108     ATTR_INLINE,
109     ATTR_INPUTSYNC,
110     ATTR_LENGTHIS,
111     ATTR_LIBLCID,
112     ATTR_LOCAL,
113     ATTR_NONBROWSABLE,
114     ATTR_NONCREATABLE,
115     ATTR_NONEXTENSIBLE,
116     ATTR_OBJECT,
117     ATTR_ODL,
118     ATTR_OLEAUTOMATION,
119     ATTR_OPTIONAL,
120     ATTR_OUT,
121     ATTR_POINTERDEFAULT,
122     ATTR_POINTERTYPE,
123     ATTR_PROPGET,
124     ATTR_PROPPUT,
125     ATTR_PROPPUTREF,
126     ATTR_PUBLIC,
127     ATTR_RANGE,
128     ATTR_READONLY,
129     ATTR_REQUESTEDIT,
130     ATTR_RESTRICTED,
131     ATTR_RETVAL,
132     ATTR_SIZEIS,
133     ATTR_SOURCE,
134     ATTR_STRICTCONTEXTHANDLE,
135     ATTR_STRING,
136     ATTR_SWITCHIS,
137     ATTR_SWITCHTYPE,
138     ATTR_TRANSMITAS,
139     ATTR_UUID,
140     ATTR_V1ENUM,
141     ATTR_VARARG,
142     ATTR_VERSION,
143     ATTR_WIREMARSHAL
144 };
145
146 enum expr_type
147 {
148     EXPR_VOID,
149     EXPR_NUM,
150     EXPR_HEXNUM,
151     EXPR_DOUBLE,
152     EXPR_IDENTIFIER,
153     EXPR_NEG,
154     EXPR_NOT,
155     EXPR_PPTR,
156     EXPR_CAST,
157     EXPR_SIZEOF,
158     EXPR_SHL,
159     EXPR_SHR,
160     EXPR_MUL,
161     EXPR_DIV,
162     EXPR_ADD,
163     EXPR_SUB,
164     EXPR_AND,
165     EXPR_OR,
166     EXPR_COND,
167     EXPR_TRUEFALSE,
168     EXPR_ADDRESSOF,
169     EXPR_MEMBER,
170     EXPR_ARRAY,
171     EXPR_MOD,
172     EXPR_LOGOR,
173     EXPR_LOGAND,
174     EXPR_XOR,
175     EXPR_EQUALITY,
176     EXPR_INEQUALITY,
177     EXPR_GTR,
178     EXPR_LESS,
179     EXPR_GTREQL,
180     EXPR_LESSEQL,
181     EXPR_LOGNOT,
182     EXPR_POS,
183     EXPR_STRLIT,
184     EXPR_WSTRLIT,
185 };
186
187 enum type_kind
188 {
189     TKIND_PRIMITIVE = -1,
190     TKIND_ENUM,
191     TKIND_RECORD,
192     TKIND_MODULE,
193     TKIND_INTERFACE,
194     TKIND_DISPATCH,
195     TKIND_COCLASS,
196     TKIND_ALIAS,
197     TKIND_UNION,
198     TKIND_MAX
199 };
200
201 enum storage_class
202 {
203     STG_NONE,
204     STG_STATIC,
205     STG_EXTERN,
206     STG_REGISTER,
207 };
208
209 enum statement_type
210 {
211     STMT_LIBRARY,
212     STMT_DECLARATION,
213     STMT_TYPE,
214     STMT_TYPEREF,
215     STMT_MODULE,
216     STMT_TYPEDEF,
217     STMT_IMPORT,
218     STMT_IMPORTLIB,
219     STMT_CPPQUOTE
220 };
221
222 struct _loc_info_t
223 {
224     const char *input_name;
225     int line_number;
226     const char *near_text;
227 };
228
229 struct str_list_entry_t
230 {
231     char *str;
232     struct list entry;
233 };
234
235 struct _attr_t {
236   enum attr_type type;
237   union {
238     unsigned long ival;
239     void *pval;
240   } u;
241   /* parser-internal */
242   struct list entry;
243 };
244
245 struct _expr_t {
246   enum expr_type type;
247   const expr_t *ref;
248   union {
249     long lval;
250     double dval;
251     const char *sval;
252     const expr_t *ext;
253     type_t *tref;
254   } u;
255   const expr_t *ext2;
256   int is_const;
257   long cval;
258   /* parser-internal */
259   struct list entry;
260 };
261
262 struct _type_t {
263   const char *name;
264   enum type_kind kind;
265   unsigned char type;
266   struct _type_t *ref;
267   attr_list_t *attrs;
268   func_list_t *funcs;             /* interfaces and modules */
269   var_list_t *fields_or_args;     /* interfaces, structures, enumerations and functions (for args) */
270   ifref_list_t *ifaces;           /* coclasses */
271   unsigned long dim;              /* array dimension */
272   expr_t *size_is, *length_is;
273   type_t *orig;                   /* dup'd types */
274   unsigned int typestring_offset;
275   unsigned int ptrdesc;           /* used for complex structs */
276   int typelib_idx;
277   unsigned int declarray : 1;     /* if declared as an array */
278   unsigned int ignore : 1;
279   unsigned int defined : 1;
280   unsigned int written : 1;
281   unsigned int user_types_registered : 1;
282   unsigned int tfswrite : 1;   /* if the type needs to be written to the TFS */
283   unsigned int checked : 1;
284   int sign : 2;
285 };
286
287 struct _var_t {
288   char *name;
289   type_t *type;
290   attr_list_t *attrs;
291   expr_t *eval;
292   enum storage_class stgclass;
293
294   struct _loc_info_t loc_info;
295
296   /* parser-internal */
297   struct list entry;
298 };
299
300 struct _declarator_t {
301   var_t *var;
302   type_t *type;
303   type_t *func_type;
304   array_dims_t *array;
305
306   /* parser-internal */
307   struct list entry;
308 };
309
310 struct _func_t {
311   var_t *def;
312   var_list_t *args;
313   int ignore, idx;
314
315   /* parser-internal */
316   struct list entry;
317 };
318
319 struct _ifref_t {
320   type_t *iface;
321   attr_list_t *attrs;
322
323   /* parser-internal */
324   struct list entry;
325 };
326
327 struct _typelib_entry_t {
328     type_t *type;
329     struct list entry;
330 };
331
332 struct _importinfo_t {
333     int offset;
334     GUID guid;
335     int flags;
336     int id;
337
338     char *name;
339
340     importlib_t *importlib;
341 };
342
343 struct _importlib_t {
344     char *name;
345
346     int version;
347     GUID guid;
348
349     importinfo_t *importinfos;
350     int ntypeinfos;
351
352     int allocated;
353
354     struct list entry;
355 };
356
357 struct _typelib_t {
358     char *name;
359     char *filename;
360     const attr_list_t *attrs;
361     struct list entries;
362     struct list importlibs;
363     statement_list_t *stmts;
364 };
365
366 struct _user_type_t {
367     struct list entry;
368     const char *name;
369 };
370
371 struct _type_list_t {
372     type_t *type;
373     struct _type_list_t *next;
374 };
375
376 struct _statement_t {
377     struct list entry;
378     enum statement_type type;
379     union
380     {
381         ifref_t iface;
382         type_t *type;
383         const char *str;
384         var_t *var;
385         typelib_t *lib;
386         type_list_t *type_list;
387     } u;
388 };
389
390 extern unsigned char pointer_default;
391
392 extern user_type_list_t user_type_list;
393 void check_for_additional_prototype_types(const var_list_t *list);
394
395 void init_types(void);
396 type_t *alloc_type(void);
397 void set_all_tfswrite(int val);
398
399 type_t *duptype(type_t *t, int dupname);
400 type_t *alias(type_t *t, const char *name);
401
402 int is_ptr(const type_t *t);
403 int is_array(const type_t *t);
404 int is_var_ptr(const var_t *v);
405 int cant_be_null(const var_t *v);
406 int is_struct(unsigned char tc);
407 int is_union(unsigned char tc);
408
409 var_t *find_const(const char *name, int f);
410 type_t *find_type(const char *name, int t);
411 type_t *make_type(unsigned char type, type_t *ref);
412
413 static inline type_t *get_func_return_type(const func_t *func)
414 {
415   return func->def->type->ref;
416 }
417
418 #endif