Dan Hipschman : widl: Generate GUID (infile_i.c) files.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Aug 4 06:30:11 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: df91150e10c093933bd4fd685a68885f38067b8e
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=df91150e10c093933bd4fd685a68885f38067b8e
Author: Dan Hipschman <dsh at linux.ucla.edu>
Date: Thu Aug 3 17:48:45 2006 -0700
widl: Generate GUID (infile_i.c) files.
---
tools/widl/header.c | 12 ++++++-----
tools/widl/header.h | 2 ++
tools/widl/parser.y | 39 ++++++++++++++++++++++++++++++++++++-
tools/widl/widl.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++----
tools/widl/widl.h | 2 ++
5 files changed, 98 insertions(+), 11 deletions(-)
diff --git a/tools/widl/header.c b/tools/widl/header.c
index c807691..6344fb3 100644
--- a/tools/widl/header.c
+++ b/tools/widl/header.c
@@ -80,10 +80,10 @@ int is_void(const type_t *t, const var_t
return 0;
}
-static void write_guid(const char *guid_prefix, const char *name, const UUID *uuid)
+void write_guid(FILE *f, const char *guid_prefix, const char *name, const UUID *uuid)
{
if (!uuid) return;
- fprintf(header, "DEFINE_GUID(%s_%s, 0x%08lx, 0x%04x, 0x%04x, 0x%02x,0x%02x, 0x%02x,"
+ fprintf(f, "DEFINE_GUID(%s_%s, 0x%08lx, 0x%04x, 0x%04x, 0x%02x,0x%02x, 0x%02x,"
"0x%02x,0x%02x,0x%02x,0x%02x,0x%02x);\n",
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],
@@ -503,7 +503,7 @@ void write_externdef(const var_t *v)
void write_library(const char *name, const attr_t *attr) {
const UUID *uuid = get_attrp(attr, ATTR_UUID);
fprintf(header, "\n");
- write_guid("LIBID", name, uuid);
+ write_guid(header, "LIBID", name, uuid);
fprintf(header, "\n");
}
@@ -846,19 +846,19 @@ void write_forward(type_t *iface)
static void write_iface_guid(const type_t *iface)
{
const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
- write_guid("IID", iface->name, uuid);
+ write_guid(header, "IID", iface->name, uuid);
}
static void write_dispiface_guid(const type_t *iface)
{
const UUID *uuid = get_attrp(iface->attrs, ATTR_UUID);
- write_guid("DIID", iface->name, uuid);
+ write_guid(header, "DIID", iface->name, uuid);
}
static void write_coclass_guid(type_t *cocl)
{
const UUID *uuid = get_attrp(cocl->attrs, ATTR_UUID);
- write_guid("CLSID", cocl->name, uuid);
+ write_guid(header, "CLSID", cocl->name, uuid);
}
static void write_com_interface(type_t *iface)
diff --git a/tools/widl/header.h b/tools/widl/header.h
index 5863f3b..6358d98 100644
--- a/tools/widl/header.h
+++ b/tools/widl/header.h
@@ -46,6 +46,8 @@ extern void write_library(const char *na
extern void write_user_types(void);
extern const var_t* get_explicit_handle_var(const func_t* func);
extern int has_out_arg_or_return(const func_t *func);
+extern void write_guid(FILE *f, const char *guid_prefix, const char *name,
+ const UUID *uuid);
static inline int is_string_type(const attr_t *attrs, int ptr_level, const expr_t *array)
{
diff --git a/tools/widl/parser.y b/tools/widl/parser.y
index b9f858e..ca5db5c 100644
--- a/tools/widl/parser.y
+++ b/tools/widl/parser.y
@@ -96,6 +96,11 @@ static int get_struct_type(var_t *fields
static var_t *reg_const(var_t *var);
static var_t *find_const(char *name, int f);
+static void write_libid(const char *name, const attr_t *attr);
+static void write_clsid(type_t *cls);
+static void write_diid(type_t *iface);
+static void write_iid(type_t *iface);
+
#define tsENUM 1
#define tsSTRUCT 2
#define tsUNION 3
@@ -299,7 +304,9 @@ importlib: tIMPORTLIB '(' aSTRING ')' {
libraryhdr: tLIBRARY aIDENTIFIER { $$ = $2; }
;
library_start: attributes libraryhdr '{' { start_typelib($2, $1);
- if (!parse_only && do_header) write_library($2, $1); }
+ if (!parse_only && do_header) write_library($2, $1);
+ if (!parse_only && do_idfile) write_libid($2, $1);
+ }
;
librarydef: library_start imp_statements '}' { end_typelib(); }
;
@@ -649,6 +656,8 @@ coclasshdr: attributes coclass { $$ =
$$->attrs = $1;
if (!parse_only && do_header)
write_coclass($$);
+ if (!parse_only && do_idfile)
+ write_clsid($$);
}
;
@@ -698,10 +707,12 @@ dispinterfacedef: dispinterfacehdr '{'
$$->fields = $3;
$$->funcs = $4;
if (!parse_only && do_header) write_dispinterface($$);
+ if (!parse_only && do_idfile) write_diid($$);
}
/* FIXME: not sure how to handle this yet
| dispinterfacehdr '{' interface '}' { $$ = $1;
if (!parse_only && do_header) write_interface($$);
+ if (!parse_only && do_idfile) write_iid($$);
}
*/
;
@@ -727,6 +738,7 @@ interfacedef: interfacehdr inherit
$$->ref = $2;
$$->funcs = $4;
if (!parse_only && do_header) write_interface($$);
+ if (!parse_only && do_idfile) write_iid($$);
}
/* MIDL is able to import the definition of a base class from inside the
* definition of a derived class, I'll try to support it with this rule */
@@ -736,6 +748,7 @@ interfacedef: interfacehdr inherit
if (!$$->ref) yyerror("base class '%s' not found in import", $3);
$$->funcs = $6;
if (!parse_only && do_header) write_interface($$);
+ if (!parse_only && do_idfile) write_iid($$);
}
| dispinterfacedef { $$ = $1; }
;
@@ -1505,3 +1518,27 @@ static var_t *find_const(char *name, int
}
return cur->var;
}
+
+static void write_libid(const char *name, const attr_t *attr)
+{
+ const UUID *uuid = get_attrp(attr, ATTR_UUID);
+ write_guid(idfile, "LIBID", 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);
+}
diff --git a/tools/widl/widl.c b/tools/widl/widl.c
index c6c4a1c..152d35f 100644
--- a/tools/widl/widl.c
+++ b/tools/widl/widl.c
@@ -46,8 +46,6 @@ #include "header.h"
/* A = ACF input filename */
/* J = do not search standard include path */
/* O = generate interpreted stubs */
-/* u = UUID file only? */
-/* U = UUID filename */
/* w = select win16/win32 output (?) */
static char usage[] =
@@ -68,6 +66,8 @@ static char usage[] =
" -S file Name of server stub file (default is infile_s.c)\n"
" -t Generate typelib\n"
" -T file Name of typelib file (default is infile.tlb)\n"
+" -u Generate interface identifiers file\n"
+" -U file Name of interface identifiers file (default is infile_i.c)\n"
" -V Print version and exit\n"
" -W Enable pedantic warnings\n"
"Debug level 'n' is a bitmask with following meaning:\n"
@@ -94,6 +94,7 @@ int do_typelib = 0;
int do_proxies = 0;
int do_client = 0;
int do_server = 0;
+int do_idfile = 0;
int no_preprocess = 0;
int old_names = 0;
@@ -107,17 +108,20 @@ char *client_name;
char *client_token;
char *server_name;
char *server_token;
+char *idfile_name;
+char *idfile_token;
char *temp_name;
int line_number = 1;
FILE *header;
FILE *proxy;
+FILE *idfile;
time_t now;
static const char *short_options =
- "cC:d:D:EhH:I:NpP:sS:tT:VW";
+ "cC:d:D:EhH:I:NpP:sS:tT:uU:VW";
static struct option long_options[] = {
{ "oldnames", 0, 0, 1 },
{ 0, 0, 0, 0 }
@@ -231,6 +235,13 @@ #endif
case 'T':
typelib_name = strdup(optarg);
break;
+ case 'u':
+ do_everything = 0;
+ do_idfile = 1;
+ break;
+ case 'U':
+ idfile_name = strdup(optarg);
+ break;
case 'V':
printf(version_string);
return 0;
@@ -244,7 +255,7 @@ #endif
}
if(do_everything) {
- do_header = do_typelib = do_proxies = do_client = do_server = 1;
+ do_header = do_typelib = do_proxies = do_client = do_server = do_idfile = 1;
}
if(optind < argc) {
input_name = xstrdup(argv[optind]);
@@ -292,6 +303,11 @@ #endif
strcat(server_name, "_s.c");
}
+ if (!idfile_name && do_idfile) {
+ idfile_name = dup_basename(input_name, ".idl");
+ strcat(idfile_name, "_i.c");
+ }
+
if (do_proxies) proxy_token = dup_basename_token(proxy_name,"_p.c");
if (do_client) client_token = dup_basename_token(client_name,"_c.c");
if (do_server) server_token = dup_basename_token(server_name,"_s.c");
@@ -343,6 +359,26 @@ #endif
fprintf(header, "#endif\n");
}
+ 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, "#define INITGUID\n");
+ fprintf(idfile, "#include <guiddef.h>\n\n");
+ fprintf(idfile, "#ifdef __cplusplus\n");
+ fprintf(idfile, "extern \"C\" {\n");
+ fprintf(idfile, "#endif\n\n");
+ }
+
ret = yyparse();
if(do_header) {
@@ -359,6 +395,15 @@ #endif
fclose(header);
}
+ if (do_idfile) {
+ fprintf(idfile, "\n");
+ fprintf(idfile, "#ifdef __cplusplus\n");
+ fprintf(idfile, "}\n");
+ fprintf(idfile, "#endif\n");
+
+ fclose(idfile);
+ }
+
fclose(yyin);
if(ret) {
@@ -367,6 +412,7 @@ #endif
header_name = NULL;
client_name = NULL;
server_name = NULL;
+ idfile_name = NULL;
return 0;
}
diff --git a/tools/widl/widl.h b/tools/widl/widl.h
index d41ca70..9357450 100644
--- a/tools/widl/widl.h
+++ b/tools/widl/widl.h
@@ -43,6 +43,7 @@ extern int do_typelib;
extern int do_proxies;
extern int do_client;
extern int do_server;
+extern int do_idfile;
extern int old_names;
extern char *input_name;
@@ -60,6 +61,7 @@ extern int line_number;
extern int char_number;
extern FILE* header;
+extern FILE* idfile;
extern void write_proxies(ifref_t *ifaces);
extern void write_client(ifref_t *ifaces);
More information about the wine-cvs
mailing list