Alexandre Julliard : widl:
Add support for arrays of simple types in format strings.
Alexandre Julliard
julliard at wine.codeweavers.com
Tue Feb 6 15:23:07 CST 2007
Module: wine
Branch: master
Commit: 3fa891bfee73dffc7c5975f75f6a19bd8d8e8ddd
URL: http://source.winehq.org/git/wine.git/?a=commit;h=3fa891bfee73dffc7c5975f75f6a19bd8d8e8ddd
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Feb 6 15:55:29 2007 +0100
widl: Add support for arrays of simple types in format strings.
---
tools/widl/typegen.c | 111 +++++++++++++++++++++++++++++---------------------
1 files changed, 64 insertions(+), 47 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 019755b..c1e26ab 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -327,6 +327,37 @@ void write_procformatstring(FILE *file,
print_file(file, indent, "\n");
}
+static int write_base_type(FILE *file, const type_t *type, unsigned int *typestring_offset)
+{
+ switch (type->type)
+ {
+#define CASE_BASETYPE(fctype) \
+ case RPC_##fctype: \
+ print_file(file, 2, "0x%02x, /* " #fctype " */\n", RPC_##fctype); \
+ *typestring_offset += 1; \
+ return 1;
+
+ 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);
+#undef CASE_BASETYPE
+ }
+ return 0;
+}
+
/* write conformance / variance descriptor */
static size_t write_conf_or_var_desc(FILE *file, const func_t *func, const type_t *structure, const expr_t *expr)
{
@@ -888,9 +919,13 @@ static size_t write_array_tfs(FILE *file
*typestring_offset += 1;
}
- print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
+ if (!write_base_type( file, type, typestring_offset ))
+ {
+ print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
+ *typestring_offset += 1;
+ }
print_file(file, 2, "0x%x, /* FC_END */\n", RPC_FC_END);
- *typestring_offset += 2;
+ *typestring_offset += 1;
return start_offset;
}
@@ -943,9 +978,13 @@ static size_t write_array_tfs(FILE *file
*typestring_offset += 1;
}
- print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
+ if (!write_base_type( file, type, typestring_offset ))
+ {
+ print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
+ *typestring_offset += 1;
+ }
print_file(file, 2, "0x%x, /* FC_END */\n", RPC_FC_END);
- *typestring_offset += 2;
+ *typestring_offset += 1;
return start_offset;
}
@@ -977,9 +1016,13 @@ static size_t write_array_tfs(FILE *file
*typestring_offset += 1;
}
- print_file(file, 2, "0x%x, /* FIXME: write out conversion data */\n", type->type);
+ if (!write_base_type( file, type, typestring_offset ))
+ {
+ print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
+ *typestring_offset += 1;
+ }
print_file(file, 2, "0x%x, /* FC_END */\n", RPC_FC_END);
- *typestring_offset += 2;
+ *typestring_offset += 1;
return start_offset;
}
@@ -1014,9 +1057,13 @@ static size_t write_array_tfs(FILE *file
*typestring_offset += 1;
}
- print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
+ if (!write_base_type( file, type, typestring_offset ))
+ {
+ print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
+ *typestring_offset += 1;
+ }
print_file(file, 2, "0x%x, /* FC_END */\n", RPC_FC_END);
- *typestring_offset += 2;
+ *typestring_offset += 1;
return start_offset;
}
@@ -1037,59 +1084,29 @@ static const var_t *find_array_or_string
return find_array_or_string_in_struct(last_field->type);
}
-static size_t write_struct_members(FILE *file, const type_t *type)
+static void write_struct_members(FILE *file, const type_t *type, unsigned int *typestring_offset)
{
- size_t typestring_size = 0;
const var_t *field;
if (type->fields) LIST_FOR_EACH_ENTRY( field, type->fields, const var_t, entry )
{
unsigned char rtype = field->type->type;
- if (is_base_type(rtype))
- {
- switch (rtype)
- {
-#define CASE_BASETYPE(fctype) \
- case RPC_##fctype: \
- print_file(file, 2, "0x%02x,\t\t/* " #fctype " */\n", RPC_##fctype); \
- typestring_size++; \
- break;
- 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:
- break;
-#undef CASE_BASETYPE
- }
- }
- else
+ if (field->array)
+ write_array_tfs( file, field->attrs, field->type, field->array,
+ field->name, typestring_offset );
+ else if (!write_base_type( file, field->type, typestring_offset ))
error("Unsupported member type 0x%x\n", rtype);
}
- if (!(typestring_size % 2))
+ if (!(*typestring_offset % 2))
{
print_file(file, 2, "0x%x,\t\t/* FC_PAD */\n", RPC_FC_PAD);
- typestring_size++;
+ *typestring_offset += 1;
}
print_file(file, 2, "0x%x,\t\t/* FC_END */\n", RPC_FC_END);
- typestring_size++;
-
- return typestring_size;
+ *typestring_offset += 1;
}
static size_t write_struct_tfs(FILE *file, const type_t *type,
@@ -1142,7 +1159,7 @@ static size_t write_struct_tfs(FILE *fil
}
/* member layout */
- *typestring_offset += write_struct_members(file, type);
+ write_struct_members(file, type, typestring_offset);
return start_offset;
case RPC_FC_CSTRUCT:
case RPC_FC_CPSTRUCT:
More information about the wine-cvs
mailing list