Jacek Caban : widl: Added support for -ns_prefix option.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 5 10:28:04 CDT 2015


Module: wine
Branch: master
Commit: 21740b5e156e98ae12239a7720113c4d557d7b9a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=21740b5e156e98ae12239a7720113c4d557d7b9a

Author: Jacek Caban <jacek at 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"




More information about the wine-cvs mailing list