Module: wine Branch: refs/heads/master Commit: 88fd90b4c591159ba0bf8cf4dfd3c3c39232d4dd URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=88fd90b4c591159ba0bf8cf4...
Author: Robert Shearman rob@codeweavers.com Date: Mon Dec 26 13:05:29 2005 +0100
widl: Add helper functions that return the size of procformat and typeformat strings for variables.
---
tools/widl/client.c | 5 +++-- tools/widl/server.c | 5 +++-- tools/widl/typegen.c | 29 +++++++++++++++++++++++++---- tools/widl/typegen.h | 2 ++ 4 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/tools/widl/client.c b/tools/widl/client.c index 3fd5f5c..2d33496 100644 --- a/tools/widl/client.c +++ b/tools/widl/client.c @@ -270,11 +270,12 @@ static void write_function_stubs(type_t while (NEXT_LINK(var)) var = NEXT_LINK(var); while (var) { - proc_offset += 2; /* FIXME */ + proc_offset += get_size_procformatstring_var(var); var = PREV_LINK(var); } } - proc_offset += 2; /* FIXME */ + if (!is_void(def->type, NULL)) + proc_offset += get_size_procformatstring_var(def);
indent--; print_client("}\n"); diff --git a/tools/widl/server.c b/tools/widl/server.c index 6022f5a..b007a8f 100644 --- a/tools/widl/server.c +++ b/tools/widl/server.c @@ -299,11 +299,12 @@ static void write_function_stubs(type_t while (NEXT_LINK(var)) var = NEXT_LINK(var); while (var) { - proc_offset += 2; /* FIXME */ + proc_offset += get_size_procformatstring_var(var); var = PREV_LINK(var); } } - proc_offset += 2; /* FIXME */ + if (!is_void(def->type, NULL)) + proc_offset += get_size_procformatstring_var(def);
func = PREV_LINK(func); } diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index cb6e87b..1039eea 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -46,6 +46,8 @@ static int print_file(FILE *file, int in va_list va; int i, r;
+ if (!file) return 0; + va_start(va, format); for (i = 0; i < indent; i++) fprintf(file, " "); @@ -54,13 +56,15 @@ static int print_file(FILE *file, int in return r; }
-static void write_procformatstring_var(FILE *file, int indent, var_t *var) +static size_t write_procformatstring_var(FILE *file, int indent, var_t *var) { + size_t size; switch(var->type->type) { #define CASE_BASETYPE(fctype) \ case RPC_##fctype: \ print_file(file, indent, "0x%02x, /* " #fctype " */\n", var->type->type); \ + size = 2; /* includes param type prefix */ \ break
CASE_BASETYPE(FC_BYTE); @@ -80,7 +84,9 @@ static void write_procformatstring_var(F #undef CASE_BASETYPE default: error("Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type); + size = 0; } + return size; }
void write_procformatstring(FILE *file, type_t *iface) @@ -137,13 +143,13 @@ void write_procformatstring(FILE *file, }
-static void write_typeformatstring_var(FILE *file, int indent, var_t *var) +static size_t write_typeformatstring_var(FILE *file, int indent, var_t *var) { int ptr_level = var->ptr_level;
/* basic types don't need a type format string */ if (ptr_level == 0) - return; + return 0;
if (ptr_level == 1) { @@ -154,7 +160,7 @@ static void write_typeformatstring_var(F print_file(file, indent, "0x11, 0x08, /* FC_RP [simple_pointer] */\n"); \ print_file(file, indent, "0x%02x, /* " #fctype " */\n", var->type->type); \ print_file(file, indent, "0x5c, /* FC_PAD */\n"); \ - break + return 4 CASE_BASETYPE(FC_BYTE); CASE_BASETYPE(FC_CHAR); CASE_BASETYPE(FC_SMALL); @@ -175,8 +181,11 @@ static void write_typeformatstring_var(F error("write_typeformatstring_var: Unknown/unsupported type: %s (0x%02x)\n", var->name, var->type->type); } } + error("write_typeformatstring_var: Pointer level %d not supported for variable %s\n", ptr_level, var->name); + return 0; }
+ void write_typeformatstring(FILE *file, type_t *iface) { int indent = 0; @@ -389,3 +398,15 @@ void unmarshall_arguments(FILE *file, in var = PREV_LINK(var); } } + + +size_t get_size_procformatstring_var(var_t *var) +{ + return write_procformatstring_var(NULL, 0, var); +} + + +size_t get_size_typeformatstring_var(var_t *var) +{ + return write_typeformatstring_var(NULL, 0, var); +} diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h index 6670197..fe8dc38 100644 --- a/tools/widl/typegen.h +++ b/tools/widl/typegen.h @@ -25,3 +25,5 @@ void write_typeformatstring(FILE *file, unsigned int get_required_buffer_size(type_t *type); void marshall_arguments(FILE *file, int indent, func_t *func); void unmarshall_arguments(FILE *file, int indent, func_t *func); +size_t get_size_procformatstring_var(var_t *var); +size_t get_size_typeformatstring_var(var_t *var);