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