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