Robert Shearman : widl: Add helper functions that return the size of
procformat and
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 26 11:46:27 CST 2005
Module: wine
Branch: refs/heads/master
Commit: 88fd90b4c591159ba0bf8cf4dfd3c3c39232d4dd
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=88fd90b4c591159ba0bf8cf4dfd3c3c39232d4dd
Author: Robert Shearman <rob at 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);
More information about the wine-cvs
mailing list