From 86fead3c257d4b05a74785021006adcbe05bb5df Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 5 Jan 2005 17:12:25 +0000 Subject: [PATCH] Store interfaces, structs, coclasses and modules that are to be written into a typelib in a list. --- tools/widl/parser.y | 4 +- tools/widl/typelib.c | 88 ++++++++++++++++++++++++++++-------------- tools/widl/typelib.h | 1 + tools/widl/widltypes.h | 33 ++++++++++++++++ 4 files changed, 97 insertions(+), 29 deletions(-) diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 55c78620dd3..86b22e1bfd0 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -713,7 +713,9 @@ structdef: tSTRUCT t_ident '{' fields '}' { $$ = get_typev(RPC_FC_STRUCT, $2, ts $$->type = get_struct_type( $4 ); $$->fields = $4; $$->defined = TRUE; - } + if(in_typelib) + add_struct($$); + } ; type: tVOID { $$ = make_tref(NULL, make_type(0, NULL)); } diff --git a/tools/widl/typelib.c b/tools/widl/typelib.c index d2e0926cf12..e9a28cefb56 100644 --- a/tools/widl/typelib.c +++ b/tools/widl/typelib.c @@ -35,7 +35,6 @@ #include "typelib.h" int in_typelib = 0; -static FILE* typelib; /* Copied from wtypes.h. Not included directly because that would create a * circular dependency (after all, wtypes.h is generated by widl...) */ @@ -91,6 +90,7 @@ enum VARENUM { VT_ILLEGALMASKED = 0xfff, VT_TYPEMASK = 0xfff }; +static typelib_t *typelib; /* List of oleauto types that should be recognized by name. * (most of) these seem to be intrinsic types in mktyplib. */ @@ -217,52 +217,84 @@ unsigned short get_var_vt(var_t *v) void start_typelib(char *name, attr_t *attrs) { - in_typelib++; - if (!do_everything && !typelib_only) return; - if(!(typelib = fopen(typelib_name, "wb"))) - error("Could not open %s for output\n", typelib_name); + in_typelib++; + if (!do_everything && !typelib_only) return; + + typelib = xmalloc(sizeof(*typelib)); + typelib->name = xstrdup(name); + typelib->filename = xstrdup(typelib_name); + typelib->attrs = attrs; } void end_typelib(void) { - if (typelib) fclose(typelib); - in_typelib--; + in_typelib--; + if (!typelib) return; + +/* create_msft_typelib(typelib);*/ + return; } void add_interface(type_t *iface) { - if (!typelib) return; + typelib_entry_t *entry; + if (!typelib) return; - /* FIXME: add interface and dependent types to typelib */ - printf("add interface: %s\n", iface->name); + chat("add interface: %s\n", iface->name); + entry = xmalloc(sizeof(*entry)); + entry->kind = TKIND_INTERFACE; + entry->u.interface = iface; + LINK(entry, typelib->entry); + typelib->entry = entry; } void add_coclass(class_t *cls) { - ifref_t *lcur = cls->ifaces; - ifref_t *cur; + ifref_t *lcur = cls->ifaces; + ifref_t *cur; + typelib_entry_t *entry; - if (lcur) { - while (NEXT_LINK(lcur)) lcur = NEXT_LINK(lcur); - } + if (lcur) { + while (NEXT_LINK(lcur)) lcur = NEXT_LINK(lcur); + } - if (!typelib) return; + if (!typelib) return; - /* install interfaces the coclass depends on */ - cur = lcur; - while (cur) { - add_interface(cur->iface); - cur = PREV_LINK(cur); - } - - /* FIXME: add coclass to typelib */ - printf("add coclass: %s\n", cls->name); + /* install interfaces the coclass depends on */ + cur = lcur; + while (cur) { + add_interface(cur->iface); + cur = PREV_LINK(cur); + } + entry = xmalloc(sizeof(*entry)); + entry->kind = TKIND_COCLASS; + entry->u.class = cls; + LINK(entry, typelib->entry); + typelib->entry = entry; } void add_module(type_t *module) { - if (!typelib) return; + typelib_entry_t *entry; + if (!typelib) return; - /* FIXME: add module to typelib */ - printf("add module: %s\n", module->name); + chat("add module: %s\n", module->name); + entry = xmalloc(sizeof(*entry)); + entry->kind = TKIND_MODULE; + entry->u.module = module; + LINK(entry, typelib->entry); + typelib->entry = entry; +} + +void add_struct(type_t *structure) +{ + typelib_entry_t *entry; + if (!typelib) return; + + chat("add struct: %s\n", structure->name); + entry = xmalloc(sizeof(*entry)); + entry->kind = TKIND_RECORD; + entry->u.structure = structure; + LINK(entry, typelib->entry); + typelib->entry = entry; } diff --git a/tools/widl/typelib.h b/tools/widl/typelib.h index dd1e1cfd2b8..fe173b4ac68 100644 --- a/tools/widl/typelib.h +++ b/tools/widl/typelib.h @@ -27,5 +27,6 @@ extern void end_typelib(void); extern void add_interface(type_t *iface); extern void add_coclass(class_t *cls); extern void add_module(type_t *module); +extern void add_struct(type_t *structure); #endif diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index c6c8ab93012..4918b4e6784 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -45,6 +45,8 @@ typedef struct _var_t var_t; typedef struct _func_t func_t; typedef struct _ifref_t ifref_t; typedef struct _class_t class_t; +typedef struct _typelib_entry_t typelib_entry_t; +typedef struct _typelib_t typelib_t; #define DECL_LINK(type) \ type *l_next; \ @@ -126,6 +128,19 @@ enum expr_type EXPR_COND, }; +enum type_kind +{ + TKIND_ENUM = 0, + TKIND_RECORD, + TKIND_MODULE, + TKIND_INTERFACE, + TKIND_DISPATCH, + TKIND_COCLASS, + TKIND_ALIAS, + TKIND_UNION, + TKIND_MAX +}; + struct _attr_t { enum attr_type type; union { @@ -214,4 +229,22 @@ struct _class_t { DECL_LINK(class_t) }; +struct _typelib_entry_t { + enum type_kind kind; + union { + class_t *class; + type_t *interface; + type_t *module; + type_t *structure; + } u; + DECL_LINK(typelib_entry_t) +}; + +struct _typelib_t { + char *name; + char *filename; + attr_t *attrs; + typelib_entry_t *entry; +}; + #endif