wnaspi32: Make winaspi.dll into a stand-alone 16-bit module.
[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 <assert.h>
26 #include "guiddef.h"
27 #include "wine/rpcfc.h"
28 #include "wine/list.h"
29
30 #ifndef UUID_DEFINED
31 #define UUID_DEFINED
32 typedef GUID UUID;
33 #endif
34
35 #define TRUE 1
36 #define FALSE 0
37
38 #define RPC_FC_MODULE   0xfc
39 #define RPC_FC_COCLASS  0xfd
40 #define RPC_FC_FUNCTION 0xfe
41
42 typedef struct _loc_info_t loc_info_t;
43 typedef struct _attr_t attr_t;
44 typedef struct _expr_t expr_t;
45 typedef struct _type_t type_t;
46 typedef struct _typeref_t typeref_t;
47 typedef struct _var_t var_t;
48 typedef struct _declarator_t declarator_t;
49 typedef struct _func_t func_t;
50 typedef struct _ifref_t ifref_t;
51 typedef struct _typelib_entry_t typelib_entry_t;
52 typedef struct _importlib_t importlib_t;
53 typedef struct _importinfo_t importinfo_t;
54 typedef struct _typelib_t typelib_t;
55 typedef struct _user_type_t user_type_t;
56 typedef struct _user_type_t context_handle_t;
57 typedef struct _type_list_t type_list_t;
58 typedef struct _statement_t statement_t;
59
60 typedef struct list attr_list_t;
61 typedef struct list str_list_t;
62 typedef struct list func_list_t;
63 typedef struct list expr_list_t;
64 typedef struct list var_list_t;
65 typedef struct list declarator_list_t;
66 typedef struct list ifref_list_t;
67 typedef struct list array_dims_t;
68 typedef struct list user_type_list_t;
69 typedef struct list context_handle_list_t;
70 typedef struct list statement_list_t;
71
72 enum attr_type
73 {
74     ATTR_AGGREGATABLE,
75     ATTR_APPOBJECT,
76     ATTR_ASYNC,
77     ATTR_AUTO_HANDLE,
78     ATTR_BINDABLE,
79     ATTR_BROADCAST,
80     ATTR_CALLAS,
81     ATTR_CALLCONV, /* calling convention pseudo-attribute */
82     ATTR_CASE,
83     ATTR_CONST, /* const pseudo-attribute */
84     ATTR_CONTEXTHANDLE,
85     ATTR_CONTROL,
86     ATTR_DEFAULT,
87     ATTR_DEFAULTCOLLELEM,
88     ATTR_DEFAULTVALUE,
89     ATTR_DEFAULTVTABLE,
90     ATTR_DISPINTERFACE,
91     ATTR_DISPLAYBIND,
92     ATTR_DLLNAME,
93     ATTR_DUAL,
94     ATTR_ENDPOINT,
95     ATTR_ENTRY,
96     ATTR_EXPLICIT_HANDLE,
97     ATTR_HANDLE,
98     ATTR_HELPCONTEXT,
99     ATTR_HELPFILE,
100     ATTR_HELPSTRING,
101     ATTR_HELPSTRINGCONTEXT,
102     ATTR_HELPSTRINGDLL,
103     ATTR_HIDDEN,
104     ATTR_ID,
105     ATTR_IDEMPOTENT,
106     ATTR_IIDIS,
107     ATTR_IMMEDIATEBIND,
108     ATTR_IMPLICIT_HANDLE,
109     ATTR_IN,
110     ATTR_INLINE,
111     ATTR_INPUTSYNC,
112     ATTR_LENGTHIS,
113     ATTR_LIBLCID,
114     ATTR_LOCAL,
115     ATTR_NONBROWSABLE,
116     ATTR_NONCREATABLE,
117     ATTR_NONEXTENSIBLE,
118     ATTR_OBJECT,
119     ATTR_ODL,
120     ATTR_OLEAUTOMATION,
121     ATTR_OPTIONAL,
122     ATTR_OUT,
123     ATTR_POINTERDEFAULT,
124     ATTR_POINTERTYPE,
125     ATTR_PROPGET,
126     ATTR_PROPPUT,
127     ATTR_PROPPUTREF,
128     ATTR_PUBLIC,
129     ATTR_RANGE,
130     ATTR_READONLY,
131     ATTR_REQUESTEDIT,
132     ATTR_RESTRICTED,
133     ATTR_RETVAL,
134     ATTR_SIZEIS,
135     ATTR_SOURCE,
136     ATTR_STRICTCONTEXTHANDLE,
137     ATTR_STRING,
138     ATTR_SWITCHIS,
139     ATTR_SWITCHTYPE,
140     ATTR_TRANSMITAS,
141     ATTR_UUID,
142     ATTR_V1ENUM,
143     ATTR_VARARG,
144     ATTR_VERSION,
145     ATTR_WIREMARSHAL
146 };
147
148 enum expr_type
149 {
150     EXPR_VOID,
151     EXPR_NUM,
152     EXPR_HEXNUM,
153     EXPR_DOUBLE,
154     EXPR_IDENTIFIER,
155     EXPR_NEG,
156     EXPR_NOT,
157     EXPR_PPTR,
158     EXPR_CAST,
159     EXPR_SIZEOF,
160     EXPR_SHL,
161     EXPR_SHR,
162     EXPR_MUL,
163     EXPR_DIV,
164     EXPR_ADD,
165     EXPR_SUB,
166     EXPR_AND,
167     EXPR_OR,
168     EXPR_COND,
169     EXPR_TRUEFALSE,
170     EXPR_ADDRESSOF,
171     EXPR_MEMBER,
172     EXPR_ARRAY,
173     EXPR_MOD,
174     EXPR_LOGOR,
175     EXPR_LOGAND,
176     EXPR_XOR,
177     EXPR_EQUALITY,
178     EXPR_INEQUALITY,
179     EXPR_GTR,
180     EXPR_LESS,
181     EXPR_GTREQL,
182     EXPR_LESSEQL,
183     EXPR_LOGNOT,
184     EXPR_POS,
185     EXPR_STRLIT,
186     EXPR_WSTRLIT,
187 };
188
189 enum type_kind
190 {
191     TKIND_PRIMITIVE = -1,
192     TKIND_ENUM,
193     TKIND_RECORD,
194     TKIND_MODULE,
195     TKIND_INTERFACE,
196     TKIND_DISPATCH,
197     TKIND_COCLASS,
198     TKIND_ALIAS,
199     TKIND_UNION,
200     TKIND_MAX
201 };
202
203 enum storage_class
204 {
205     STG_NONE,
206     STG_STATIC,
207     STG_EXTERN,
208     STG_REGISTER,
209 };
210
211 enum statement_type
212 {
213     STMT_LIBRARY,
214     STMT_DECLARATION,
215     STMT_TYPE,
216     STMT_TYPEREF,
217     STMT_MODULE,
218     STMT_TYPEDEF,
219     STMT_IMPORT,
220     STMT_IMPORTLIB,
221     STMT_CPPQUOTE
222 };
223
224 enum type_basic_type
225 {
226     TYPE_BASIC_INT8 = 1,
227     TYPE_BASIC_INT16,
228     TYPE_BASIC_INT32,
229     TYPE_BASIC_INT64,
230     TYPE_BASIC_INT,
231     TYPE_BASIC_CHAR,
232     TYPE_BASIC_HYPER,
233     TYPE_BASIC_BYTE,
234     TYPE_BASIC_WCHAR,
235     TYPE_BASIC_FLOAT,
236     TYPE_BASIC_DOUBLE,
237     TYPE_BASIC_ERROR_STATUS_T,
238     TYPE_BASIC_HANDLE,
239 };
240
241 #define TYPE_BASIC_MAX TYPE_BASIC_HANDLE
242 #define TYPE_BASIC_INT_MIN TYPE_BASIC_INT8
243 #define TYPE_BASIC_INT_MAX TYPE_BASIC_HYPER
244
245 struct _loc_info_t
246 {
247     const char *input_name;
248     int line_number;
249     const char *near_text;
250 };
251
252 struct str_list_entry_t
253 {
254     char *str;
255     struct list entry;
256 };
257
258 struct _attr_t {
259   enum attr_type type;
260   union {
261     unsigned long ival;
262     void *pval;
263   } u;
264   /* parser-internal */
265   struct list entry;
266 };
267
268 struct _expr_t {
269   enum expr_type type;
270   const expr_t *ref;
271   union {
272     long lval;
273     double dval;
274     const char *sval;
275     const expr_t *ext;
276     type_t *tref;
277   } u;
278   const expr_t *ext2;
279   int is_const;
280   long cval;
281   /* parser-internal */
282   struct list entry;
283 };
284
285 struct struct_details
286 {
287   var_list_t *fields;
288 };
289
290 struct enumeration_details
291 {
292   var_list_t *enums;
293 };
294
295 struct func_details
296 {
297   var_list_t *args;
298   struct _type_t *rettype;
299   int idx;
300 };
301
302 struct iface_details
303 {
304   statement_list_t *stmts;
305   func_list_t *disp_methods;
306   var_list_t *disp_props;
307   struct _type_t *inherit;
308 };
309
310 struct module_details
311 {
312   statement_list_t *stmts;
313   func_list_t *funcs;
314 };
315
316 struct array_details
317 {
318   expr_t *size_is;
319   expr_t *length_is;
320   struct _type_t *elem;
321   unsigned int dim;
322   unsigned char ptr_def_fc;
323   unsigned char declptr; /* if declared as a pointer */
324 };
325
326 struct coclass_details
327 {
328   ifref_list_t *ifaces;
329 };
330
331 struct basic_details
332 {
333   enum type_basic_type type;
334   int sign;
335 };
336
337 struct pointer_details
338 {
339   struct _type_t *ref;
340   unsigned char def_fc;
341 };
342
343 enum type_type
344 {
345     TYPE_VOID,
346     TYPE_BASIC, /* ints, floats and handles */
347     TYPE_ENUM,
348     TYPE_STRUCT,
349     TYPE_ENCAPSULATED_UNION,
350     TYPE_UNION,
351     TYPE_ALIAS,
352     TYPE_MODULE,
353     TYPE_COCLASS,
354     TYPE_FUNCTION,
355     TYPE_INTERFACE,
356     TYPE_POINTER,
357     TYPE_ARRAY,
358 };
359
360 struct _type_t {
361   const char *name;
362   enum type_type type_type;
363   attr_list_t *attrs;
364   union
365   {
366     struct struct_details *structure;
367     struct enumeration_details *enumeration;
368     struct func_details *function;
369     struct iface_details *iface;
370     struct module_details *module;
371     struct array_details array;
372     struct coclass_details coclass;
373     struct basic_details basic;
374     struct pointer_details pointer;
375   } details;
376   type_t *orig;                   /* dup'd types */
377   unsigned int typestring_offset;
378   unsigned int ptrdesc;           /* used for complex structs */
379   int typelib_idx;
380   loc_info_t loc_info;
381   unsigned int ignore : 1;
382   unsigned int defined : 1;
383   unsigned int written : 1;
384   unsigned int user_types_registered : 1;
385   unsigned int tfswrite : 1;   /* if the type needs to be written to the TFS */
386   unsigned int checked : 1;
387   unsigned int is_alias : 1; /* is the type an alias? */
388 };
389
390 struct _var_t {
391   char *name;
392   type_t *type;
393   attr_list_t *attrs;
394   expr_t *eval;
395   enum storage_class stgclass;
396
397   struct _loc_info_t loc_info;
398
399   /* parser-internal */
400   struct list entry;
401 };
402
403 struct _declarator_t {
404   var_t *var;
405   type_t *type;
406   type_t *func_type;
407   array_dims_t *array;
408
409   /* parser-internal */
410   struct list entry;
411 };
412
413 struct _func_t {
414   var_t *def;
415
416   /* parser-internal */
417   struct list entry;
418 };
419
420 struct _ifref_t {
421   type_t *iface;
422   attr_list_t *attrs;
423
424   /* parser-internal */
425   struct list entry;
426 };
427
428 struct _typelib_entry_t {
429     type_t *type;
430     struct list entry;
431 };
432
433 struct _importinfo_t {
434     int offset;
435     GUID guid;
436     int flags;
437     int id;
438
439     char *name;
440
441     importlib_t *importlib;
442 };
443
444 struct _importlib_t {
445     char *name;
446
447     int version;
448     GUID guid;
449
450     importinfo_t *importinfos;
451     int ntypeinfos;
452
453     int allocated;
454
455     struct list entry;
456 };
457
458 struct _typelib_t {
459     char *name;
460     char *filename;
461     const attr_list_t *attrs;
462     struct list importlibs;
463     statement_list_t *stmts;
464 };
465
466 struct _user_type_t {
467     struct list entry;
468     const char *name;
469 };
470
471 struct _type_list_t {
472     type_t *type;
473     struct _type_list_t *next;
474 };
475
476 struct _statement_t {
477     struct list entry;
478     enum statement_type type;
479     union
480     {
481         ifref_t iface;
482         type_t *type;
483         const char *str;
484         var_t *var;
485         typelib_t *lib;
486         type_list_t *type_list;
487     } u;
488 };
489
490 extern user_type_list_t user_type_list;
491 void check_for_additional_prototype_types(const var_list_t *list);
492
493 void init_types(void);
494 type_t *alloc_type(void);
495 void set_all_tfswrite(int val);
496 void clear_all_offsets(void);
497
498 int is_ptr(const type_t *t);
499 int is_array(const type_t *t);
500 int is_var_ptr(const var_t *v);
501 int cant_be_null(const var_t *v);
502 int is_struct(unsigned char tc);
503 int is_union(unsigned char tc);
504
505 #define tsENUM   1
506 #define tsSTRUCT 2
507 #define tsUNION  3
508
509 var_t *find_const(const char *name, int f);
510 type_t *find_type(const char *name, int t);
511 type_t *make_type(enum type_type type);
512 type_t *get_type(enum type_type type, char *name, int t);
513 type_t *reg_type(type_t *type, const char *name, int t);
514 void add_incomplete(type_t *t);
515
516 var_t *make_var(char *name);
517 var_list_t *append_var(var_list_t *list, var_t *var);
518
519 void init_loc_info(loc_info_t *);
520
521 static inline var_list_t *type_get_function_args(const type_t *func_type)
522 {
523   return func_type->details.function->args;
524 }
525
526 static inline enum type_type type_get_type_detect_alias(const type_t *type)
527 {
528     if (type->is_alias)
529         return TYPE_ALIAS;
530     return type->type_type;
531 }
532
533 #define STATEMENTS_FOR_EACH_FUNC(stmt, stmts) \
534   if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry ) \
535     if (stmt->type == STMT_DECLARATION && stmt->u.var->stgclass == STG_NONE && \
536         type_get_type_detect_alias(stmt->u.var->type) == TYPE_FUNCTION)
537
538 static inline int statements_has_func(const statement_list_t *stmts)
539 {
540   const statement_t *stmt;
541   int has_func = 0;
542   STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
543   {
544     has_func = 1;
545     break;
546   }
547   return has_func;
548 }
549
550 #endif