Module: wine Branch: master Commit: 21740b5e156e98ae12239a7720113c4d557d7b9a URL: http://source.winehq.org/git/wine.git/?a=commit;h=21740b5e156e98ae12239a7720...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Aug 5 12:52:15 2015 +0200
widl: Added support for -ns_prefix option.
---
include/windows.foundation.idl | 2 +- tools/widl/header.c | 10 ++++++++-- tools/widl/parser.l | 7 +++++++ tools/widl/typetree.c | 12 ++++++++++-- tools/widl/widl.c | 7 +++++++ tools/widl/widl.h | 1 + tools/widl/widl.man.in | 2 ++ 7 files changed, 36 insertions(+), 5 deletions(-)
diff --git a/include/windows.foundation.idl b/include/windows.foundation.idl index f926202..6d66070 100644 --- a/include/windows.foundation.idl +++ b/include/windows.foundation.idl @@ -17,7 +17,7 @@ */
#ifdef __WIDL__ -#pragma winrt +#pragma winrt ns_prefix #endif
import "inspectable.idl"; diff --git a/tools/widl/header.c b/tools/widl/header.c index 76f7ed0..866e3c1 100644 --- a/tools/widl/header.c +++ b/tools/widl/header.c @@ -155,8 +155,11 @@ static const char *uuid_string(const UUID *uuid)
static void write_namespace_start(FILE *header, struct namespace *namespace) { - if(is_global_namespace(namespace)) + if(is_global_namespace(namespace)) { + if(use_abi_namespace) + write_line(header, 1, "namespace ABI {"); return; + }
write_namespace_start(header, namespace->parent); write_line(header, 1, "namespace %s {", namespace->name); @@ -164,8 +167,11 @@ static void write_namespace_start(FILE *header, struct namespace *namespace)
static void write_namespace_end(FILE *header, struct namespace *namespace) { - if(is_global_namespace(namespace)) + if(is_global_namespace(namespace)) { + if(use_abi_namespace) + write_line(header, -1, "}", namespace->name); return; + }
write_line(header, -1, "}", namespace->name); write_namespace_end(header, namespace->parent); diff --git a/tools/widl/parser.l b/tools/widl/parser.l index c95277c..5c2dcab 100644 --- a/tools/widl/parser.l +++ b/tools/widl/parser.l @@ -152,7 +152,14 @@ UUID *parse_uuid(const char *u) if(!winrt_mode) error_loc("winrt IDL file imported in non-winrt mode\n"); }else { + const char *ptr = yytext+5; + winrt_mode = TRUE; + + while(isspace(*ptr)) + ptr++; + if(!strncmp(ptr, "ns_prefix", 9) && (!*(ptr += 9) || isspace(*ptr))) + use_abi_namespace = TRUE; } yy_pop_state(); } diff --git a/tools/widl/typetree.c b/tools/widl/typetree.c index d27a92a..15b7c73 100644 --- a/tools/widl/typetree.c +++ b/tools/widl/typetree.c @@ -80,8 +80,13 @@ static const var_t *find_arg(const var_list_t *args, const char *name)
static char *append_namespace(char *ptr, struct namespace *namespace, const char *separator) { - if(is_global_namespace(namespace)) - return ptr; + if(is_global_namespace(namespace)) { + if(!use_abi_namespace) + return ptr; + strcpy(ptr, "ABI"); + strcat(ptr, separator); + return ptr + strlen(ptr); + }
ptr = append_namespace(ptr, namespace->parent, separator); strcpy(ptr, namespace->name); @@ -96,6 +101,9 @@ char *format_namespace(struct namespace *namespace, const char *prefix, const ch struct namespace *iter; char *ret, *ptr;
+ if(use_abi_namespace && !is_global_namespace(namespace)) + len += 3 /* strlen("ABI") */ + sep_len; + for(iter = namespace; !is_global_namespace(iter); iter = iter->parent) len += strlen(iter->name) + sep_len;
diff --git a/tools/widl/widl.c b/tools/widl/widl.c index 788c45e..a38f917 100644 --- a/tools/widl/widl.c +++ b/tools/widl/widl.c @@ -73,6 +73,7 @@ static const char usage[] = " --prefix-server=p Prefix names of server functions with 'p'\n" " -r Generate registration script\n" " --winrt Enable Windows Runtime mode\n" +" --ns_prefix Prefix namespaces with ABI namespace\n" " -s Generate server stub\n" " -t Generate typelib\n" " -u Generate interface identifiers file\n" @@ -115,6 +116,7 @@ int do_win64 = 1; int win32_packing = 8; int win64_packing = 8; int winrt_mode = 0; +int use_abi_namespace = 0; static enum stub_mode stub_mode = MODE_Os;
char *input_name; @@ -155,6 +157,7 @@ enum { PREFIX_CLIENT_OPTION, PREFIX_SERVER_OPTION, PRINT_HELP, + RT_NS_PREFIX, RT_OPTION, WIN32_OPTION, WIN64_OPTION, @@ -170,6 +173,7 @@ static const struct option long_options[] = { { "dlldata-only", 0, NULL, DLLDATA_ONLY_OPTION }, { "help", 0, NULL, PRINT_HELP }, { "local-stubs", 1, NULL, LOCAL_STUBS_OPTION }, + { "ns_prefix", 0, NULL, RT_NS_PREFIX }, { "oldnames", 0, NULL, OLDNAMES_OPTION }, { "output", 0, NULL, 'o' }, { "prefix-all", 1, NULL, PREFIX_ALL_OPTION }, @@ -580,6 +584,9 @@ int main(int argc,char *argv[]) case RT_OPTION: winrt_mode = 1; break; + case RT_NS_PREFIX: + use_abi_namespace = 1; + break; case WIN32_OPTION: do_win32 = 1; do_win64 = 0; diff --git a/tools/widl/widl.h b/tools/widl/widl.h index d046f28..09e7871 100644 --- a/tools/widl/widl.h +++ b/tools/widl/widl.h @@ -50,6 +50,7 @@ extern int do_win64; extern int win32_packing; extern int win64_packing; extern int winrt_mode; +extern int use_abi_namespace;
extern char *input_name; extern char *input_idl_name; diff --git a/tools/widl/widl.man.in b/tools/widl/widl.man.in index 179ffba..9259afd 100644 --- a/tools/widl/widl.man.in +++ b/tools/widl/widl.man.in @@ -85,6 +85,8 @@ file). .PP .IP "\fB--winrt\fR" Enable Windows Runtime mode. +.IP "\fB--ns_prefix\fR" +Prefix namespaces with ABI namespace. .PP .B Registration script options: .IP "\fB-r\fR"