From: Dmitry Timoshkov dmitry@baikal.ru
Signed-off-by: Dmitry Timoshkov dmitry@baikal.ru --- tools/widl/write_sltg.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-)
diff --git a/tools/widl/write_sltg.c b/tools/widl/write_sltg.c index eb22e93aa76..56ee5842f1f 100644 --- a/tools/widl/write_sltg.c +++ b/tools/widl/write_sltg.c @@ -188,39 +188,44 @@ static void init_index(struct sltg_data *index) add_index(index, compobj); }
-static int add_name(struct sltg_data *name_table, const char *name) +static int add_name(struct sltg_typelib *sltg, const char *name) { - int name_offset = name_table->size; - int new_size = name_table->size + strlen(name) + 1 + 8; + int name_offset = sltg->name_table.size; + int new_size = sltg->name_table.size + strlen(name) + 1 + 8; + int aligned_size;
chat("add_name: %s\n", name);
- new_size = (new_size + 1) & ~1; /* align */ + aligned_size = (new_size + 0x1f) & ~0x1f; + if (aligned_size - new_size < 4) + new_size = aligned_size; + else + new_size = (new_size + 1) & ~1;
- if (new_size > name_table->allocated) + if (new_size > sltg->name_table.allocated) { - name_table->allocated = name_table->allocated ? max(name_table->allocated * 2, new_size) : new_size; - name_table->data = xrealloc(name_table->data, name_table->allocated); + sltg->name_table.allocated = sltg->name_table.allocated ? max(sltg->name_table.allocated * 2, new_size) : new_size; + sltg->name_table.data = xrealloc(sltg->name_table.data, sltg->name_table.allocated); }
- memset(name_table->data + name_table->size, 0xff, 8); - strcpy(name_table->data + name_table->size + 8, name); - name_table->size = new_size; - name_table->data[name_table->size - 1] = 0; /* clear alignment */ + memset(sltg->name_table.data + sltg->name_table.size, 0xff, 8); + strcpy(sltg->name_table.data + sltg->name_table.size + 8, name); + sltg->name_table.size = new_size; + sltg->name_table.data[sltg->name_table.size - 1] = 0; /* clear alignment */
return name_offset; }
-static void init_name_table(struct sltg_data *name_table) +static void init_name_table(struct sltg_typelib *sltg) { - init_sltg_data(name_table); + init_sltg_data(&sltg->name_table); }
static void init_library(struct sltg_typelib *sltg) { const attr_t *attr;
- sltg->library.name = add_name(&sltg->name_table, sltg->typelib->name); + sltg->library.name = add_name(sltg, sltg->typelib->name); sltg->library.helpstring = NULL; sltg->library.helpcontext = 0; sltg->library.syskind = SYS_WIN32; @@ -420,7 +425,7 @@ static const char *add_typeinfo_block(struct sltg_typelib *typelib, const type_t strcpy((char *)p, other_name); p = (short *)((char *)p + strlen(other_name)); *p++ = -1; /* res1a */ - *p++ = add_name(&typelib->name_table, type->name); /* name offset */ + *p++ = add_name(typelib, type->name); /* name offset */ *p++ = 0; /* FIXME: helpstring */ *p++ = -1; /* res20 */ *(int *)p = helpcontext; @@ -697,7 +702,7 @@ static void add_structure_typeinfo(struct sltg_typelib *typelib, type_t *type) next += sizeof(variable);
variable.magic = 0x2a; /* always write flags to simplify calculations */ - variable.name = add_name(&typelib->name_table, var->name); + variable.name = add_name(typelib, var->name); variable.byte_offs = 0; if (var_data[i].size > sizeof(short)) { @@ -1038,7 +1043,7 @@ int create_sltg_typelib(typelib_t *typelib) sltg.first_block = 1;
init_index(&sltg.index); - init_name_table(&sltg.name_table); + init_name_table(&sltg); init_library(&sltg);
add_library_block(&sltg);