Jacek Caban : widl: Make identifiers file more compatible with midl.
Alexandre Julliard
julliard at winehq.org
Thu Jan 9 12:52:49 CST 2014
Module: wine
Branch: master
Commit: 0df819eecff79533bd5cc3b71bc81b063d3901e1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=0df819eecff79533bd5cc3b71bc81b063d3901e1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Jan 9 12:15:02 2014 +0100
widl: Make identifiers file more compatible with midl.
---
tools/widl/header.c | 2 +-
tools/widl/header.h | 2 --
tools/widl/widl.c | 38 ++++++++++++++++++++++++++++++++++----
3 files changed, 35 insertions(+), 7 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index bd9f21c..4ca6ed5 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -119,7 +119,7 @@ int is_conformant_array(const type_t *t)
return is_array(t) && type_array_has_conformance(t);
}
-void write_guid(FILE *f, const char *guid_prefix, const char *name, const UUID *uuid)
+static void write_guid(FILE *f, const char *guid_prefix, const char *name, const UUID *uuid)
{
if (!uuid) return;
fprintf(f, "DEFINE_GUID(%s_%s, 0x%08x, 0x%04x, 0x%04x, 0x%02x,0x%02x, 0x%02x,"
diff --git a/tools/widl/header.h b/tools/widl/header.h
index bf5f426..3af57d6 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -56,8 +56,6 @@ extern const type_t* get_explicit_generic_handle_type(const var_t* var);
extern const var_t *get_func_handle_var( const type_t *iface, const var_t *func,
unsigned char *explicit_fc, unsigned char *implicit_fc );
extern int has_out_arg_or_return(const var_t *func);
-extern void write_guid(FILE *f, const char *guid_prefix, const char *name,
- const UUID *uuid);
extern int is_const_decl(const var_t *var);
static inline int last_ptr(const type_t *type)
diff --git a/tools/widl/widl.c b/tools/widl/widl.c
index 902bc92..5fa67f4 100644
--- a/tools/widl/widl.c
+++ b/tools/widl/widl.c
@@ -446,6 +446,16 @@ void write_dlldata(const statement_list_t *stmts)
free_filename_nodes(&filenames);
}
+static void write_id_guid(FILE *f, const char *type, const char *guid_prefix, const char *name, const UUID *uuid)
+{
+ if (!uuid) return;
+ fprintf(f, "MIDL_DEFINE_GUID(%s, %s_%s, 0x%08x, 0x%04x, 0x%04x, 0x%02x,0x%02x, 0x%02x,"
+ "0x%02x,0x%02x,0x%02x,0x%02x,0x%02x);\n",
+ type, guid_prefix, name, uuid->Data1, uuid->Data2, uuid->Data3, uuid->Data4[0],
+ uuid->Data4[1], uuid->Data4[2], uuid->Data4[3], uuid->Data4[4], uuid->Data4[5],
+ uuid->Data4[6], uuid->Data4[7]);
+}
+
static void write_id_data_stmts(const statement_list_t *stmts)
{
const statement_t *stmt;
@@ -460,19 +470,19 @@ static void write_id_data_stmts(const statement_list_t *stmts)
if (!is_object(type) && !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",
+ write_id_guid(idfile, "IID", is_attr(type->attrs, ATTR_DISPINTERFACE) ? "DIID" : "IID",
type->name, uuid);
}
else if (type_get_type(type) == TYPE_COCLASS)
{
const UUID *uuid = get_attrp(type->attrs, ATTR_UUID);
- write_guid(idfile, "CLSID", type->name, uuid);
+ write_id_guid(idfile, "CLSID", "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_guid(idfile, "IID", "LIBID", stmt->u.lib->name, uuid);
write_id_data_stmts(stmt->u.lib->stmts);
}
}
@@ -492,13 +502,33 @@ void write_id_data(const statement_list_t *stmts)
fprintf(idfile, "from %s - Do not edit ***/\n\n", input_idl_name);
fprintf(idfile, "#include <rpc.h>\n");
fprintf(idfile, "#include <rpcndr.h>\n\n");
- fprintf(idfile, "#include <initguid.h>\n\n");
+
+ fprintf(idfile, "#ifdef _MIDL_USE_GUIDDEF_\n\n");
+
+ fprintf(idfile, "#ifndef INITGUID\n");
+ fprintf(idfile, "#define INITGUID\n");
+ fprintf(idfile, "#include <guiddef.h>\n");
+ fprintf(idfile, "#undef INITGUID\n");
+ fprintf(idfile, "#else\n");
+ fprintf(idfile, "#include <guiddef.h>\n");
+ fprintf(idfile, "#endif\n\n");
+
+ fprintf(idfile, "#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\\n");
+ fprintf(idfile, " DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)\n\n");
+
+ fprintf(idfile, "#else\n\n");
+
+ fprintf(idfile, "#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \\\n");
+ fprintf(idfile, " const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}\n\n");
+
+ fprintf(idfile, "#endif\n\n");
start_cplusplus_guard(idfile);
write_id_data_stmts(stmts);
fprintf(idfile, "\n");
end_cplusplus_guard(idfile);
+ fprintf(idfile, "#undef MIDL_DEFINE_GUID\n" );
fclose(idfile);
}
More information about the wine-cvs
mailing list