| /* | 
 |  * IDL Compiler | 
 |  * | 
 |  * Copyright 2002 Ove Kaaven | 
 |  * | 
 |  * This library is free software; you can redistribute it and/or | 
 |  * modify it under the terms of the GNU Lesser General Public | 
 |  * License as published by the Free Software Foundation; either | 
 |  * version 2.1 of the License, or (at your option) any later version. | 
 |  * | 
 |  * This library is distributed in the hope that it will be useful, | 
 |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
 |  * Lesser General Public License for more details. | 
 |  * | 
 |  * You should have received a copy of the GNU Lesser General Public | 
 |  * License along with this library; if not, write to the Free Software | 
 |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
 |  */ | 
 |  | 
 | #ifndef __WIDL_WIDLTYPES_H | 
 | #define __WIDL_WIDLTYPES_H | 
 |  | 
 | #include <stdarg.h> | 
 | #include <assert.h> | 
 | #include "guiddef.h" | 
 | #include "wine/rpcfc.h" | 
 | #include "wine/list.h" | 
 |  | 
 | #ifndef UUID_DEFINED | 
 | #define UUID_DEFINED | 
 | typedef GUID UUID; | 
 | #endif | 
 |  | 
 | #define TRUE 1 | 
 | #define FALSE 0 | 
 |  | 
 | #define RPC_FC_MODULE   0xfc | 
 | #define RPC_FC_COCLASS  0xfd | 
 | #define RPC_FC_FUNCTION 0xfe | 
 |  | 
 | typedef struct _loc_info_t loc_info_t; | 
 | typedef struct _attr_t attr_t; | 
 | typedef struct _expr_t expr_t; | 
 | typedef struct _type_t type_t; | 
 | typedef struct _typeref_t typeref_t; | 
 | typedef struct _var_t var_t; | 
 | typedef struct _declarator_t declarator_t; | 
 | typedef struct _func_t func_t; | 
 | typedef struct _ifref_t ifref_t; | 
 | typedef struct _typelib_entry_t typelib_entry_t; | 
 | typedef struct _importlib_t importlib_t; | 
 | typedef struct _importinfo_t importinfo_t; | 
 | typedef struct _typelib_t typelib_t; | 
 | typedef struct _user_type_t user_type_t; | 
 | typedef struct _user_type_t context_handle_t; | 
 | typedef struct _type_list_t type_list_t; | 
 | typedef struct _statement_t statement_t; | 
 |  | 
 | typedef struct list attr_list_t; | 
 | typedef struct list str_list_t; | 
 | typedef struct list func_list_t; | 
 | typedef struct list expr_list_t; | 
 | typedef struct list var_list_t; | 
 | typedef struct list declarator_list_t; | 
 | typedef struct list ifref_list_t; | 
 | typedef struct list array_dims_t; | 
 | typedef struct list user_type_list_t; | 
 | typedef struct list context_handle_list_t; | 
 | typedef struct list statement_list_t; | 
 |  | 
 | enum attr_type | 
 | { | 
 |     ATTR_AGGREGATABLE, | 
 |     ATTR_APPOBJECT, | 
 |     ATTR_ASYNC, | 
 |     ATTR_AUTO_HANDLE, | 
 |     ATTR_BINDABLE, | 
 |     ATTR_BROADCAST, | 
 |     ATTR_CALLAS, | 
 |     ATTR_CALLCONV, /* calling convention pseudo-attribute */ | 
 |     ATTR_CASE, | 
 |     ATTR_CONST, /* const pseudo-attribute */ | 
 |     ATTR_CONTEXTHANDLE, | 
 |     ATTR_CONTROL, | 
 |     ATTR_DEFAULT, | 
 |     ATTR_DEFAULTCOLLELEM, | 
 |     ATTR_DEFAULTVALUE, | 
 |     ATTR_DEFAULTVTABLE, | 
 |     ATTR_DISPINTERFACE, | 
 |     ATTR_DISPLAYBIND, | 
 |     ATTR_DLLNAME, | 
 |     ATTR_DUAL, | 
 |     ATTR_ENDPOINT, | 
 |     ATTR_ENTRY, | 
 |     ATTR_EXPLICIT_HANDLE, | 
 |     ATTR_HANDLE, | 
 |     ATTR_HELPCONTEXT, | 
 |     ATTR_HELPFILE, | 
 |     ATTR_HELPSTRING, | 
 |     ATTR_HELPSTRINGCONTEXT, | 
 |     ATTR_HELPSTRINGDLL, | 
 |     ATTR_HIDDEN, | 
 |     ATTR_ID, | 
 |     ATTR_IDEMPOTENT, | 
 |     ATTR_IIDIS, | 
 |     ATTR_IMMEDIATEBIND, | 
 |     ATTR_IMPLICIT_HANDLE, | 
 |     ATTR_IN, | 
 |     ATTR_INLINE, | 
 |     ATTR_INPUTSYNC, | 
 |     ATTR_LENGTHIS, | 
 |     ATTR_LIBLCID, | 
 |     ATTR_LOCAL, | 
 |     ATTR_NONBROWSABLE, | 
 |     ATTR_NONCREATABLE, | 
 |     ATTR_NONEXTENSIBLE, | 
 |     ATTR_OBJECT, | 
 |     ATTR_ODL, | 
 |     ATTR_OLEAUTOMATION, | 
 |     ATTR_OPTIONAL, | 
 |     ATTR_OUT, | 
 |     ATTR_PARAMLCID, | 
 |     ATTR_POINTERDEFAULT, | 
 |     ATTR_POINTERTYPE, | 
 |     ATTR_PROPGET, | 
 |     ATTR_PROPPUT, | 
 |     ATTR_PROPPUTREF, | 
 |     ATTR_PUBLIC, | 
 |     ATTR_RANGE, | 
 |     ATTR_READONLY, | 
 |     ATTR_REQUESTEDIT, | 
 |     ATTR_RESTRICTED, | 
 |     ATTR_RETVAL, | 
 |     ATTR_SIZEIS, | 
 |     ATTR_SOURCE, | 
 |     ATTR_STRICTCONTEXTHANDLE, | 
 |     ATTR_STRING, | 
 |     ATTR_SWITCHIS, | 
 |     ATTR_SWITCHTYPE, | 
 |     ATTR_TRANSMITAS, | 
 |     ATTR_UUID, | 
 |     ATTR_V1ENUM, | 
 |     ATTR_VARARG, | 
 |     ATTR_VERSION, | 
 |     ATTR_WIREMARSHAL | 
 | }; | 
 |  | 
 | enum expr_type | 
 | { | 
 |     EXPR_VOID, | 
 |     EXPR_NUM, | 
 |     EXPR_HEXNUM, | 
 |     EXPR_DOUBLE, | 
 |     EXPR_IDENTIFIER, | 
 |     EXPR_NEG, | 
 |     EXPR_NOT, | 
 |     EXPR_PPTR, | 
 |     EXPR_CAST, | 
 |     EXPR_SIZEOF, | 
 |     EXPR_SHL, | 
 |     EXPR_SHR, | 
 |     EXPR_MUL, | 
 |     EXPR_DIV, | 
 |     EXPR_ADD, | 
 |     EXPR_SUB, | 
 |     EXPR_AND, | 
 |     EXPR_OR, | 
 |     EXPR_COND, | 
 |     EXPR_TRUEFALSE, | 
 |     EXPR_ADDRESSOF, | 
 |     EXPR_MEMBER, | 
 |     EXPR_ARRAY, | 
 |     EXPR_MOD, | 
 |     EXPR_LOGOR, | 
 |     EXPR_LOGAND, | 
 |     EXPR_XOR, | 
 |     EXPR_EQUALITY, | 
 |     EXPR_INEQUALITY, | 
 |     EXPR_GTR, | 
 |     EXPR_LESS, | 
 |     EXPR_GTREQL, | 
 |     EXPR_LESSEQL, | 
 |     EXPR_LOGNOT, | 
 |     EXPR_POS, | 
 |     EXPR_STRLIT, | 
 |     EXPR_WSTRLIT, | 
 | }; | 
 |  | 
 | enum type_kind | 
 | { | 
 |     TKIND_PRIMITIVE = -1, | 
 |     TKIND_ENUM, | 
 |     TKIND_RECORD, | 
 |     TKIND_MODULE, | 
 |     TKIND_INTERFACE, | 
 |     TKIND_DISPATCH, | 
 |     TKIND_COCLASS, | 
 |     TKIND_ALIAS, | 
 |     TKIND_UNION, | 
 |     TKIND_MAX | 
 | }; | 
 |  | 
 | enum storage_class | 
 | { | 
 |     STG_NONE, | 
 |     STG_STATIC, | 
 |     STG_EXTERN, | 
 |     STG_REGISTER, | 
 | }; | 
 |  | 
 | enum statement_type | 
 | { | 
 |     STMT_LIBRARY, | 
 |     STMT_DECLARATION, | 
 |     STMT_TYPE, | 
 |     STMT_TYPEREF, | 
 |     STMT_MODULE, | 
 |     STMT_TYPEDEF, | 
 |     STMT_IMPORT, | 
 |     STMT_IMPORTLIB, | 
 |     STMT_CPPQUOTE | 
 | }; | 
 |  | 
 | enum type_basic_type | 
 | { | 
 |     TYPE_BASIC_INT8 = 1, | 
 |     TYPE_BASIC_INT16, | 
 |     TYPE_BASIC_INT32, | 
 |     TYPE_BASIC_INT64, | 
 |     TYPE_BASIC_INT, | 
 |     TYPE_BASIC_CHAR, | 
 |     TYPE_BASIC_HYPER, | 
 |     TYPE_BASIC_BYTE, | 
 |     TYPE_BASIC_WCHAR, | 
 |     TYPE_BASIC_FLOAT, | 
 |     TYPE_BASIC_DOUBLE, | 
 |     TYPE_BASIC_ERROR_STATUS_T, | 
 |     TYPE_BASIC_HANDLE, | 
 | }; | 
 |  | 
 | #define TYPE_BASIC_MAX TYPE_BASIC_HANDLE | 
 | #define TYPE_BASIC_INT_MIN TYPE_BASIC_INT8 | 
 | #define TYPE_BASIC_INT_MAX TYPE_BASIC_HYPER | 
 |  | 
 | struct _loc_info_t | 
 | { | 
 |     const char *input_name; | 
 |     int line_number; | 
 |     const char *near_text; | 
 | }; | 
 |  | 
 | struct str_list_entry_t | 
 | { | 
 |     char *str; | 
 |     struct list entry; | 
 | }; | 
 |  | 
 | struct _attr_t { | 
 |   enum attr_type type; | 
 |   union { | 
 |     unsigned long ival; | 
 |     void *pval; | 
 |   } u; | 
 |   /* parser-internal */ | 
 |   struct list entry; | 
 | }; | 
 |  | 
 | struct _expr_t { | 
 |   enum expr_type type; | 
 |   const expr_t *ref; | 
 |   union { | 
 |     long lval; | 
 |     double dval; | 
 |     const char *sval; | 
 |     const expr_t *ext; | 
 |     type_t *tref; | 
 |   } u; | 
 |   const expr_t *ext2; | 
 |   int is_const; | 
 |   long cval; | 
 |   /* parser-internal */ | 
 |   struct list entry; | 
 | }; | 
 |  | 
 | struct struct_details | 
 | { | 
 |   var_list_t *fields; | 
 | }; | 
 |  | 
 | struct enumeration_details | 
 | { | 
 |   var_list_t *enums; | 
 | }; | 
 |  | 
 | struct func_details | 
 | { | 
 |   var_list_t *args; | 
 |   struct _type_t *rettype; | 
 |   int idx; | 
 | }; | 
 |  | 
 | struct iface_details | 
 | { | 
 |   statement_list_t *stmts; | 
 |   func_list_t *disp_methods; | 
 |   var_list_t *disp_props; | 
 |   struct _type_t *inherit; | 
 | }; | 
 |  | 
 | struct module_details | 
 | { | 
 |   statement_list_t *stmts; | 
 |   func_list_t *funcs; | 
 | }; | 
 |  | 
 | struct array_details | 
 | { | 
 |   expr_t *size_is; | 
 |   expr_t *length_is; | 
 |   struct _type_t *elem; | 
 |   unsigned int dim; | 
 |   unsigned char ptr_def_fc; | 
 |   unsigned char declptr; /* if declared as a pointer */ | 
 | }; | 
 |  | 
 | struct coclass_details | 
 | { | 
 |   ifref_list_t *ifaces; | 
 | }; | 
 |  | 
 | struct basic_details | 
 | { | 
 |   enum type_basic_type type; | 
 |   int sign; | 
 | }; | 
 |  | 
 | struct pointer_details | 
 | { | 
 |   struct _type_t *ref; | 
 |   unsigned char def_fc; | 
 | }; | 
 |  | 
 | enum type_type | 
 | { | 
 |     TYPE_VOID, | 
 |     TYPE_BASIC, /* ints, floats and handles */ | 
 |     TYPE_ENUM, | 
 |     TYPE_STRUCT, | 
 |     TYPE_ENCAPSULATED_UNION, | 
 |     TYPE_UNION, | 
 |     TYPE_ALIAS, | 
 |     TYPE_MODULE, | 
 |     TYPE_COCLASS, | 
 |     TYPE_FUNCTION, | 
 |     TYPE_INTERFACE, | 
 |     TYPE_POINTER, | 
 |     TYPE_ARRAY, | 
 | }; | 
 |  | 
 | struct _type_t { | 
 |   const char *name; | 
 |   enum type_type type_type; | 
 |   attr_list_t *attrs; | 
 |   union | 
 |   { | 
 |     struct struct_details *structure; | 
 |     struct enumeration_details *enumeration; | 
 |     struct func_details *function; | 
 |     struct iface_details *iface; | 
 |     struct module_details *module; | 
 |     struct array_details array; | 
 |     struct coclass_details coclass; | 
 |     struct basic_details basic; | 
 |     struct pointer_details pointer; | 
 |   } details; | 
 |   type_t *orig;                   /* dup'd types */ | 
 |   unsigned int typestring_offset; | 
 |   unsigned int ptrdesc;           /* used for complex structs */ | 
 |   int typelib_idx; | 
 |   loc_info_t loc_info; | 
 |   unsigned int ignore : 1; | 
 |   unsigned int defined : 1; | 
 |   unsigned int written : 1; | 
 |   unsigned int user_types_registered : 1; | 
 |   unsigned int tfswrite : 1;   /* if the type needs to be written to the TFS */ | 
 |   unsigned int checked : 1; | 
 |   unsigned int is_alias : 1; /* is the type an alias? */ | 
 | }; | 
 |  | 
 | struct _var_t { | 
 |   char *name; | 
 |   type_t *type; | 
 |   attr_list_t *attrs; | 
 |   expr_t *eval; | 
 |   enum storage_class stgclass; | 
 |  | 
 |   struct _loc_info_t loc_info; | 
 |  | 
 |   /* parser-internal */ | 
 |   struct list entry; | 
 | }; | 
 |  | 
 | struct _declarator_t { | 
 |   var_t *var; | 
 |   type_t *type; | 
 |   type_t *func_type; | 
 |   array_dims_t *array; | 
 |  | 
 |   /* parser-internal */ | 
 |   struct list entry; | 
 | }; | 
 |  | 
 | struct _func_t { | 
 |   var_t *def; | 
 |  | 
 |   /* parser-internal */ | 
 |   struct list entry; | 
 | }; | 
 |  | 
 | struct _ifref_t { | 
 |   type_t *iface; | 
 |   attr_list_t *attrs; | 
 |  | 
 |   /* parser-internal */ | 
 |   struct list entry; | 
 | }; | 
 |  | 
 | struct _typelib_entry_t { | 
 |     type_t *type; | 
 |     struct list entry; | 
 | }; | 
 |  | 
 | struct _importinfo_t { | 
 |     int offset; | 
 |     GUID guid; | 
 |     int flags; | 
 |     int id; | 
 |  | 
 |     char *name; | 
 |  | 
 |     importlib_t *importlib; | 
 | }; | 
 |  | 
 | struct _importlib_t { | 
 |     char *name; | 
 |  | 
 |     int version; | 
 |     GUID guid; | 
 |  | 
 |     importinfo_t *importinfos; | 
 |     int ntypeinfos; | 
 |  | 
 |     int allocated; | 
 |  | 
 |     struct list entry; | 
 | }; | 
 |  | 
 | struct _typelib_t { | 
 |     char *name; | 
 |     char *filename; | 
 |     const attr_list_t *attrs; | 
 |     struct list importlibs; | 
 |     statement_list_t *stmts; | 
 | }; | 
 |  | 
 | struct _user_type_t { | 
 |     struct list entry; | 
 |     const char *name; | 
 | }; | 
 |  | 
 | struct _type_list_t { | 
 |     type_t *type; | 
 |     struct _type_list_t *next; | 
 | }; | 
 |  | 
 | struct _statement_t { | 
 |     struct list entry; | 
 |     enum statement_type type; | 
 |     union | 
 |     { | 
 |         ifref_t iface; | 
 |         type_t *type; | 
 |         const char *str; | 
 |         var_t *var; | 
 |         typelib_t *lib; | 
 |         type_list_t *type_list; | 
 |     } u; | 
 | }; | 
 |  | 
 | typedef enum { | 
 |     SYS_WIN16, | 
 |     SYS_WIN32, | 
 |     SYS_MAC, | 
 |     SYS_WIN64 | 
 | } syskind_t; | 
 |  | 
 | extern syskind_t typelib_kind; | 
 | extern user_type_list_t user_type_list; | 
 | void check_for_additional_prototype_types(const var_list_t *list); | 
 |  | 
 | void init_types(void); | 
 | type_t *alloc_type(void); | 
 | void set_all_tfswrite(int val); | 
 | void clear_all_offsets(void); | 
 |  | 
 | int is_ptr(const type_t *t); | 
 | int is_array(const type_t *t); | 
 | int is_var_ptr(const var_t *v); | 
 | int cant_be_null(const var_t *v); | 
 | int is_struct(unsigned char tc); | 
 | int is_union(unsigned char tc); | 
 |  | 
 | #define tsENUM   1 | 
 | #define tsSTRUCT 2 | 
 | #define tsUNION  3 | 
 |  | 
 | var_t *find_const(const char *name, int f); | 
 | type_t *find_type(const char *name, int t); | 
 | type_t *make_type(enum type_type type); | 
 | type_t *get_type(enum type_type type, char *name, int t); | 
 | type_t *reg_type(type_t *type, const char *name, int t); | 
 | void add_incomplete(type_t *t); | 
 |  | 
 | var_t *make_var(char *name); | 
 | var_list_t *append_var(var_list_t *list, var_t *var); | 
 |  | 
 | void init_loc_info(loc_info_t *); | 
 |  | 
 | static inline var_list_t *type_get_function_args(const type_t *func_type) | 
 | { | 
 |   return func_type->details.function->args; | 
 | } | 
 |  | 
 | static inline enum type_type type_get_type_detect_alias(const type_t *type) | 
 | { | 
 |     if (type->is_alias) | 
 |         return TYPE_ALIAS; | 
 |     return type->type_type; | 
 | } | 
 |  | 
 | #define STATEMENTS_FOR_EACH_FUNC(stmt, stmts) \ | 
 |   if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, statement_t, entry ) \ | 
 |     if (stmt->type == STMT_DECLARATION && stmt->u.var->stgclass == STG_NONE && \ | 
 |         type_get_type_detect_alias(stmt->u.var->type) == TYPE_FUNCTION) | 
 |  | 
 | static inline int statements_has_func(const statement_list_t *stmts) | 
 | { | 
 |   const statement_t *stmt; | 
 |   int has_func = 0; | 
 |   STATEMENTS_FOR_EACH_FUNC(stmt, stmts) | 
 |   { | 
 |     has_func = 1; | 
 |     break; | 
 |   } | 
 |   return has_func; | 
 | } | 
 |  | 
 | #endif |