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