Rob Shearman : widl: Write the generated file containing IID, DIID, CLSID and LIBID data based on the parsed list of statements instead of using hooks in the parser code .

Alexandre Julliard julliard at winehq.org
Mon Dec 29 08:48:02 CST 2008


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

Author: Rob Shearman <robertshearman at gmail.com>
Date:   Mon Dec 29 12:06:12 2008 +0000

widl: Write the generated file containing IID, DIID, CLSID and LIBID data based on the parsed list of statements instead of using hooks in the parser code.

---

 tools/widl/parser.y |   37 +----------------------
 tools/widl/widl.c   |   83 ++++++++++++++++++++++++++++++++++++---------------
 tools/widl/widl.h   |    1 +
 3 files changed, 61 insertions(+), 60 deletions(-)

diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index cdb7a3a..42479dc 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -139,11 +139,6 @@ static type_t *get_type(unsigned char type, char *name, int t);
 
 static var_t *reg_const(var_t *var);
 
-static void write_libid(const typelib_t *typelib);
-static void write_clsid(type_t *cls);
-static void write_diid(type_t *iface);
-static void write_iid(type_t *iface);
-
 static char *gen_name(void);
 static statement_t *process_typedefs(var_list_t *names);
 static void check_arg(var_t *arg);
@@ -354,6 +349,7 @@ static func_list_t *append_func_from_statement(func_list_t *list, statement_t *s
 
 input:   gbl_statements				{ fix_incomplete();
 						  check_all_user_types($1);
+						  write_id_data($1);
 						  write_proxies($1);
 						  write_client($1);
 						  write_server($1);
@@ -449,7 +445,6 @@ libraryhdr: tLIBRARY aIDENTIFIER		{ $$ = $2; }
 library_start: attributes libraryhdr '{'	{ $$ = make_library($2, check_library_attrs($2, $1));
 						  if (!parse_only) start_typelib($$);
 						  if (!parse_only && do_header) write_library($$);
-						  if (!parse_only && do_idfile) write_libid($$);
 						  is_inside_library = TRUE;
 						}
 	;
@@ -847,8 +842,6 @@ coclasshdr: attributes coclass			{ $$ = $2;
 						  $$->attrs = check_coclass_attrs($2->name, $1);
 						  if (!parse_only && do_header)
 						    write_coclass($$);
-						  if (!parse_only && do_idfile)
-						    write_clsid($$);
 						}
 	;
 
@@ -897,14 +890,12 @@ dispinterfacedef: dispinterfacehdr '{'
 	  '}'					{ $$ = $1;
 						  type_dispinterface_define($$, $3, $4);
 						  if (!parse_only && do_header) write_interface($$);
-						  if (!parse_only && do_idfile) write_diid($$);
 						  is_in_interface = FALSE;
 						}
 	| dispinterfacehdr
 	 '{' interface ';' '}' 			{ $$ = $1;
 						  type_dispinterface_define_from_iface($$, $3);
 						  if (!parse_only && do_header) write_interface($$);
-						  if (!parse_only && do_idfile) write_diid($$);
 						  is_in_interface = FALSE;
 						}
 	;
@@ -935,7 +926,6 @@ interfacedef: interfacehdr inherit
 						  type_interface_define($$, $2, $4);
 						  if (!parse_only && do_header) write_interface($$);
 						  if (!parse_only && local_stubs) write_locals(local_stubs, $$, TRUE);
-						  if (!parse_only && do_idfile) write_iid($$);
 						  pointer_default = $1.old_pointer_default;
 						  is_in_interface = FALSE;
 						}
@@ -947,7 +937,6 @@ interfacedef: interfacehdr inherit
 						  type_interface_define($$, find_type_or_error2($3, 0), $6);
 						  if (!parse_only && do_header) write_interface($$);
 						  if (!parse_only && local_stubs) write_locals(local_stubs, $$, TRUE);
-						  if (!parse_only && do_idfile) write_iid($$);
 						  pointer_default = $1.old_pointer_default;
 						  is_in_interface = FALSE;
 						}
@@ -2022,30 +2011,6 @@ var_t *find_const(const char *name, int f)
   return cur->var;
 }
 
-static void write_libid(const typelib_t *typelib)
-{
-  const UUID *uuid = get_attrp(typelib->attrs, ATTR_UUID);
-  write_guid(idfile, "LIBID", typelib->name, uuid);
-}
-
-static void write_clsid(type_t *cls)
-{
-  const UUID *uuid = get_attrp(cls->attrs, ATTR_UUID);
-  write_guid(idfile, "CLSID", cls->name, uuid);
-}
-
-static void write_diid(type_t *iface)
-{
-  const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
-  write_guid(idfile, "DIID", iface->name, uuid);
-}
-
-static void write_iid(type_t *iface)
-{
-  const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
-  write_guid(idfile, "IID", iface->name, uuid);
-}
-
 static char *gen_name(void)
 {
   static const char format[] = "__WIDL_%s_generated_name_%08lX";
diff --git a/tools/widl/widl.c b/tools/widl/widl.c
index 3f03f40..cc3b40e 100644
--- a/tools/widl/widl.c
+++ b/tools/widl/widl.c
@@ -343,6 +343,65 @@ void write_dlldata(const statement_list_t *stmts)
   free_filename_nodes(&filenames);
 }
 
+static void write_id_data_stmts(const statement_list_t *stmts)
+{
+  const statement_t *stmt;
+  if (stmts) LIST_FOR_EACH_ENTRY( stmt, stmts, const statement_t, entry )
+  {
+    if (stmt->type == STMT_TYPE)
+    {
+      const type_t *type = stmt->u.type;
+      if (type->type == RPC_FC_IP)
+      {
+        const UUID *uuid;
+        if (!is_object(type->attrs) && !is_attr(type->attrs, ATTR_DISPINTERFACE))
+          continue;
+        uuid = get_attrp(type->attrs, ATTR_UUID);
+        write_guid(idfile, is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID",
+                   type->name, uuid);
+      }
+      else if (type->type == RPC_FC_COCLASS)
+      {
+        const UUID *uuid = get_attrp(type->attrs, ATTR_UUID);
+        write_guid(idfile, "CLSID", type->name, uuid);
+      }
+    }
+    else if (stmt->type == STMT_LIBRARY)
+    {
+      const UUID *uuid = get_attrp(stmt->u.lib->attrs, ATTR_UUID);
+      write_guid(idfile, "LIBID", stmt->u.lib->name, uuid);
+      write_id_data_stmts(stmt->u.lib->stmts);
+    }
+  }
+}
+
+void write_id_data(const statement_list_t *stmts)
+{
+  if (!do_idfile) return;
+
+  idfile_token = make_token(idfile_name);
+
+  idfile = fopen(idfile_name, "w");
+  if (! idfile) {
+    error("Could not open %s for output\n", idfile_name);
+    return;
+  }
+
+  fprintf(idfile, "/*** Autogenerated by WIDL %s ", PACKAGE_VERSION);
+  fprintf(idfile, "from %s - Do not edit ***/\n\n", input_name);
+  fprintf(idfile, "#include <rpc.h>\n");
+  fprintf(idfile, "#include <rpcndr.h>\n\n");
+  fprintf(idfile, "#include <initguid.h>\n\n");
+  start_cplusplus_guard(idfile);
+
+  write_id_data_stmts(stmts);
+
+  fprintf(idfile, "\n");
+  end_cplusplus_guard(idfile);
+
+  fclose(idfile);
+}
+
 int main(int argc,char *argv[])
 {
   extern char* optarg;
@@ -595,23 +654,6 @@ int main(int argc,char *argv[])
     fprintf(local_stubs, "#include \"%s\"\n\n", header_name);
   }
 
-  if (do_idfile) {
-    idfile_token = make_token(idfile_name);
-
-    idfile = fopen(idfile_name, "w");
-    if (! idfile) {
-      fprintf(stderr, "Could not open %s for output\n", idfile_name);
-      return 1;
-    }
-
-    fprintf(idfile, "/*** Autogenerated by WIDL %s ", PACKAGE_VERSION);
-    fprintf(idfile, "from %s - Do not edit ***/\n\n", input_name);
-    fprintf(idfile, "#include <rpc.h>\n");
-    fprintf(idfile, "#include <rpcndr.h>\n\n");
-    fprintf(idfile, "#include <initguid.h>\n\n");
-    start_cplusplus_guard(idfile);
-  }
-
   init_types();
   ret = parser_parse();
 
@@ -633,13 +675,6 @@ int main(int argc,char *argv[])
     fclose(local_stubs);
   }
 
-  if (do_idfile) {
-    fprintf(idfile, "\n");
-    end_cplusplus_guard(idfile);
-
-    fclose(idfile);
-  }
-
   fclose(parser_in);
 
   if(ret) {
diff --git a/tools/widl/widl.h b/tools/widl/widl.h
index 01de04c..d45c157 100644
--- a/tools/widl/widl.h
+++ b/tools/widl/widl.h
@@ -71,6 +71,7 @@ extern FILE* header;
 extern FILE* local_stubs;
 extern FILE* idfile;
 
+extern void write_id_data(const statement_list_t *stmts);
 extern void write_proxies(const statement_list_t *stmts);
 extern void write_client(const statement_list_t *stmts);
 extern void write_server(const statement_list_t *stmts);




More information about the wine-cvs mailing list