Module: wine Branch: master Commit: 3bfa88dc49a5044a7426590667279a35c6ce2dae URL: http://source.winehq.org/git/wine.git/?a=commit;h=3bfa88dc49a5044a7426590667...
Author: Alexandre Julliard julliard@winehq.org Date: Tue Feb 6 15:55:49 2007 +0100
widl: Take array dimensions into account when computing buffer size.
---
tools/widl/typegen.c | 26 ++++++++++++++++---------- 1 files changed, 16 insertions(+), 10 deletions(-)
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index c1e26ab..938764f 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -1543,8 +1543,10 @@ static unsigned int get_required_buffer_ const type_t *type, int ptr_level, const array_dims_t *array, const char *name, unsigned int *alignment) { + size_t size = 0; + *alignment = 0; - if (ptr_level == 0 && !array) + if (ptr_level == 0) { switch (type->type) { @@ -1553,25 +1555,29 @@ static unsigned int get_required_buffer_ case RPC_FC_USMALL: case RPC_FC_SMALL: *alignment = 4; - return 1; + size = 1; + break;
case RPC_FC_WCHAR: case RPC_FC_USHORT: case RPC_FC_SHORT: *alignment = 4; - return 2; + size = 2; + break;
case RPC_FC_ULONG: case RPC_FC_LONG: case RPC_FC_FLOAT: case RPC_FC_ERROR_STATUS_T: *alignment = 4; - return 4; + size = 4; + break;
case RPC_FC_HYPER: case RPC_FC_DOUBLE: *alignment = 8; - return 8; + size = 8; + break;
case RPC_FC_IGNORE: case RPC_FC_BIND_PRIMITIVE: @@ -1579,7 +1585,6 @@ static unsigned int get_required_buffer_
case RPC_FC_STRUCT: { - size_t size = 0; const var_t *field; if (!type->fields) return 0; LIST_FOR_EACH_ENTRY( field, type->fields, const var_t, entry ) @@ -1589,20 +1594,21 @@ static unsigned int get_required_buffer_ field->type, field->ptr_level, field->array, field->name, &alignment); } - return size; + break; }
case RPC_FC_RP: if (is_base_type( type->ref->type ) || type->ref->type == RPC_FC_STRUCT) - return get_required_buffer_size_type( type->ref, 0, NULL, name, alignment ); - return 0; + size = get_required_buffer_size_type( type->ref, 0, NULL, name, alignment ); + break;
default: error("get_required_buffer_size: Unknown/unsupported type: %s (0x%02x)\n", name, type->type); return 0; } + if (array) size *= get_array_size( array ); } - return 0; + return size; }
static unsigned int get_required_buffer_size(const var_t *var, unsigned int *alignment, enum pass pass)