widl #34: typedef support
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Wed Feb 2 07:38:26 CST 2005
Huw Davies <huw at codeweavers.com>
Add support for typedefs
--
Huw Davies
huw at codeweavers.com
Index: tools/widl/parser.y
===================================================================
RCS file: /home/wine/wine/tools/widl/parser.y,v
retrieving revision 1.38
diff -u -p -r1.38 parser.y
--- tools/widl/parser.y 1 Feb 2005 18:48:25 -0000 1.38
+++ tools/widl/parser.y 2 Feb 2005 13:36:28 -0000
@@ -732,12 +732,14 @@ type: tVOID { $$ = make_tref(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);
}
;
Index: tools/widl/typelib.c
===================================================================
RCS file: /home/wine/wine/tools/widl/typelib.c,v
retrieving revision 1.10
diff -u -p -r1.10 typelib.c
--- tools/widl/typelib.c 28 Jan 2005 13:59:08 -0000 1.10
+++ tools/widl/typelib.c 2 Feb 2005 13:36:28 -0000
@@ -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);
@@ -261,6 +263,21 @@ void add_enum(type_t *enumeration)
entry = xmalloc(sizeof(*entry));
entry->kind = TKIND_ENUM;
entry->u.enumeration = 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;
}
Index: tools/widl/typelib.h
===================================================================
RCS file: /home/wine/wine/tools/widl/typelib.h,v
retrieving revision 1.5
diff -u -p -r1.5 typelib.h
--- tools/widl/typelib.h 25 Jan 2005 20:02:09 -0000 1.5
+++ tools/widl/typelib.h 2 Feb 2005 13:36:28 -0000
@@ -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...) */
Index: tools/widl/widltypes.h
===================================================================
RCS file: /home/wine/wine/tools/widl/widltypes.h,v
retrieving revision 1.25
diff -u -p -r1.25 widltypes.h
--- tools/widl/widltypes.h 1 Feb 2005 18:48:25 -0000 1.25
+++ tools/widl/widltypes.h 2 Feb 2005 13:36:28 -0000
@@ -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)
};
Index: tools/widl/write_msft.c
===================================================================
RCS file: /home/wine/wine/tools/widl/write_msft.c,v
retrieving revision 1.27
diff -u -p -r1.27 write_msft.c
--- tools/widl/write_msft.c 1 Feb 2005 18:48:25 -0000 1.27
+++ tools/widl/write_msft.c 2 Feb 2005 13:36:28 -0000
@@ -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_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(m
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_typel
}
}
+
+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) {
@@ -1826,6 +1850,10 @@ static void add_entry(msft_typelib_t *ty
case TKIND_ENUM:
add_enum_typeinfo(typelib, entry->u.enumeration);
+ break;
+
+ case TKIND_ALIAS:
+ add_typedef_typeinfo(typelib, entry->u.tdef);
break;
default:
More information about the wine-patches
mailing list