Robert Shearman : widl: Don't use recursion to implement write_procformatstring_type.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 24 06:44:57 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 6d76ad87c661ea2f56567869db73d34a0c5c3cf0
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=6d76ad87c661ea2f56567869db73d34a0c5c3cf0

Author: Robert Shearman <rob at codeweavers.com>
Date:   Tue Jan 24 11:05:51 2006 +0100

widl: Don't use recursion to implement write_procformatstring_type.
Renamed to write_procformatstring_var now since we can pass a var_t in
again. This results in simpler code.

---

 tools/widl/typegen.c |   53 +++++++++++++++++++-------------------------------
 tools/widl/typegen.h |    4 ++--
 2 files changed, 22 insertions(+), 35 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 3688505..905f8ad 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -41,9 +41,6 @@
 #include "widl.h"
 #include "typegen.h"
 
-static size_t get_size_typeformatstring_type(const type_t *type, int ptr_level,
-    const expr_t *array, const char *name);
-
 static int print_file(FILE *file, int indent, const char *format, ...)
 {
     va_list va;
@@ -91,18 +88,22 @@ static inline int is_base_type(unsigned 
     }
 }
 
-static size_t write_procformatstring_type(FILE *file, int indent,
-    const type_t *type, int ptr_level, const expr_t *array, const char *name,
-    int is_in, int is_out, int is_return, unsigned int *type_offset)
+static size_t write_procformatstring_var(FILE *file, int indent,
+    const var_t *var, int is_return, unsigned int *type_offset)
 {
     size_t size;
+    int ptr_level = var->ptr_level;
+    const type_t *type = var->type;
+
+    int is_in = is_attr(var->attrs, ATTR_IN);
+    int is_out = is_attr(var->attrs, ATTR_OUT);
+
+    if (!is_in && !is_out) is_in = TRUE;
 
     if (ptr_level == 0 && type_has_ref(type))
-        return write_procformatstring_type(file, indent, type->ref, ptr_level,
-                                           array, name, is_in, is_out,
-                                           is_return, type_offset);
+        type = type->ref;
 
-    if (ptr_level == 0 && !array && is_base_type(type->type))
+    if (ptr_level == 0 && !var->array && is_base_type(type->type))
     {
         if (is_return)
             print_file(file, indent, "0x53,    /* FC_RETURN_PARAM_BASETYPE */\n");
@@ -133,7 +134,7 @@ static size_t write_procformatstring_typ
         CASE_BASETYPE(FC_ERROR_STATUS_T);
 #undef CASE_BASETYPE
         default:
-            error("Unknown/unsupported type: %s (0x%02x)\n", name, type->type);
+            error("Unknown/unsupported type: %s (0x%02x)\n", var->name, type->type);
             size = 0;
         }
     }
@@ -152,7 +153,7 @@ static size_t write_procformatstring_typ
         print_file(file, indent, "NdrFcShort(0x%x),\n", *type_offset);
         size = 4; /* includes param type prefix */
     }
-    *type_offset += get_size_typeformatstring_type(type, ptr_level, array, name);
+    *type_offset += get_size_typeformatstring_var(var);
     return size;
 }
 
@@ -182,13 +183,8 @@ void write_procformatstring(FILE *file, 
                 while (NEXT_LINK(var)) var = NEXT_LINK(var);
                 while (var)
                 {
-                    int is_in = is_attr(var->attrs, ATTR_IN);
-                    int is_out = is_attr(var->attrs, ATTR_OUT);
-
-                    if (!is_in && !is_out) is_in = TRUE;
-                    write_procformatstring_type(file, indent, var->type,
-                        var->ptr_level, var->array, var->name,
-                        is_in, is_out, FALSE, &type_offset);
+                    write_procformatstring_var(file, indent, var, FALSE,
+                                               &type_offset);
 
                     var = PREV_LINK(var);
                 }
@@ -202,9 +198,8 @@ void write_procformatstring(FILE *file, 
                 print_file(file, indent, "0x5c,    /* FC_PAD */\n");
             }
             else
-                write_procformatstring_type(file, indent, var->type,
-                    var->ptr_level, var->array, var->name, FALSE, FALSE, TRUE,
-                    &type_offset);
+                write_procformatstring_var(file, indent, var, TRUE,
+                                           &type_offset);
         }
     }
 
@@ -736,22 +731,14 @@ void unmarshall_arguments(FILE *file, in
 }
 
 
-static size_t get_size_typeformatstring_type(const type_t *type, int ptr_level,
-    const expr_t *array, const char *name)
-{
-    return write_typeformatstring_type(NULL, 0, type, ptr_level, array, name);
-}
-
-
-size_t get_size_procformatstring_var(var_t *var)
+size_t get_size_procformatstring_var(const var_t *var)
 {
     unsigned int type_offset = 2;
-    return write_procformatstring_type(NULL, 0, var->type,
-        var->ptr_level, var->array, var->name, FALSE, FALSE, FALSE, &type_offset);
+    return write_procformatstring_var(NULL, 0, var, FALSE, &type_offset);
 }
 
 
-size_t get_size_typeformatstring_var(var_t *var)
+size_t get_size_typeformatstring_var(const var_t *var)
 {
     return write_typeformatstring_type(NULL, 0, var->type, var->ptr_level,
         var->array, var->name);
diff --git a/tools/widl/typegen.h b/tools/widl/typegen.h
index 2660400..93a6ce7 100644
--- a/tools/widl/typegen.h
+++ b/tools/widl/typegen.h
@@ -32,5 +32,5 @@ void write_typeformatstring(FILE *file, 
 unsigned int get_required_buffer_size(const var_t *var, unsigned int *alignment);
 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);
+size_t get_size_procformatstring_var(const var_t *var);
+size_t get_size_typeformatstring_var(const var_t *var);




More information about the wine-cvs mailing list