ntdll: Use wide-char string literals in version.c.
[wine.git] / tools / widl / widltypes.h
blobd5862426ad4453ca053357e2d6a58c510d397c0e
1 /*
2 * IDL Compiler
4 * Copyright 2002 Ove Kaaven
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.
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.
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
21 #ifndef __WIDL_WIDLTYPES_H
22 #define __WIDL_WIDLTYPES_H
24 #include <stdarg.h>
25 #include <assert.h>
26 #include "guiddef.h"
27 #include "ndrtypes.h"
28 #include "wine/list.h"
30 #ifndef UUID_DEFINED
31 #define UUID_DEFINED
32 typedef GUID UUID;
33 #endif
35 #define TRUE 1
36 #define FALSE 0
38 typedef struct _loc_info_t loc_info_t;
39 typedef struct _attr_t attr_t;
40 typedef struct _attr_custdata_t attr_custdata_t;
41 typedef struct _expr_t expr_t;
42 typedef struct _type_t type_t;
43 typedef struct _var_t var_t;
44 typedef struct _decl_spec_t decl_spec_t;
45 typedef struct _declarator_t declarator_t;
46 typedef struct _ifref_t ifref_t;
47 typedef struct _typelib_entry_t typelib_entry_t;
48 typedef struct _importlib_t importlib_t;
49 typedef struct _importinfo_t importinfo_t;
50 typedef struct _typelib_t typelib_t;
51 typedef struct _user_type_t user_type_t;
52 typedef struct _user_type_t context_handle_t;
53 typedef struct _user_type_t generic_handle_t;
54 typedef struct _type_list_t type_list_t;
55 typedef struct _statement_t statement_t;
56 typedef struct _warning_t warning_t;
58 typedef struct list attr_list_t;
59 typedef struct list str_list_t;
60 typedef struct list expr_list_t;
61 typedef struct list var_list_t;
62 typedef struct list declarator_list_t;
63 typedef struct list ifref_list_t;
64 typedef struct list user_type_list_t;
65 typedef struct list context_handle_list_t;
66 typedef struct list generic_handle_list_t;
67 typedef struct list statement_list_t;
68 typedef struct list warning_list_t;
70 enum attr_type
72 ATTR_AGGREGATABLE,
73 ATTR_ALLOCATE,
74 ATTR_ANNOTATION,
75 ATTR_APPOBJECT,
76 ATTR_ASYNC,
77 ATTR_ASYNCUUID,
78 ATTR_AUTO_HANDLE,
79 ATTR_BINDABLE,
80 ATTR_BROADCAST,
81 ATTR_CALLAS,
82 ATTR_CALLCONV, /* calling convention pseudo-attribute */
83 ATTR_CASE,
84 ATTR_CODE,
85 ATTR_COMMSTATUS,
86 ATTR_CONTEXTHANDLE,
87 ATTR_CONTRACT,
88 ATTR_CONTRACTVERSION,
89 ATTR_CONTROL,
90 ATTR_CUSTOM,
91 ATTR_DECODE,
92 ATTR_DEFAULT,
93 ATTR_DEFAULTBIND,
94 ATTR_DEFAULTCOLLELEM,
95 ATTR_DEFAULTVALUE,
96 ATTR_DEFAULTVTABLE,
97 ATTR_DISABLECONSISTENCYCHECK,
98 ATTR_DISPINTERFACE,
99 ATTR_DISPLAYBIND,
100 ATTR_DLLNAME,
101 ATTR_DUAL,
102 ATTR_ENABLEALLOCATE,
103 ATTR_ENCODE,
104 ATTR_ENDPOINT,
105 ATTR_ENTRY,
106 ATTR_EXPLICIT_HANDLE,
107 ATTR_FAULTSTATUS,
108 ATTR_FORCEALLOCATE,
109 ATTR_HANDLE,
110 ATTR_HELPCONTEXT,
111 ATTR_HELPFILE,
112 ATTR_HELPSTRING,
113 ATTR_HELPSTRINGCONTEXT,
114 ATTR_HELPSTRINGDLL,
115 ATTR_HIDDEN,
116 ATTR_ID,
117 ATTR_IDEMPOTENT,
118 ATTR_IGNORE,
119 ATTR_IIDIS,
120 ATTR_IMMEDIATEBIND,
121 ATTR_IMPLICIT_HANDLE,
122 ATTR_IN,
123 ATTR_INPUTSYNC,
124 ATTR_LENGTHIS,
125 ATTR_LIBLCID,
126 ATTR_LICENSED,
127 ATTR_LOCAL,
128 ATTR_MAYBE,
129 ATTR_MESSAGE,
130 ATTR_NOCODE,
131 ATTR_NONBROWSABLE,
132 ATTR_NONCREATABLE,
133 ATTR_NONEXTENSIBLE,
134 ATTR_NOTIFY,
135 ATTR_NOTIFYFLAG,
136 ATTR_OBJECT,
137 ATTR_ODL,
138 ATTR_OLEAUTOMATION,
139 ATTR_OPTIMIZE,
140 ATTR_OPTIONAL,
141 ATTR_OUT,
142 ATTR_PARAMLCID,
143 ATTR_PARTIALIGNORE,
144 ATTR_POINTERDEFAULT,
145 ATTR_POINTERTYPE,
146 ATTR_PROGID,
147 ATTR_PROPGET,
148 ATTR_PROPPUT,
149 ATTR_PROPPUTREF,
150 ATTR_PROXY,
151 ATTR_PUBLIC,
152 ATTR_RANGE,
153 ATTR_READONLY,
154 ATTR_REPRESENTAS,
155 ATTR_REQUESTEDIT,
156 ATTR_RESTRICTED,
157 ATTR_RETVAL,
158 ATTR_SIZEIS,
159 ATTR_SOURCE,
160 ATTR_STRICTCONTEXTHANDLE,
161 ATTR_STRING,
162 ATTR_SWITCHIS,
163 ATTR_SWITCHTYPE,
164 ATTR_THREADING,
165 ATTR_TRANSMITAS,
166 ATTR_UIDEFAULT,
167 ATTR_USERMARSHAL,
168 ATTR_USESGETLASTERROR,
169 ATTR_UUID,
170 ATTR_V1ENUM,
171 ATTR_VARARG,
172 ATTR_VERSION,
173 ATTR_VIPROGID,
174 ATTR_WIREMARSHAL
177 enum expr_type
179 EXPR_VOID,
180 EXPR_NUM,
181 EXPR_HEXNUM,
182 EXPR_DOUBLE,
183 EXPR_IDENTIFIER,
184 EXPR_NEG,
185 EXPR_NOT,
186 EXPR_PPTR,
187 EXPR_CAST,
188 EXPR_SIZEOF,
189 EXPR_SHL,
190 EXPR_SHR,
191 EXPR_MUL,
192 EXPR_DIV,
193 EXPR_ADD,
194 EXPR_SUB,
195 EXPR_AND,
196 EXPR_OR,
197 EXPR_COND,
198 EXPR_TRUEFALSE,
199 EXPR_ADDRESSOF,
200 EXPR_MEMBER,
201 EXPR_ARRAY,
202 EXPR_MOD,
203 EXPR_LOGOR,
204 EXPR_LOGAND,
205 EXPR_XOR,
206 EXPR_EQUALITY,
207 EXPR_INEQUALITY,
208 EXPR_GTR,
209 EXPR_LESS,
210 EXPR_GTREQL,
211 EXPR_LESSEQL,
212 EXPR_LOGNOT,
213 EXPR_POS,
214 EXPR_STRLIT,
215 EXPR_WSTRLIT,
216 EXPR_CHARCONST,
219 enum type_kind
221 TKIND_PRIMITIVE = -1,
222 TKIND_ENUM,
223 TKIND_RECORD,
224 TKIND_MODULE,
225 TKIND_INTERFACE,
226 TKIND_DISPATCH,
227 TKIND_COCLASS,
228 TKIND_ALIAS,
229 TKIND_UNION,
230 TKIND_MAX
233 enum storage_class
235 STG_NONE,
236 STG_STATIC,
237 STG_EXTERN,
238 STG_REGISTER,
241 enum type_qualifier
243 TYPE_QUALIFIER_CONST = 1,
246 enum function_specifier
248 FUNCTION_SPECIFIER_INLINE = 1,
251 enum statement_type
253 STMT_LIBRARY,
254 STMT_DECLARATION,
255 STMT_TYPE,
256 STMT_TYPEREF,
257 STMT_MODULE,
258 STMT_TYPEDEF,
259 STMT_IMPORT,
260 STMT_IMPORTLIB,
261 STMT_PRAGMA,
262 STMT_CPPQUOTE
265 enum threading_type
267 THREADING_APARTMENT = 1,
268 THREADING_NEUTRAL,
269 THREADING_SINGLE,
270 THREADING_FREE,
271 THREADING_BOTH
274 enum type_basic_type
276 TYPE_BASIC_INT8 = 1,
277 TYPE_BASIC_INT16,
278 TYPE_BASIC_INT32,
279 TYPE_BASIC_INT64,
280 TYPE_BASIC_INT,
281 TYPE_BASIC_INT3264,
282 TYPE_BASIC_LONG,
283 TYPE_BASIC_CHAR,
284 TYPE_BASIC_HYPER,
285 TYPE_BASIC_BYTE,
286 TYPE_BASIC_WCHAR,
287 TYPE_BASIC_FLOAT,
288 TYPE_BASIC_DOUBLE,
289 TYPE_BASIC_ERROR_STATUS_T,
290 TYPE_BASIC_HANDLE,
293 #define TYPE_BASIC_MAX TYPE_BASIC_HANDLE
294 #define TYPE_BASIC_INT_MIN TYPE_BASIC_INT8
295 #define TYPE_BASIC_INT_MAX TYPE_BASIC_HYPER
297 struct _loc_info_t
299 const char *input_name;
300 int line_number;
301 const char *near_text;
304 struct str_list_entry_t
306 char *str;
307 struct list entry;
310 struct _decl_spec_t
312 type_t *type;
313 enum storage_class stgclass;
314 enum type_qualifier qualifier;
315 enum function_specifier func_specifier;
318 struct _attr_t {
319 enum attr_type type;
320 union {
321 unsigned int ival;
322 void *pval;
323 } u;
324 /* parser-internal */
325 struct list entry;
328 struct _expr_t {
329 enum expr_type type;
330 const expr_t *ref;
331 union {
332 int lval;
333 double dval;
334 const char *sval;
335 const expr_t *ext;
336 decl_spec_t tref;
337 } u;
338 const expr_t *ext2;
339 int is_const;
340 int cval;
341 /* parser-internal */
342 struct list entry;
345 struct _attr_custdata_t {
346 GUID id;
347 expr_t *pval;
350 struct struct_details
352 var_list_t *fields;
355 struct enumeration_details
357 var_list_t *enums;
360 struct func_details
362 var_list_t *args;
363 struct _var_t *retval;
366 struct iface_details
368 statement_list_t *stmts;
369 var_list_t *disp_methods;
370 var_list_t *disp_props;
371 struct _type_t *inherit;
372 struct _type_t *disp_inherit;
373 struct _type_t *async_iface;
376 struct module_details
378 statement_list_t *stmts;
381 struct array_details
383 expr_t *size_is;
384 expr_t *length_is;
385 struct _decl_spec_t elem;
386 unsigned int dim;
387 unsigned char declptr; /* if declared as a pointer */
388 unsigned short ptr_tfsoff; /* offset of pointer definition for declptr */
391 struct coclass_details
393 ifref_list_t *ifaces;
396 struct basic_details
398 enum type_basic_type type;
399 int sign;
402 struct pointer_details
404 struct _decl_spec_t ref;
407 struct bitfield_details
409 struct _type_t *field;
410 const expr_t *bits;
413 struct alias_details
415 struct _decl_spec_t aliasee;
418 #define HASHMAX 64
420 struct namespace {
421 const char *name;
422 struct namespace *parent;
423 struct list entry;
424 struct list children;
425 struct rtype *type_hash[HASHMAX];
428 enum type_type
430 TYPE_VOID,
431 TYPE_BASIC, /* ints, floats and handles */
432 TYPE_ENUM,
433 TYPE_STRUCT,
434 TYPE_ENCAPSULATED_UNION,
435 TYPE_UNION,
436 TYPE_ALIAS,
437 TYPE_MODULE,
438 TYPE_COCLASS,
439 TYPE_FUNCTION,
440 TYPE_INTERFACE,
441 TYPE_POINTER,
442 TYPE_ARRAY,
443 TYPE_BITFIELD,
444 TYPE_APICONTRACT,
447 struct _type_t {
448 const char *name;
449 struct namespace *namespace;
450 enum type_type type_type;
451 attr_list_t *attrs;
452 union
454 struct struct_details *structure;
455 struct enumeration_details *enumeration;
456 struct func_details *function;
457 struct iface_details *iface;
458 struct module_details *module;
459 struct array_details array;
460 struct coclass_details coclass;
461 struct basic_details basic;
462 struct pointer_details pointer;
463 struct bitfield_details bitfield;
464 struct alias_details alias;
465 } details;
466 const char *c_name;
467 unsigned int typestring_offset;
468 unsigned int ptrdesc; /* used for complex structs */
469 int typelib_idx;
470 loc_info_t loc_info;
471 unsigned int ignore : 1;
472 unsigned int defined : 1;
473 unsigned int written : 1;
474 unsigned int user_types_registered : 1;
475 unsigned int tfswrite : 1; /* if the type needs to be written to the TFS */
476 unsigned int checked : 1;
479 struct _var_t {
480 char *name;
481 decl_spec_t declspec;
482 attr_list_t *attrs;
483 expr_t *eval;
485 unsigned int typestring_offset;
487 /* fields specific to functions */
488 unsigned int procstring_offset, func_idx;
490 struct _loc_info_t loc_info;
492 unsigned int declonly : 1;
494 /* parser-internal */
495 struct list entry;
498 struct _declarator_t {
499 var_t *var;
500 type_t *type;
501 enum type_qualifier qualifier;
502 expr_t *bits;
504 /* parser-internal */
505 struct list entry;
508 struct _ifref_t {
509 type_t *iface;
510 attr_list_t *attrs;
512 /* parser-internal */
513 struct list entry;
516 struct _typelib_entry_t {
517 type_t *type;
518 struct list entry;
521 struct _importinfo_t {
522 int offset;
523 GUID guid;
524 int flags;
525 int id;
527 char *name;
529 importlib_t *importlib;
532 struct _importlib_t {
533 int offset;
534 char *name;
536 int version;
537 GUID guid;
539 importinfo_t *importinfos;
540 int ntypeinfos;
542 int allocated;
544 struct list entry;
547 struct _typelib_t {
548 char *name;
549 const attr_list_t *attrs;
550 struct list importlibs;
551 statement_list_t *stmts;
553 type_t **reg_ifaces;
554 unsigned int reg_iface_count;
557 struct _user_type_t {
558 struct list entry;
559 const char *name;
562 struct _type_list_t {
563 type_t *type;
564 struct _type_list_t *next;
567 struct _statement_t {
568 struct list entry;
569 enum statement_type type;
570 union
572 ifref_t iface;
573 type_t *type;
574 const char *str;
575 var_t *var;
576 typelib_t *lib;
577 type_list_t *type_list;
578 } u;
579 unsigned int declonly : 1; /* for STMT_TYPE and STMT_TYPEDEF */
582 struct _warning_t {
583 int num;
584 struct list entry;
587 typedef enum {
588 SYS_WIN16,
589 SYS_WIN32,
590 SYS_MAC,
591 SYS_WIN64
592 } syskind_t;
594 extern user_type_list_t user_type_list;
595 extern context_handle_list_t context_handle_list;
596 extern generic_handle_list_t generic_handle_list;
597 void check_for_additional_prototype_types(type_t *type);
599 void init_types(void);
600 type_t *alloc_type(void);
601 void set_all_tfswrite(int val);
602 void clear_all_offsets(void);
604 #define tsENUM 1
605 #define tsSTRUCT 2
606 #define tsUNION 3
608 var_t *find_const(const char *name, int f);
609 type_t *find_type(const char *name, struct namespace *namespace, int t);
610 type_t *make_type(enum type_type type);
611 type_t *get_type(enum type_type type, char *name, struct namespace *namespace, int t);
612 type_t *reg_type(type_t *type, const char *name, struct namespace *namespace, int t);
614 var_t *make_var(char *name);
615 var_list_t *append_var(var_list_t *list, var_t *var);
617 void init_loc_info(loc_info_t *);
619 char *format_namespace(struct namespace *namespace, const char *prefix, const char *separator, const char *suffix,
620 const char *abi_prefix);
622 static inline enum type_type type_get_type_detect_alias(const type_t *type)
624 return type->type_type;
627 #define STATEMENTS_FOR_EACH_FUNC(stmt, stmts) \
628 if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry ) \
629 if (stmt->type == STMT_DECLARATION && stmt->u.var->declspec.stgclass == STG_NONE && \
630 type_get_type_detect_alias(stmt->u.var->declspec.type) == TYPE_FUNCTION)
632 static inline int statements_has_func(const statement_list_t *stmts)
634 const statement_t *stmt;
635 int has_func = 0;
636 STATEMENTS_FOR_EACH_FUNC(stmt, stmts)
638 has_func = 1;
639 break;
641 return has_func;
644 static inline int is_global_namespace(const struct namespace *namespace)
646 return !namespace->name;
649 static inline decl_spec_t *init_declspec(decl_spec_t *declspec, type_t *type)
651 declspec->type = type;
652 declspec->stgclass = STG_NONE;
653 declspec->qualifier = 0;
654 declspec->func_specifier = 0;
656 return declspec;
659 #endif