Robert Shearman : widl: Pass a state into marshall_arguments and unmarshall_arguments to

Alexandre Julliard julliard at wine.codeweavers.com
Mon Dec 26 11:46:54 CST 2005


Module: wine
Branch: refs/heads/master
Commit: 7e5cf94f13e44b3e287958b3973ce6c587dc7759
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=7e5cf94f13e44b3e287958b3973ce6c587dc7759

Author: Robert Shearman <rob at codeweavers.com>
Date:   Mon Dec 26 13:14:28 2005 +0100

widl: Pass a state into marshall_arguments and unmarshall_arguments to
decide which parameters should be considered based on their direction.

---

 tools/widl/client.c  |    2 +-
 tools/widl/server.c  |    2 +-
 tools/widl/typegen.c |   46 ++++++++++++++++++++++++++++++++++++++++++++--
 tools/widl/typegen.h |   11 +++++++++--
 4 files changed, 55 insertions(+), 6 deletions(-)

diff --git a/tools/widl/client.c b/tools/widl/client.c
index 56b8f91..7bb5658 100644
--- a/tools/widl/client.c
+++ b/tools/widl/client.c
@@ -227,7 +227,7 @@ static void write_function_stubs(type_t 
 
 
         /* marshal arguments */
-        marshall_arguments(client, indent, func, &type_offset);
+        marshall_arguments(client, indent, func, &type_offset, PASS_IN);
 
         /* send/receive message */
         /* print_client("NdrNsSendReceive(\n"); */
diff --git a/tools/widl/server.c b/tools/widl/server.c
index 005d85b..e62acce 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -198,7 +198,7 @@ static void write_function_stubs(type_t 
             indent -= 2;
             fprintf(server, "\n");
 
-            unmarshall_arguments(server, indent, func, &type_offset);
+            unmarshall_arguments(server, indent, func, &type_offset, PASS_OUT);
         }
 
         print_server("if (_StubMsg.Buffer > _StubMsg.BufferEnd)\n");
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 1cf6c2d..5248689 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -281,7 +281,8 @@ unsigned int get_required_buffer_size(ty
     }
 }
 
-void marshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset)
+void marshall_arguments(FILE *file, int indent, func_t *func,
+                        unsigned int *type_offset, enum pass pass)
 {
     unsigned int last_size = 0;
     var_t *var;
@@ -293,6 +294,26 @@ void marshall_arguments(FILE *file, int 
     while (NEXT_LINK(var)) var = NEXT_LINK(var);
     for (; var; *type_offset += get_size_typeformatstring_var(var), var = PREV_LINK(var))
     {
+        int in_attr = is_attr(var->attrs, ATTR_IN);
+        int out_attr = is_attr(var->attrs, ATTR_OUT);
+
+        if (!in_attr && !out_attr)
+            in_attr = 1;
+
+        switch (pass)
+        {
+        case PASS_IN:
+            if (!in_attr)
+                continue;
+            break;
+        case PASS_OUT:
+            if (!out_attr)
+                continue;
+            break;
+        case PASS_RETURN:
+            break;
+        }
+
         if (var->ptr_level == 0 && !var->array)
         {
             unsigned int size;
@@ -413,7 +434,8 @@ void marshall_arguments(FILE *file, int 
     }
 }
 
-void unmarshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset)
+void unmarshall_arguments(FILE *file, int indent, func_t *func,
+                          unsigned int *type_offset, enum pass pass)
 {
     unsigned int last_size = 0;
     var_t *var;
@@ -425,6 +447,26 @@ void unmarshall_arguments(FILE *file, in
     while (NEXT_LINK(var)) var = NEXT_LINK(var);
     for (; var; *type_offset += get_size_typeformatstring_var(var), var = PREV_LINK(var))
     {
+        int in_attr = is_attr(var->attrs, ATTR_IN);
+        int out_attr = is_attr(var->attrs, ATTR_OUT);
+
+        if (!in_attr && !out_attr)
+            in_attr = 1;
+
+        switch (pass)
+        {
+        case PASS_IN:
+            if (!in_attr)
+                continue;
+            break;
+        case PASS_OUT:
+            if (!out_attr)
+                continue;
+            break;
+        case PASS_RETURN:
+            break;
+        }
+
         if (var->ptr_level == 0 && !var->array)
         {
             unsigned int size;
diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h
index c444132..e494383 100644
--- a/tools/widl/typegen.h
+++ b/tools/widl/typegen.h
@@ -20,10 +20,17 @@
  */
 
 
+enum pass
+{
+    PASS_IN,
+    PASS_OUT,
+    PASS_RETURN
+};
+
 void write_procformatstring(FILE *file, type_t *iface);
 void write_typeformatstring(FILE *file, type_t *iface);
 unsigned int get_required_buffer_size(type_t *type);
-void marshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset);
-void unmarshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset);
+void marshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset, enum pass pass);
+void unmarshall_arguments(FILE *file, int indent, func_t *func, unsigned int *type_offset, enum pass pass);
 size_t get_size_procformatstring_var(var_t *var);
 size_t get_size_typeformatstring_var(var_t *var);




More information about the wine-cvs mailing list