Robert Shearman : widl: Don't use recursion for write_typeformatstring_type.

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


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

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

widl: Don't use recursion for write_typeformatstring_type.
Since a var_t can now be passed in, rename to
write_typeformatstring_var. Simplifies the code.

---

 tools/widl/typegen.c |   89 +++++++++++++++++++++++++++-----------------------
 1 files changed, 48 insertions(+), 41 deletions(-)

diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 905f8ad..65aadf5 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -212,50 +212,59 @@ void write_procformatstring(FILE *file, 
 }
 
 
-static size_t write_typeformatstring_type(FILE *file, int indent,
-    const type_t *type, int ptr_level, const expr_t *array, const char *name)
+static size_t write_typeformatstring_var(FILE *file, int indent,
+    const var_t *var)
 {
-    if (ptr_level == 0 && type_has_ref(type))
-        return write_typeformatstring_type(file, indent,
-            type->ref, 0 /* FIXME */, array, name);
-
-    /* basic types don't need a type format string */
-    if (ptr_level == 0 && !array && is_base_type(type->type))
-        return 0;
+    const type_t *type = var->type;
+    int ptr_level = var->ptr_level;
 
-    if ((ptr_level == 1 && !type_has_ref(type)) ||
-        (ptr_level == 0 && array && !NEXT_LINK(array)))
+    while (TRUE)
     {
-        switch (type->type)
+        if (ptr_level == 0 && type_has_ref(type))
         {
+            type = type->ref;
+            continue;
+        }
+
+        /* basic types don't need a type format string */
+        if (ptr_level == 0 && !var->array && is_base_type(type->type))
+            return 0;
+
+        if ((ptr_level == 1 && !type_has_ref(type)) ||
+            (ptr_level == 0 && var->array && !NEXT_LINK(var->array)))
+        {
+            switch (type->type)
+            {
 #define CASE_BASETYPE(fctype) \
-        case RPC_##fctype: \
-            print_file(file, indent, "0x11, 0x08,    /* FC_RP [simple_pointer] */\n"); \
-            print_file(file, indent, "0x%02x,    /* " #fctype " */\n", RPC_##fctype); \
-            print_file(file, indent, "0x5c,          /* FC_PAD */\n"); \
-            return 4
-        CASE_BASETYPE(FC_BYTE);
-        CASE_BASETYPE(FC_CHAR);
-        CASE_BASETYPE(FC_SMALL);
-        CASE_BASETYPE(FC_USMALL);
-        CASE_BASETYPE(FC_WCHAR);
-        CASE_BASETYPE(FC_SHORT);
-        CASE_BASETYPE(FC_USHORT);
-        CASE_BASETYPE(FC_LONG);
-        CASE_BASETYPE(FC_ULONG);
-        CASE_BASETYPE(FC_FLOAT);
-        CASE_BASETYPE(FC_HYPER);
-        CASE_BASETYPE(FC_DOUBLE);
-        CASE_BASETYPE(FC_ENUM16);
-        CASE_BASETYPE(FC_ENUM32);
-        CASE_BASETYPE(FC_IGNORE);
-        CASE_BASETYPE(FC_ERROR_STATUS_T);
-        default:
-            error("write_typeformatstring_var: Unknown/unsupported type: %s (0x%02x)\n", name, type->type);
+            case RPC_##fctype: \
+                print_file(file, indent, "0x11, 0x08,    /* FC_RP [simple_pointer] */\n"); \
+                print_file(file, indent, "0x%02x,    /* " #fctype " */\n", RPC_##fctype); \
+                print_file(file, indent, "0x5c,          /* FC_PAD */\n"); \
+                return 4
+            CASE_BASETYPE(FC_BYTE);
+            CASE_BASETYPE(FC_CHAR);
+            CASE_BASETYPE(FC_SMALL);
+            CASE_BASETYPE(FC_USMALL);
+            CASE_BASETYPE(FC_WCHAR);
+            CASE_BASETYPE(FC_SHORT);
+            CASE_BASETYPE(FC_USHORT);
+            CASE_BASETYPE(FC_LONG);
+            CASE_BASETYPE(FC_ULONG);
+            CASE_BASETYPE(FC_FLOAT);
+            CASE_BASETYPE(FC_HYPER);
+            CASE_BASETYPE(FC_DOUBLE);
+            CASE_BASETYPE(FC_ENUM16);
+            CASE_BASETYPE(FC_ENUM32);
+            CASE_BASETYPE(FC_IGNORE);
+            CASE_BASETYPE(FC_ERROR_STATUS_T);
+            default:
+                error("write_typeformatstring_var: Unknown/unsupported type: %s (0x%02x)\n", var->name, type->type);
+                return 0;
+            }
         }
+        error("write_typeformatstring_var: Pointer level %d not supported for variable %s\n", ptr_level, var->name);
+        return 0;
     }
-    error("write_typeformatstring_var: Pointer level %d not supported for variable %s\n", ptr_level, name);
-    return 0;
 }
 
 
@@ -284,8 +293,7 @@ void write_typeformatstring(FILE *file, 
                 while (NEXT_LINK(var)) var = NEXT_LINK(var);
                 while (var)
                 {
-                    write_typeformatstring_type(file, indent, var->type,
-                        var->ptr_level, var->array, var->name);
+                    write_typeformatstring_var(file, indent, var);
                     var = PREV_LINK(var);
                 }
             }
@@ -740,6 +748,5 @@ size_t get_size_procformatstring_var(con
 
 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);
+    return write_typeformatstring_var(NULL, 0, var);
 }




More information about the wine-cvs mailing list