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