Alexandre Julliard : widl: Move support for stub arguments to typegen.
c to make it usable for proxies too.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Jan 25 06:12:07 CST 2007
Module: wine
Branch: master
Commit: 85ed9ca31a3383d195b4712951f2e61930588b1b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=85ed9ca31a3383d195b4712951f2e61930588b1b
Author: Alexandre Julliard <julliard at winehq.org>
Date: Wed Jan 24 19:59:16 2007 +0100
widl: Move support for stub arguments to typegen.c to make it usable for proxies too.
---
tools/widl/server.c | 105 +-------------------------------------------------
tools/widl/typegen.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++
tools/widl/typegen.h | 2 +
3 files changed, 106 insertions(+), 103 deletions(-)
diff --git a/tools/widl/server.c b/tools/widl/server.c
index c7613d4..3719aae 100644
--- a/tools/widl/server.c
+++ b/tools/widl/server.c
@@ -76,99 +76,6 @@ static void write_parameters_init(const
}
-static void declare_args(const func_t *func)
-{
- int in_attr, out_attr;
- int i = 0;
- const var_t *var;
-
- if (!func->args)
- return;
-
- LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
- {
- const expr_t *size_is = get_attrp(var->attrs, ATTR_SIZEIS);
- int has_size = size_is && (size_is->type != EXPR_VOID);
- int is_string = is_attr(var->attrs, ATTR_STRING);
-
- in_attr = is_attr(var->attrs, ATTR_IN);
- out_attr = is_attr(var->attrs, ATTR_OUT);
- if (!out_attr && !in_attr)
- in_attr = 1;
-
- if (!in_attr && !has_size && !is_string)
- {
- int indirection;
- print_server("");
- write_type(server, var->type, NULL, var->tname);
- for (indirection = 0; indirection < var->ptr_level - 1; indirection++)
- fprintf(server, "*");
- fprintf(server, " _W%u;\n", i++);
- }
-
- print_server("");
- write_type(server, var->type, var, var->tname);
- fprintf(server, " ");
- write_name(server, var);
- write_array(server, var->array, 0);
- fprintf(server, ";\n");
- }
-}
-
-
-static void assign_out_args(const func_t *func)
-{
- int in_attr, out_attr;
- int i = 0, sep = 0;
- const var_t *var;
- const expr_t *size_is;
- int has_size;
-
- if (!func->args)
- return;
-
- LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
- {
- int is_string = is_attr(var->attrs, ATTR_STRING);
- size_is = get_attrp(var->attrs, ATTR_SIZEIS);
- has_size = size_is && (size_is->type != EXPR_VOID);
- in_attr = is_attr(var->attrs, ATTR_IN);
- out_attr = is_attr(var->attrs, ATTR_OUT);
- if (!out_attr && !in_attr)
- in_attr = 1;
-
- if (!in_attr)
- {
- print_server("");
- write_name(server, var);
-
- if (has_size)
- {
- unsigned int size;
- type_t *type = var->type;
-
- fprintf(server, " = NdrAllocate(&_StubMsg, ");
- write_expr(server, size_is, 1);
- size = get_type_memsize(type);
- fprintf(server, " * %u);\n", size);
- }
- else if (!is_string)
- {
- fprintf(server, " = &_W%u;\n", i);
- if (var->ptr_level > 1)
- print_server("_W%u = 0;\n", i);
- i++;
- }
-
- sep = 1;
- }
- }
-
- if (sep)
- fprintf(server, "\n");
-}
-
-
static void write_function_stubs(type_t *iface, unsigned int *proc_offset, unsigned int *type_offset)
{
char *implicit_handle = get_attrp(iface->attrs, ATTR_IMPLICIT_HANDLE);
@@ -215,16 +122,8 @@ static void write_function_stubs(type_t
fprintf(server, "{\n");
indent++;
- /* declare return value '_RetVal' */
- if (!is_void(def->type, NULL))
- {
- print_server("");
- write_type(server, def->type, def, def->tname);
- fprintf(server, " _RetVal;\n");
- }
-
/* Declare arguments */
- declare_args(func);
+ declare_stub_args(server, indent, func);
print_server("MIDL_STUB_MESSAGE _StubMsg;\n");
print_server("RPC_STATUS _Status;\n");
@@ -291,7 +190,7 @@ static void write_function_stubs(type_t
fprintf(server, "\n");
/* Assign 'out' arguments */
- assign_out_args(func);
+ assign_stub_out_args(server, indent, func);
/* Call the real server function */
if (!is_void(def->type, NULL))
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 5bba033..def9d4b 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -2099,6 +2099,108 @@ static void write_struct_expr(FILE *h, c
}
}
+
+void declare_stub_args( FILE *file, int indent, const func_t *func )
+{
+ int in_attr, out_attr;
+ int i = 0;
+ const var_t *def = func->def;
+ const var_t *var;
+
+ /* declare return value '_RetVal' */
+ if (!is_void(def->type, NULL))
+ {
+ print_file(file, indent, "");
+ write_type(file, def->type, def, def->tname);
+ fprintf(file, " _RetVal;\n");
+ }
+
+ if (!func->args)
+ return;
+
+ LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
+ {
+ const expr_t *size_is = get_attrp(var->attrs, ATTR_SIZEIS);
+ int has_size = size_is && (size_is->type != EXPR_VOID);
+ int is_string = is_attr(var->attrs, ATTR_STRING);
+
+ in_attr = is_attr(var->attrs, ATTR_IN);
+ out_attr = is_attr(var->attrs, ATTR_OUT);
+ if (!out_attr && !in_attr)
+ in_attr = 1;
+
+ if (!in_attr && !has_size && !is_string)
+ {
+ int indirection;
+ print_file(file, indent, "");
+ write_type(file, var->type, NULL, var->tname);
+ for (indirection = 0; indirection < var->ptr_level - 1; indirection++)
+ fprintf(file, "*");
+ fprintf(file, " _W%u;\n", i++);
+ }
+
+ print_file(file, indent, "");
+ write_type(file, var->type, var, var->tname);
+ fprintf(file, " ");
+ write_name(file, var);
+ write_array(file, var->array, 0);
+ fprintf(file, ";\n");
+ }
+}
+
+
+void assign_stub_out_args( FILE *file, int indent, const func_t *func )
+{
+ int in_attr, out_attr;
+ int i = 0, sep = 0;
+ const var_t *var;
+ const expr_t *size_is;
+ int has_size;
+
+ if (!func->args)
+ return;
+
+ LIST_FOR_EACH_ENTRY( var, func->args, const var_t, entry )
+ {
+ int is_string = is_attr(var->attrs, ATTR_STRING);
+ size_is = get_attrp(var->attrs, ATTR_SIZEIS);
+ has_size = size_is && (size_is->type != EXPR_VOID);
+ in_attr = is_attr(var->attrs, ATTR_IN);
+ out_attr = is_attr(var->attrs, ATTR_OUT);
+ if (!out_attr && !in_attr)
+ in_attr = 1;
+
+ if (!in_attr)
+ {
+ print_file(file, indent, "");
+ write_name(file, var);
+
+ if (has_size)
+ {
+ unsigned int size;
+ type_t *type = var->type;
+
+ fprintf(file, " = NdrAllocate(&_StubMsg, ");
+ write_expr(file, size_is, 1);
+ size = get_type_memsize(type);
+ fprintf(file, " * %u);\n", size);
+ }
+ else if (!is_string)
+ {
+ fprintf(file, " = &_W%u;\n", i);
+ if (var->ptr_level > 1)
+ print_file(file, indent, "_W%u = 0;\n", i);
+ i++;
+ }
+
+ sep = 1;
+ }
+ }
+ if (sep)
+ fprintf(file, "\n");
+}
+
+
int write_expr_eval_routines(FILE *file, const char *iface)
{
int result = 0;
diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h
index 4e8b63d..63d2626 100644
--- a/tools/widl/typegen.h
+++ b/tools/widl/typegen.h
@@ -46,5 +46,7 @@ size_t get_size_procformatstring_var(con
size_t get_size_typeformatstring_var(const var_t *var);
size_t get_size_procformatstring(const ifref_list_t *ifaces, int for_objects);
size_t get_size_typeformatstring(const ifref_list_t *ifaces, int for_objects);
+void assign_stub_out_args( FILE *file, int indent, const func_t *func );
+void declare_stub_args( FILE *file, int indent, const func_t *func );
int write_expr_eval_routines(FILE *file, const char *iface);
void write_expr_eval_routine_list(FILE *file, const char *iface);
More information about the wine-cvs
mailing list