widl: Generate static sizing information for fixed size structs.
Don't generate FC_*_BASETYPE proc and type format strings for
non-basetype fields/params.
diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c
index 33eecbc..3688505 100644
--- a/tools/widl/typegen.c
+++ b/tools/widl/typegen.c
@@ -64,6 +64,33 @@
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,
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)
@@ -75,7 +102,7 @@
array, name, is_in, is_out,
is_return, type_offset);
- if (ptr_level == 0 && !array)
+ if (ptr_level == 0 && !array && is_base_type(type->type))
{
if (is_return)
print_file(file, indent, "0x53, /* FC_RETURN_PARAM_BASETYPE */\n");
@@ -198,7 +225,7 @@
type->ref, 0 /* FIXME */, array, name);
/* 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;
if ((ptr_level == 1 && !type_has_ref(type)) ||
@@ -311,6 +338,20 @@
*alignment = 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:
error("get_required_buffer_size: Unknown/unsupported type: %s (0x%02x)\n", name, type->type);
return 0;