Commit 7d7dd182 authored by Rob Shearman's avatar Rob Shearman Committed by Alexandre Julliard

widl: Write the generated file containing IID, DIID, CLSID and LIBID data based…

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.
parent 5223d04a
......@@ -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";
......
......@@ -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) {
......
......@@ -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);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment