Robert Shearman : widl: Generate marshaling and unmarshaling
statements for arrays.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Dec 26 11:46:52 CST 2005
Module: wine
Branch: refs/heads/master
Commit: 24d1b71d918cbbe1e9fb0608d852a5c735a720b1
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=24d1b71d918cbbe1e9fb0608d852a5c735a720b1
Author: Robert Shearman <rob at codeweavers.com>
Date: Mon Dec 26 13:13:41 2005 +0100
widl: Generate marshaling and unmarshaling statements for arrays.
---
tools/widl/typegen.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 62 insertions(+), 6 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index c68c4a6..1cf6c2d 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -351,8 +351,8 @@ void marshall_arguments(FILE *file, int
last_size = size;
}
- else if (var->ptr_level == 1 ||
- (var->ptr_level == 0 && var->array && !NEXT_LINK(var->array)))
+ else if ((var->ptr_level == 1 && !var->array) ||
+ (var->ptr_level == 0 && var->array))
{
if (is_attr(var->attrs, ATTR_STRING))
{
@@ -368,6 +368,32 @@ void marshall_arguments(FILE *file, int
error("marshall_arguments: Unsupported [string] type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
}
}
+ else if (var->array)
+ {
+ const expr_t *length_is = get_attrp(var->attrs, ATTR_LENGTHIS);
+ const expr_t *size_is = get_attrp(var->attrs, ATTR_SIZEIS);
+ const char *array_type;
+ int has_length = length_is && (length_is->type != EXPR_VOID);
+ int has_size = size_is && (size_is->type != EXPR_VOID) && !var->array->is_const;
+
+ if (NEXT_LINK(var->array)) /* multi-dimensional array */
+ array_type = "ComplexArray";
+ else
+ {
+ if (!has_length && !has_size)
+ array_type = "FixedArray";
+ else if (has_length && !has_size)
+ array_type = "VaryingArray";
+ else if (!has_length && has_size)
+ array_type = "ConformantArray";
+ else
+ array_type = "ConformantVaryingArray";
+ }
+
+ print_file(file, indent,
+ "Ndr%sMarshall(&_StubMsg, (unsigned char *)%s, &__MIDL_TypeFormatString.Format[%d]);\n",
+ array_type, var->name, *type_offset);
+ }
else
{
switch (var->type->type)
@@ -383,6 +409,7 @@ void marshall_arguments(FILE *file, int
error("marshall_arguments: Pointer level %d not supported for variable %s\n", var->ptr_level, var->name);
last_size = 1;
}
+ fprintf(file, "\n");
}
}
@@ -457,8 +484,8 @@ void unmarshall_arguments(FILE *file, in
last_size = size;
}
- else if (var->ptr_level == 1 ||
- (var->ptr_level == 0 && var->array && !NEXT_LINK(var->array)))
+ else if ((var->ptr_level == 1 && !var->array) ||
+ (var->ptr_level == 0 && var->array))
{
if (is_attr(var->attrs, ATTR_STRING))
{
@@ -471,15 +498,43 @@ void unmarshall_arguments(FILE *file, in
var->name, *type_offset);
break;
default:
- error("unmarshall_arguments: Unsupported [string] type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
+ error("unmarshall_arguments: Unsupported [string] type: %s (0x%02x, ptr_level: %d)\n",
+ var->name, var->type->type, var->ptr_level);
}
}
+ else if (var->array)
+ {
+ const expr_t *length_is = get_attrp(var->attrs, ATTR_LENGTHIS);
+ const expr_t *size_is = get_attrp(var->attrs, ATTR_SIZEIS);
+ const char *array_type;
+ int has_length = length_is && (length_is->type != EXPR_VOID);
+ int has_size = size_is && (size_is->type != EXPR_VOID) && !var->array->is_const;
+
+ if (NEXT_LINK(var->array)) /* multi-dimensional array */
+ array_type = "ComplexArray";
+ else
+ {
+ if (!has_length && !has_size)
+ array_type = "FixedArray";
+ else if (has_length && !has_size)
+ array_type = "VaryingArray";
+ else if (!has_length && has_size)
+ array_type = "ConformantArray";
+ else
+ array_type = "ConformantVaryingArray";
+ }
+
+ print_file(file, indent,
+ "Ndr%sUnmarshall(&_StubMsg, (unsigned char *)%s, &__MIDL_TypeFormatString.Format[%d], 0);\n",
+ array_type, var->name, *type_offset);
+ }
else
{
switch (var->type->type)
{
default:
- error("unmarshall_arguments: Unsupported type: %s (0x%02x, ptr_level: 1)\n", var->name, var->type->type);
+ error("unmarshall_arguments: Unsupported type: %s (0x%02x, ptr_level: %d)\n",
+ var->name, var->type->type, var->ptr_level);
}
}
last_size = 1;
@@ -489,6 +544,7 @@ void unmarshall_arguments(FILE *file, in
error("unmarshall_arguments: Pointer level %d not supported for variable %s\n", var->ptr_level, var->name);
last_size = 1;
}
+ fprintf(file, "\n");
}
}
More information about the wine-cvs
mailing list