widl: Generate static sizing information for fixed size structs.

Don't generate FC_*_BASETYPE proc and type format strings for
non-basetype fields/params.
This commit is contained in:
Robert Shearman 2006-01-06 21:06:24 +01:00 committed by Alexandre Julliard
parent bb56d907e5
commit ba0f0761f0
1 changed files with 43 additions and 2 deletions

View File

@ -64,6 +64,33 @@ static inline int type_has_ref(const type_t *type)
return (type->type == 0 && type->ref); return (type->type == 0 && type->ref);
} }
static inline int is_base_type(unsigned char type)
{
switch (type)
{
case RPC_FC_BYTE:
case RPC_FC_CHAR:
case RPC_FC_USMALL:
case RPC_FC_SMALL:
case RPC_FC_WCHAR:
case RPC_FC_USHORT:
case RPC_FC_SHORT:
case RPC_FC_ULONG:
case RPC_FC_LONG:
case RPC_FC_HYPER:
case RPC_FC_IGNORE:
case RPC_FC_FLOAT:
case RPC_FC_DOUBLE:
case RPC_FC_ENUM16:
case RPC_FC_ENUM32:
case RPC_FC_ERROR_STATUS_T:
return TRUE;
default:
return FALSE;
}
}
static size_t write_procformatstring_type(FILE *file, int indent, static size_t write_procformatstring_type(FILE *file, int indent,
const type_t *type, int ptr_level, const expr_t *array, const char *name, const type_t *type, int ptr_level, const expr_t *array, const char *name,
int is_in, int is_out, int is_return, unsigned int *type_offset) int is_in, int is_out, int is_return, unsigned int *type_offset)
@ -75,7 +102,7 @@ static size_t write_procformatstring_type(FILE *file, int indent,
array, name, is_in, is_out, array, name, is_in, is_out,
is_return, type_offset); is_return, type_offset);
if (ptr_level == 0 && !array) if (ptr_level == 0 && !array && is_base_type(type->type))
{ {
if (is_return) if (is_return)
print_file(file, indent, "0x53, /* FC_RETURN_PARAM_BASETYPE */\n"); print_file(file, indent, "0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
@ -198,7 +225,7 @@ static size_t write_typeformatstring_type(FILE *file, int indent,
type->ref, 0 /* FIXME */, array, name); type->ref, 0 /* FIXME */, array, name);
/* basic types don't need a type format string */ /* basic types don't need a type format string */
if (ptr_level == 0 && !array) if (ptr_level == 0 && !array && is_base_type(type->type))
return 0; return 0;
if ((ptr_level == 1 && !type_has_ref(type)) || if ((ptr_level == 1 && !type_has_ref(type)) ||
@ -311,6 +338,20 @@ static unsigned int get_required_buffer_size_type(
*alignment = 8; *alignment = 8;
return 8; return 8;
case RPC_FC_STRUCT:
{
size_t size = 0;
const var_t *field;
for (field = type->fields; field; field = NEXT_LINK(field))
{
unsigned int alignment;
size += get_required_buffer_size_type(
field->type, field->ptr_level, field->array, field->name,
&alignment);
}
return size;
}
default: default:
error("get_required_buffer_size: Unknown/unsupported type: %s (0x%02x)\n", name, type->type); error("get_required_buffer_size: Unknown/unsupported type: %s (0x%02x)\n", name, type->type);
return 0; return 0;