widl: Improve the current type offset passing.

Change the functions to take the current type offset and return the
start of the type written.
This commit is contained in:
Robert Shearman 2006-01-31 18:07:20 +01:00 committed by Alexandre Julliard
parent ac5a4393d5
commit 06ab21b668
1 changed files with 93 additions and 91 deletions

View File

@ -571,75 +571,71 @@ static size_t type_memsize(const type_t *t, int ptr_level, const expr_t *array)
static size_t write_string_tfs(FILE *file, const attr_t *attrs,
const type_t *type, const expr_t *array,
const char *name, size_t typestring_offset)
const char *name, size_t *typestring_offset)
{
const expr_t *size_is = get_attrp(attrs, ATTR_SIZEIS);
int has_size = size_is && (size_is->type != EXPR_VOID);
size_t start_offset = *typestring_offset;
if ((type->type != RPC_FC_CHAR) && (type->type != RPC_FC_WCHAR))
{
error("write_string_tfs: Unimplemented for type 0x%x of name: %s\n", type->type, name);
return typestring_offset;
return start_offset;
}
if (array && array->is_const)
{
size_t typestring_size;
if (array->cval > USHRT_MAX)
error("array size for parameter %s exceeds %d bytes by %ld bytes\n",
name, USHRT_MAX, array->cval - USHRT_MAX);
if (type->type == RPC_FC_CHAR)
WRITE_FCTYPE(file, FC_CSTRING, typestring_offset);
WRITE_FCTYPE(file, FC_CSTRING, *typestring_offset);
else
WRITE_FCTYPE(file, FC_WSTRING, typestring_offset);
WRITE_FCTYPE(file, FC_WSTRING, *typestring_offset);
print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
typestring_size = 2;
*typestring_offset += 2;
print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", array->cval, array->cval);
typestring_size += 2;
*typestring_offset += 2;
return typestring_size + typestring_offset;
return start_offset;
}
else if (has_size)
{
size_t typestring_size;
if (type->type == RPC_FC_CHAR)
WRITE_FCTYPE(file, FC_C_CSTRING, typestring_offset);
WRITE_FCTYPE(file, FC_C_CSTRING, *typestring_offset);
else
WRITE_FCTYPE(file, FC_C_WSTRING, typestring_offset);
WRITE_FCTYPE(file, FC_C_WSTRING, *typestring_offset);
print_file(file, 2, "0x%x, /* FC_STRING_SIZED */\n", RPC_FC_STRING_SIZED);
typestring_size = 2;
*typestring_offset += 2;
typestring_size += write_conf_or_var_desc(file, current_func, NULL, size_is);
*typestring_offset += write_conf_or_var_desc(file, current_func, NULL, size_is);
return typestring_size + typestring_offset;
return start_offset;
}
else
{
size_t typestring_size;
if (type->type == RPC_FC_CHAR)
WRITE_FCTYPE(file, FC_C_CSTRING, typestring_offset);
WRITE_FCTYPE(file, FC_C_CSTRING, *typestring_offset);
else
WRITE_FCTYPE(file, FC_C_WSTRING, typestring_offset);
WRITE_FCTYPE(file, FC_C_WSTRING, *typestring_offset);
print_file(file, 2, "0x%x, /* FC_PAD */\n", RPC_FC_PAD);
typestring_size = 2;
*typestring_offset += 2;
return typestring_size + typestring_offset;
return start_offset;
}
}
static size_t write_array_tfs(FILE *file, const attr_t *attrs,
const type_t *type, const expr_t *array,
const char *name, size_t typestring_offset)
const char *name, size_t *typestring_offset)
{
const expr_t *length_is = get_attrp(attrs, ATTR_LENGTHIS);
const expr_t *size_is = get_attrp(attrs, ATTR_SIZEIS);
int has_length = length_is && (length_is->type != EXPR_VOID);
int has_size = size_is && (size_is->type != EXPR_VOID) && !array->is_const;
size_t start_offset = *typestring_offset;
/* FIXME: need to analyse type for pointers */
@ -653,131 +649,127 @@ static size_t write_array_tfs(FILE *file, const attr_t *attrs,
if (!has_length && !has_size)
{
/* fixed array */
size_t typestring_size;
size_t size = type_memsize(type, 0, array);
if (size < USHRT_MAX)
{
WRITE_FCTYPE(file, FC_SMFARRAY, typestring_offset);
WRITE_FCTYPE(file, FC_SMFARRAY, *typestring_offset);
/* alignment */
print_file(file, 2, "0x%x, /* 0 */\n", 0);
/* size */
print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", size, size);
typestring_size = 4;
*typestring_offset += 4;
}
else
{
WRITE_FCTYPE(file, FC_LGFARRAY, typestring_offset);
WRITE_FCTYPE(file, FC_LGFARRAY, *typestring_offset);
/* alignment */
print_file(file, 2, "0x%x, /* 0 */\n", 0);
/* size */
print_file(file, 2, "NdrFcLong(0x%x), /* %d */\n", size, size);
typestring_size = 6;
*typestring_offset += 6;
}
/* FIXME: write out pointer descriptor if necessary */
print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
print_file(file, 2, "FC_END,\n");
typestring_size += 2;
*typestring_offset += 2;
return typestring_size + typestring_offset;
return start_offset;
}
else if (has_length && !has_size)
{
/* varying array */
size_t typestring_size;
size_t element_size = type_memsize(type, 0, NULL);
size_t elements = array->cval;
size_t total_size = element_size * elements;
if (total_size < USHRT_MAX)
{
WRITE_FCTYPE(file, FC_SMVARRAY, typestring_offset);
WRITE_FCTYPE(file, FC_SMVARRAY, *typestring_offset);
/* alignment */
print_file(file, 2, "0x%x, /* 0 */\n", 0);
/* total size */
print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", total_size, total_size);
/* number of elements */
print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", elements, elements);
typestring_size = 6;
*typestring_offset += 6;
}
else
{
WRITE_FCTYPE(file, FC_LGVARRAY, typestring_offset);
WRITE_FCTYPE(file, FC_LGVARRAY, *typestring_offset);
/* alignment */
print_file(file, 2, "0x%x, /* 0 */\n", 0);
/* total size */
print_file(file, 2, "NdrFcLong(0x%x), /* %d */\n", total_size, total_size);
/* number of elements */
print_file(file, 2, "NdrFcLong(0x%x), /* %d */\n", elements, elements);
typestring_size = 10;
*typestring_offset += 10;
}
/* element size */
print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", element_size, element_size);
typestring_size += 2;
*typestring_offset += 2;
typestring_size += write_conf_or_var_desc(file, current_func,
current_structure,
length_is);
*typestring_offset += write_conf_or_var_desc(file, current_func,
current_structure,
length_is);
/* FIXME: write out pointer descriptor if necessary */
print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
print_file(file, 2, "FC_END,\n");
typestring_size += 2;
*typestring_offset += 2;
return typestring_size + typestring_offset;
return start_offset;
}
else if (!has_length && has_size)
{
/* conformant array */
size_t typestring_size;
size_t element_size = type_memsize(type, 0, NULL);
WRITE_FCTYPE(file, FC_CARRAY, typestring_offset);
WRITE_FCTYPE(file, FC_CARRAY, *typestring_offset);
/* alignment */
print_file(file, 2, "0x%x, /* 0 */\n", 0);
/* element size */
print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", element_size, element_size);
typestring_size = 4;
*typestring_offset += 4;
typestring_size += write_conf_or_var_desc(file, current_func,
current_structure, size_is);
*typestring_offset += write_conf_or_var_desc(file, current_func,
current_structure, size_is);
/* FIXME: write out pointer descriptor if necessary */
print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
print_file(file, 2, "FC_END,\n");
typestring_size += 2;
*typestring_offset += 2;
return typestring_size + typestring_offset;
return start_offset;
}
else
{
/* conformant varying array */
size_t typestring_size;
size_t element_size = type_memsize(type, 0, NULL);
WRITE_FCTYPE(file, FC_CVARRAY, typestring_offset);
WRITE_FCTYPE(file, FC_CVARRAY, *typestring_offset);
/* alignment */
print_file(file, 2, "0x%x, /* 0 */\n", 0);
/* element size */
print_file(file, 2, "NdrFcShort(0x%x), /* %d */\n", element_size, element_size);
typestring_size = 4;
*typestring_offset += 4;
typestring_size += write_conf_or_var_desc(file, current_func,
current_structure, size_is);
typestring_size += write_conf_or_var_desc(file, current_func,
current_structure,
length_is);
*typestring_offset += write_conf_or_var_desc(file, current_func,
current_structure, size_is);
*typestring_offset += write_conf_or_var_desc(file, current_func,
current_structure,
length_is);
/* FIXME: write out pointer descriptor if necessary */
print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
print_file(file, 2, "FC_END,\n");
typestring_size += 2;
*typestring_offset += 2;
return typestring_size + typestring_offset;
return start_offset;
}
}
}
@ -797,11 +789,11 @@ static const var_t *find_array_or_string_in_struct(const type_t *type)
}
static size_t write_struct_tfs(FILE *file, const type_t *type,
const char *name, size_t typestring_offset)
const char *name, size_t *typestring_offset)
{
size_t total_size;
size_t typestring_size;
const var_t *array;
size_t start_offset;
switch (type->type)
{
@ -812,19 +804,20 @@ static size_t write_struct_tfs(FILE *file, const type_t *type,
error("structure size for parameter %s exceeds %d bytes by %d bytes\n",
name, USHRT_MAX, total_size - USHRT_MAX);
WRITE_FCTYPE(file, FC_STRUCT, typestring_offset);
start_offset = *typestring_offset;
WRITE_FCTYPE(file, FC_STRUCT, *typestring_offset);
/* alignment */
print_file(file, 2, "0x0,\n");
/* total size */
print_file(file, 2, "NdrShort(0x%x), /* %u */\n", total_size, total_size);
typestring_size = 4;
*typestring_offset += 4;
/* member layout */
print_file(file, 2, "0x0, /* FIXME: write out conversion data */\n");
print_file(file, 2, "FC_END,\n");
typestring_size += 2;
return typestring_size + typestring_offset;
*typestring_offset += 2;
return start_offset;
case RPC_FC_CSTRUCT:
total_size = type_memsize(type, 0, NULL);
@ -832,24 +825,27 @@ static size_t write_struct_tfs(FILE *file, const type_t *type,
error("structure size for parameter %s exceeds %d bytes by %d bytes\n",
name, USHRT_MAX, total_size - USHRT_MAX);
WRITE_FCTYPE(file, FC_CSTRUCT, typestring_offset);
start_offset = *typestring_offset;
WRITE_FCTYPE(file, FC_CSTRUCT, *typestring_offset);
/* alignment */
print_file(file, 2, "0x0,\n");
/* total size */
print_file(file, 2, "NdrShort(0x%x), /* %u */\n", total_size, total_size);
*typestring_offset += 4;
/* FIXME: a fixed offset won't work when pointer layout is present */
print_file(file, 2, "NdrShort(0x3), /* 3 */\n");
*typestring_offset += 2;
print_file(file, 2, "FC_END,\n");
typestring_size = 7;
*typestring_offset += 1;
array = find_array_or_string_in_struct(type);
current_structure = type;
typestring_offset = write_array_tfs(file, array->attrs, array->type,
array->array, array->name,
typestring_size + typestring_offset);
write_array_tfs(file, array->attrs, array->type,
array->array, array->name,
typestring_offset);
current_structure = NULL;
return typestring_offset;
return start_offset;
case RPC_FC_CVSTRUCT:
total_size = type_memsize(type, 0, NULL);
@ -857,45 +853,48 @@ static size_t write_struct_tfs(FILE *file, const type_t *type,
error("structure size for parameter %s exceeds %d bytes by %d bytes\n",
name, USHRT_MAX, total_size - USHRT_MAX);
WRITE_FCTYPE(file, FC_CVSTRUCT, typestring_offset);
start_offset = *typestring_offset;
WRITE_FCTYPE(file, FC_CVSTRUCT, *typestring_offset);
/* alignment */
print_file(file, 2, "0x0,\n");
/* total size */
print_file(file, 2, "NdrShort(0x%x), /* %u */\n", total_size, total_size);
*typestring_offset += 4;
/* FIXME: a fixed offset won't work when pointer layout is present */
print_file(file, 2, "NdrShort(0x3), /* 3 */\n");
*typestring_offset += 2;
print_file(file, 2, "FC_END,\n");
typestring_size = 7;
*typestring_offset += 1;
array = find_array_or_string_in_struct(type);
current_structure = type;
if (is_attr(array->attrs, ATTR_STRING))
typestring_offset = write_string_tfs(file, array->attrs, array->type,
array->array, array->name,
typestring_size + typestring_offset);
write_string_tfs(file, array->attrs, array->type,
array->array, array->name,
typestring_offset);
else
typestring_offset = write_array_tfs(file, array->attrs, array->type,
array->array, array->name,
typestring_size + typestring_offset);
current_structure = NULL;
write_array_tfs(file, array->attrs, array->type,
array->array, array->name,
typestring_offset);
current_structure = NULL;
return typestring_offset;
return start_offset;
default:
error("write_struct_tfs: Unimplemented for type 0x%x\n", type->type);
return 0;
return *typestring_offset;
}
}
static size_t write_union_tfs(FILE *file, const attr_t *attrs,
const type_t *type, const char *name,
size_t typeformat_offset)
size_t *typeformat_offset)
{
error("write_union_tfs: Unimplemented\n");
return 0;
return *typeformat_offset;
}
static size_t write_typeformatstring_var(FILE *file, int indent,
const var_t *var, size_t typeformat_offset)
const var_t *var, size_t *typeformat_offset)
{
const type_t *type = var->type;
int ptr_level = var->ptr_level;
@ -922,7 +921,7 @@ static size_t write_typeformatstring_var(FILE *file, int indent,
/* basic types don't need a type format string */
if (is_base_type(type->type))
return typeformat_offset;
return 0;
switch (type->type)
{
@ -946,6 +945,7 @@ static size_t write_typeformatstring_var(FILE *file, int indent,
}
else if (ptr_level == 1 && !type_has_ref(type))
{
size_t start_offset = *typeformat_offset;
pointer_type = get_attrv(var->attrs, ATTR_POINTERTYPE);
if (!pointer_type) pointer_type = RPC_FC_RP;
@ -959,8 +959,8 @@ static size_t write_typeformatstring_var(FILE *file, int indent,
pointer_type == RPC_FC_FP ? "FC_FP" : (pointer_type == RPC_FC_UP ? "FC_UP" : "FC_RP")); \
print_file(file, indent, "0x%02x, /* " #fctype " */\n", RPC_##fctype); \
print_file(file, indent, "0x5c, /* FC_PAD */\n"); \
typeformat_offset += 4; \
return typeformat_offset
*typeformat_offset += 4; \
return start_offset
CASE_BASETYPE(FC_BYTE);
CASE_BASETYPE(FC_CHAR);
CASE_BASETYPE(FC_SMALL);
@ -991,7 +991,7 @@ static size_t write_typeformatstring_var(FILE *file, int indent,
pointer_type,
pointer_type == RPC_FC_FP ? "FC_FP" : (pointer_type == RPC_FC_UP ? "FC_UP" : "FC_RP"));
print_file(file, indent, "NdrShort(0x2), /* 2 */\n");
typeformat_offset += 4;
*typeformat_offset += 4;
ptr_level--;
}
@ -1026,8 +1026,8 @@ void write_typeformatstring(FILE *file, type_t *iface)
while (NEXT_LINK(var)) var = NEXT_LINK(var);
while (var)
{
typeformat_offset = write_typeformatstring_var(file,
indent, var, typeformat_offset);
write_typeformatstring_var(file, indent, var,
&typeformat_offset);
var = PREV_LINK(var);
}
}
@ -1487,7 +1487,9 @@ size_t get_size_procformatstring_var(const var_t *var)
size_t get_size_typeformatstring_var(const var_t *var)
{
return write_typeformatstring_var(NULL, 0, var, 0);
unsigned int type_offset = 0;
write_typeformatstring_var(NULL, 0, var, &type_offset);
return type_offset;
}
static void write_struct_expr(FILE *h, const expr_t *e, int brackets,