Fill in the proper offsets in the resource directory instead of
relying on the compiler to do it.
diff --git a/tools/winebuild/res32.c b/tools/winebuild/res32.c
index b56af9d..ca90d71 100644
--- a/tools/winebuild/res32.c
+++ b/tools/winebuild/res32.c
@@ -64,6 +64,7 @@
const struct string_id *name; /* name */
const struct resource *res; /* resource */
int nb_languages; /* number of languages */
+ unsigned int name_offset; /* offset of name in resource dir */
};
/* type level of the resource tree */
@@ -73,6 +74,7 @@
struct res_name *names; /* names array */
unsigned int nb_names; /* total number of names */
unsigned int nb_id_names; /* number of names that have a numeric id */
+ unsigned int name_offset; /* offset of type name in resource dir */
};
/* top level of the resource tree */
@@ -86,6 +88,9 @@
static const unsigned char *file_end; /* end of resource file */
static const char *file_name; /* current resource file name */
+/* size of a resource directory with n entries */
+#define RESDIR_SIZE(n) ((4 + 2 * (n)) * sizeof(int))
+
inline static struct resource *add_resource( DLLSPEC *spec )
{
@@ -316,10 +321,10 @@
void output_resources( FILE *outfile, DLLSPEC *spec )
{
int i, j, k, nb_id_types;
- unsigned int n;
+ unsigned int n, offset, data_offset;
struct res_tree *tree;
- const struct res_type *type;
- const struct res_name *name;
+ struct res_type *type;
+ struct res_name *name;
const struct resource *res;
if (!spec->nb_resources) return;
@@ -360,17 +365,19 @@
/* resource directory definition */
- fprintf( outfile, "#define OFFSETOF(field) ((char*)&((struct res_struct *)0)->field - (char*)((struct res_struct *) 0))\n" );
fprintf( outfile, "static struct res_struct{\n" );
fprintf( outfile, " struct res_dir type_dir;\n" );
fprintf( outfile, " struct res_dir_entry type_entries[%d];\n", tree->nb_types );
+ offset = RESDIR_SIZE( tree->nb_types );
for (i = 0, type = tree->types; i < tree->nb_types; i++, type++)
{
+ offset += RESDIR_SIZE( type->nb_names );
fprintf( outfile, " struct res_dir name_%d_dir;\n", i );
fprintf( outfile, " struct res_dir_entry name_%d_entries[%d];\n", i, type->nb_names );
for (n = 0, name = type->names; n < type->nb_names; n++, name++)
{
+ offset += RESDIR_SIZE( name->nb_languages );
fprintf( outfile, " struct res_dir lang_%d_%d_dir;\n", i, n );
fprintf( outfile, " struct res_dir_entry lang_%d_%d_entries[%d];\n",
i, n, name->nb_languages );
@@ -378,20 +385,33 @@
}
fprintf( outfile, " struct res_data_entry data_entries[%d];\n", spec->nb_resources );
+ offset += spec->nb_resources * 4 * sizeof(int);
for (i = nb_id_types = 0, type = tree->types; i < tree->nb_types; i++, type++)
{
if (type->type->str)
+ {
+ type->name_offset = offset | 0x80000000;
+ offset += (strlenW(type->type->str)+1) * sizeof(unsigned short);
fprintf( outfile, " unsigned short type_%d_name[%d];\n",
i, strlenW(type->type->str)+1 );
+ }
else
+ {
+ type->name_offset = type->type->id;
nb_id_types++;
+ }
for (n = 0, name = type->names; n < type->nb_names; n++, name++)
{
if (name->name->str)
+ {
+ name->name_offset = offset | 0x80000000;
+ offset += (strlenW(name->name->str)+1) * sizeof(unsigned short);
fprintf( outfile, " unsigned short name_%d_%d_name[%d];\n",
i, n, strlenW(name->name->str)+1 );
+ }
+ else name->name_offset = name->name->id;
}
}
@@ -401,31 +421,30 @@
fprintf( outfile, " { 0, 0, 0, 0, %d, %d },\n", tree->nb_types - nb_id_types, nb_id_types );
/* dump the type directory */
+ offset = RESDIR_SIZE( tree->nb_types );
fprintf( outfile, " {\n" );
for (i = 0, type = tree->types; i < tree->nb_types; i++, type++)
{
- if (!type->type->str)
- fprintf( outfile, " { 0x%04x, OFFSETOF(name_%d_dir) | 0x80000000 },\n",
- type->type->id, i );
- else
- fprintf( outfile, " { OFFSETOF(type_%d_name) | 0x80000000, OFFSETOF(name_%d_dir) | 0x80000000 },\n",
- i, i );
+ fprintf( outfile, " { 0x%08x, 0x%08x },\n", type->name_offset, offset | 0x80000000 );
+ offset += RESDIR_SIZE( type->nb_names );
+ for (n = 0, name = type->names; n < type->nb_names; n++, name++)
+ offset += RESDIR_SIZE( name->nb_languages );
}
fprintf( outfile, " },\n" );
+ data_offset = offset;
+ offset = RESDIR_SIZE( tree->nb_types );
+
/* dump the names and languages directories */
for (i = 0, type = tree->types; i < tree->nb_types; i++, type++)
{
fprintf( outfile, " { 0, 0, 0, 0, %d, %d }, /* name_%d_dir */\n {\n",
type->nb_names - type->nb_id_names, type->nb_id_names, i );
+ offset += RESDIR_SIZE( type->nb_names );
for (n = 0, name = type->names; n < type->nb_names; n++, name++)
{
- if (!name->name->str)
- fprintf( outfile, " { 0x%04x, OFFSETOF(lang_%d_%d_dir) | 0x80000000 },\n",
- name->name->id, i, n );
- else
- fprintf( outfile, " { OFFSETOF(name_%d_%d_name) | 0x80000000, OFFSETOF(lang_%d_%d_dir) | 0x80000000 },\n",
- i, n, i, n );
+ fprintf( outfile, " { 0x%08x, 0x%08x },\n", name->name_offset, offset | 0x80000000 );
+ offset += RESDIR_SIZE( name->nb_languages );
}
fprintf( outfile, " },\n" );
@@ -435,8 +454,8 @@
name->nb_languages, i, n );
for (k = 0, res = name->res; k < name->nb_languages; k++, res++)
{
- fprintf( outfile, " { 0x%04x, OFFSETOF(data_entries[%d]) },\n",
- res->lang, res - spec->resources );
+ fprintf( outfile, " { 0x%04x, 0x%08x },\n",
+ res->lang, data_offset + (res - spec->resources) * 4 * sizeof(int) );
}
fprintf( outfile, " },\n" );
}
@@ -446,7 +465,8 @@
fprintf( outfile, " {\n" );
for (i = 0, res = spec->resources; i < spec->nb_resources; i++, res++)
{
- fprintf( outfile, " { res_%d, sizeof(res_%d), 0, 0 },\n", i, i );
+ fprintf( outfile, " { res_%d, sizeof(res_%d), 0, 0 }, /* %08x */\n", i, i,
+ data_offset + i * 4 * sizeof(int) );
}
/* dump the name strings */
@@ -466,6 +486,6 @@
}
}
}
- fprintf( outfile, " }\n};\n#undef OFFSETOF\n\n" );
+ fprintf( outfile, " }\n};\n\n" );
free_resource_tree( tree );
}