diff --git a/tools/widl/parser.y b/tools/widl/parser.y index cdb7a3ac2bf..42479dce78c 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 3f03f40f91e..cc3b40efc97 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 \n"); + fprintf(idfile, "#include \n\n"); + fprintf(idfile, "#include \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 \n"); - fprintf(idfile, "#include \n\n"); - fprintf(idfile, "#include \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 01de04c3d99..d45c1570805 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);