From d33a553d6380a863542b30340a32a266d039ce96 Mon Sep 17 00:00:00 2001 From: Huw Davies Date: Wed, 2 Feb 2005 19:10:02 +0000 Subject: [PATCH] Add support for typedefs. --- tools/widl/parser.y | 4 +++- tools/widl/typelib.c | 17 +++++++++++++++++ tools/widl/typelib.h | 1 + tools/widl/widltypes.h | 1 + tools/widl/write_msft.c | 30 +++++++++++++++++++++++++++++- 5 files changed, 51 insertions(+), 2 deletions(-) diff --git a/tools/widl/parser.y b/tools/widl/parser.y index 217aa05d0a7..3a981cf547d 100644 --- a/tools/widl/parser.y +++ b/tools/widl/parser.y @@ -732,12 +732,14 @@ type: tVOID { $$ = make_tref(NULL, make_type(0, NULL)); } | tUNION aIDENTIFIER { $$ = make_tref(NULL, find_type2($2, tsUNION)); } ; -typedef: tTYPEDEF m_attributes type pident_list { typeref_t *tref = uniq_tref($3); +typedef: tTYPEDEF m_attributes type pident_list { typeref_t *tref = uniq_tref($3); $4->tname = tref->name; tref->name = NULL; $$ = type_ref(tref); $$->attrs = $2; if (!parse_only && do_header) write_typedef($$, $4); + if (in_typelib && $$->attrs) + add_typedef($$, $4); reg_types($$, $4, 0); } ; diff --git a/tools/widl/typelib.c b/tools/widl/typelib.c index c1eace9e2a6..af3d687b06b 100644 --- a/tools/widl/typelib.c +++ b/tools/widl/typelib.c @@ -148,6 +148,8 @@ unsigned short get_type_vt(type_t *t) case RPC_FC_PSTRUCT: return VT_USERDEFINED; case 0: + if(t->attrs) + return VT_USERDEFINED; return 0; default: error("get_type_vt: unknown-type: %d\n", t->type); @@ -264,3 +266,18 @@ void add_enum(type_t *enumeration) LINK(entry, typelib->entry); typelib->entry = entry; } + +void add_typedef(type_t *tdef, var_t *name) +{ + typelib_entry_t *entry; + if (!typelib) return; + + entry = xmalloc(sizeof(*entry)); + entry->kind = TKIND_ALIAS; + entry->u.tdef = xmalloc(sizeof(*entry->u.tdef)); + memcpy(entry->u.tdef, name, sizeof(*name)); + entry->u.tdef->type = tdef; + entry->u.tdef->name = xstrdup(name->name); + LINK(entry, typelib->entry); + typelib->entry = entry; +} diff --git a/tools/widl/typelib.h b/tools/widl/typelib.h index 193d4498b40..d6ba5a7d700 100644 --- a/tools/widl/typelib.h +++ b/tools/widl/typelib.h @@ -29,6 +29,7 @@ extern void add_coclass(class_t *cls); extern void add_module(type_t *module); extern void add_struct(type_t *structure); extern void add_enum(type_t *enumeration); +extern void add_typedef(type_t *tdef, var_t *name); /* Copied from wtypes.h. Not included directly because that would create a * circular dependency (after all, wtypes.h is generated by widl...) */ diff --git a/tools/widl/widltypes.h b/tools/widl/widltypes.h index 5ed09d5ed4a..559365909a6 100644 --- a/tools/widl/widltypes.h +++ b/tools/widl/widltypes.h @@ -242,6 +242,7 @@ struct _typelib_entry_t { type_t *module; type_t *structure; type_t *enumeration; + var_t *tdef; } u; DECL_LINK(typelib_entry_t) }; diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index a61b8c41795..a1e8d962de1 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -884,6 +884,8 @@ static int encode_type( case RPC_FC_IP: add_interface_typeinfo(typelib, type); break; + case 0: + error("encode_type: VT_USERDEFINED - can't yet add typedef's on the fly\n"); default: error("encode_type: VT_USERDEFINED - unhandled type %d\n", type->type); } @@ -934,7 +936,7 @@ static int encode_type( static void dump_type(type_t *t) { - chat("dump_type: %p name %s type %d ref %p rname %s\n", t, t->name, t->type, t->ref, t->rname); + chat("dump_type: %p name %s type %d ref %p rname %s attrs %p\n", t, t->name, t->type, t->ref, t->rname, t->attrs); if(t->ref) dump_type(t->ref); } @@ -1616,6 +1618,9 @@ static msft_typeinfo_t *create_msft_typeinfo(msft_typelib_t *typelib, enum type_ case ATTR_ODL: break; + case ATTR_PUBLIC: + break; + case ATTR_RESTRICTED: typeinfo->flags |= 0x200; /* TYPEFLAG_FRESTRICTED */ break; @@ -1685,6 +1690,7 @@ static void add_dispinterface_typeinfo(msft_typelib_t *typelib, type_t *dispinte var_t *var; msft_typeinfo_t *msft_typeinfo; + dispinterface->typelib_idx = typelib->typelib_header.nrtypeinfos; msft_typeinfo = create_msft_typeinfo(typelib, TKIND_DISPATCH, dispinterface->name, dispinterface->attrs, typelib->typelib_header.nrtypeinfos); @@ -1813,6 +1819,24 @@ static void add_enum_typeinfo(msft_typelib_t *typelib, type_t *enumeration) } } + +static void add_typedef_typeinfo(msft_typelib_t *typelib, var_t *tdef) +{ + msft_typeinfo_t *msft_typeinfo; + int alignment; + attr_t *attrs; + + tdef->type->typelib_idx = typelib->typelib_header.nrtypeinfos; + msft_typeinfo = create_msft_typeinfo(typelib, TKIND_ALIAS, tdef->name, tdef->type->attrs, + typelib->typelib_header.nrtypeinfos); + attrs = tdef->type->attrs; + tdef->type->attrs = NULL; + encode_var(typelib, tdef, &msft_typeinfo->typeinfo->datatype1, &msft_typeinfo->typeinfo->size, + &alignment, &msft_typeinfo->typeinfo->datatype2); + tdef->type->attrs = attrs; + msft_typeinfo->typeinfo->typekind |= (alignment << 11 | alignment << 6); +} + static void add_entry(msft_typelib_t *typelib, typelib_entry_t *entry) { switch(entry->kind) { @@ -1828,6 +1852,10 @@ static void add_entry(msft_typelib_t *typelib, typelib_entry_t *entry) add_enum_typeinfo(typelib, entry->u.enumeration); break; + case TKIND_ALIAS: + add_typedef_typeinfo(typelib, entry->u.tdef); + break; + default: error("add_entry: unhandled type %d\n", entry->kind); break;