Jacek Caban : widl: Added support for namespaced structs.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 13 04:23:49 CDT 2015


Module: wine
Branch: master
Commit: 7c29a53208e0d2f382fbf6af02078ec172c72410
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7c29a53208e0d2f382fbf6af02078ec172c72410

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Aug 10 13:19:48 2015 +0200

widl: Added support for namespaced structs.

---

 tools/widl/header.c   | 4 ++--
 tools/widl/parser.y   | 6 +++---
 tools/widl/typetree.c | 8 +++++---
 tools/widl/typetree.h | 2 +-
 4 files changed, 11 insertions(+), 9 deletions(-)

diff --git a/tools/widl/header.c b/tools/widl/header.c
index 29b622e..cb4601e 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -314,7 +314,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
       case TYPE_STRUCT:
       case TYPE_ENCAPSULATED_UNION:
         if (!declonly && t->defined && !t->written) {
-          if (t->name) fprintf(h, "struct %s {\n", t->name);
+          if (name) fprintf(h, "struct %s {\n", name);
           else fprintf(h, "struct {\n");
           t->written = TRUE;
           indentation++;
@@ -325,7 +325,7 @@ void write_type_left(FILE *h, type_t *t, enum name_type name_type, int declonly)
           indent(h, -1);
           fprintf(h, "}");
         }
-        else fprintf(h, "struct %s", t->name ? t->name : "");
+        else fprintf(h, "struct %s", name ? name : "");
         break;
       case TYPE_UNION:
         if (!declonly && t->defined && !t->written) {
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index ba0be1c..b42b4a2 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -380,7 +380,7 @@ typedecl:
 	  enumdef
 	| tENUM aIDENTIFIER                     { $$ = type_new_enum($2, current_namespace, FALSE, NULL); }
 	| structdef
-	| tSTRUCT aIDENTIFIER                   { $$ = type_new_struct($2, FALSE, NULL); }
+	| tSTRUCT aIDENTIFIER                   { $$ = type_new_struct($2, current_namespace, FALSE, NULL); }
 	| uniondef
 	| tUNION aIDENTIFIER                    { $$ = type_new_nonencapsulated_union($2, FALSE, NULL); }
 	| attributes enumdef                    { $$ = $2; $$->attrs = check_enum_attrs($1); }
@@ -1091,7 +1091,7 @@ pointer_type:
 	| tPTR					{ $$ = RPC_FC_FP; }
 	;
 
-structdef: tSTRUCT t_ident '{' fields '}'	{ $$ = type_new_struct($2, TRUE, $4); }
+structdef: tSTRUCT t_ident '{' fields '}'	{ $$ = type_new_struct($2, current_namespace, TRUE, $4); }
 	;
 
 type:	  tVOID					{ $$ = type_new_void(); }
@@ -1100,7 +1100,7 @@ type:	  tVOID					{ $$ = type_new_void(); }
 	| enumdef				{ $$ = $1; }
 	| tENUM aIDENTIFIER			{ $$ = type_new_enum($2, current_namespace, FALSE, NULL); }
 	| structdef				{ $$ = $1; }
-	| tSTRUCT aIDENTIFIER			{ $$ = type_new_struct($2, FALSE, NULL); }
+	| tSTRUCT aIDENTIFIER			{ $$ = type_new_struct($2, current_namespace, FALSE, NULL); }
 	| uniondef				{ $$ = $1; }
 	| tUNION aIDENTIFIER			{ $$ = type_new_nonencapsulated_union($2, FALSE, NULL); }
 	| tSAFEARRAY '(' type ')'		{ $$ = make_safearray($3); }
diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c
index 3f8ced3..5925d40 100644
--- a/tools/widl/typetree.c
+++ b/tools/widl/typetree.c
@@ -297,11 +297,13 @@ type_t *type_new_enum(const char *name, struct namespace *namespace, int defined
     return t;
 }
 
-type_t *type_new_struct(char *name, int defined, var_list_t *fields)
+type_t *type_new_struct(char *name, struct namespace *namespace, int defined, var_list_t *fields)
 {
-    type_t *tag_type = name ? find_type(name, NULL, tsSTRUCT) : NULL;
+    type_t *tag_type = name ? find_type(name, namespace, tsSTRUCT) : NULL;
     type_t *t = make_type(TYPE_STRUCT);
     t->name = name;
+    t->namespace = namespace;
+
     if (tag_type && tag_type->details.structure)
         t->details.structure = tag_type->details.structure;
     else if (defined)
@@ -313,7 +315,7 @@ type_t *type_new_struct(char *name, int defined, var_list_t *fields)
     if (name)
     {
         if (defined)
-            reg_type(t, name, NULL, tsSTRUCT);
+            reg_type(t, name, namespace, tsSTRUCT);
         else
             add_incomplete(t);
     }
diff --git a/tools/widl/typetree.h b/tools/widl/typetree.h
index 873ba8a..bf05f25 100644
--- a/tools/widl/typetree.h
+++ b/tools/widl/typetree.h
@@ -41,7 +41,7 @@ type_t *type_new_int(enum type_basic_type basic_type, int sign);
 type_t *type_new_void(void);
 type_t *type_new_coclass(char *name);
 type_t *type_new_enum(const char *name, struct namespace *namespace, int defined, var_list_t *enums);
-type_t *type_new_struct(char *name, int defined, var_list_t *fields);
+type_t *type_new_struct(char *name, struct namespace *namespace, int defined, var_list_t *fields);
 type_t *type_new_nonencapsulated_union(const char *name, int defined, var_list_t *fields);
 type_t *type_new_encapsulated_union(char *name, var_t *switch_field, var_t *union_field, var_list_t *cases);
 type_t *type_new_bitfield(type_t *field_type, const expr_t *bits);




More information about the wine-cvs mailing list