get_deref_type yields the type of array elements for arrays or the pointed-to type of pointers. Most important, it works on anything is_declptr returns true for. --- tools/widl/header.h | 1 + tools/widl/typegen.c | 15 +++++++++++---- tools/widl/write_msft.c | 3 +-- 3 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/tools/widl/header.h b/tools/widl/header.h index 6ac7cb0..89583e1 100644 --- a/tools/widl/header.h +++ b/tools/widl/header.h @@ -31,6 +31,7 @@ extern unsigned long get_attrv(const attr_list_t *list, enum attr_type t); extern int is_void(const type_t *t); extern int is_conformant_array(const type_t *t); extern int is_declptr(const type_t *t); +extern type_t * get_deref_type(const type_t * t); extern const char* get_name(const var_t *v); extern void write_type_left(FILE *h, type_t *t, int declonly); extern void write_type_right(FILE *h, type_t *t, int is_field); diff --git a/tools/widl/typegen.c b/tools/widl/typegen.c index 7dfa0b2..9256bba 100644 --- a/tools/widl/typegen.c +++ b/tools/widl/typegen.c @@ -1784,6 +1784,16 @@ int is_declptr(const type_t *t) return is_ptr(t) || (is_conformant_array(t) && !t->declarray); }
+type_t * get_deref_type(const type_t * t) +{ + if (is_ptr(t)) + return type_pointer_get_ref(t); + else if (is_array(t)) + return type_array_get_element(t); + else + return NULL; +} + static size_t write_string_tfs(FILE *file, const attr_list_t *attrs, type_t *type, const char *name, unsigned int *typestring_offset) @@ -1812,10 +1822,7 @@ static size_t write_string_tfs(FILE *file, const attr_list_t *attrs, start_offset = *typestring_offset; update_tfsoff(type, start_offset, file);
- if (is_array(type)) - rtype = type_array_get_element(type)->type; - else - rtype = type_pointer_get_ref(type)->type; + rtype = get_deref_type(type)->type;
if ((rtype != RPC_FC_BYTE) && (rtype != RPC_FC_CHAR) && (rtype != RPC_FC_WCHAR)) { diff --git a/tools/widl/write_msft.c b/tools/widl/write_msft.c index 04195ff..a4eba3c 100644 --- a/tools/widl/write_msft.c +++ b/tools/widl/write_msft.c @@ -1116,8 +1116,7 @@ static int encode_var(
vt = get_type_vt(type); if (vt == VT_PTR) { - type_t *ref = is_ptr(type) ? - type_pointer_get_ref(type) : type_array_get_element(type); + type_t *ref = get_deref_type(type); int skip_ptr = encode_var(typelib, ref, var, &target_type, NULL, NULL, &child_size);