PR binutils/13051

Fix a syntax error bug when compiling rc files with the VERSIONINFO resource
	containing more than one language block inside a single StringFileInfo block.

	* windint.h (rc_ver_stringtable): New structure definition.
	(rc_ver_info): Use it.
	* rcparse.y (verstringtable): New variable.
	(verstringtables): New type.
	(verstringtables:): New rule declaration.
	(verblocks:): Use it.
	* resrc.c (append_ver_stringtable): New function.
	(append_ver_stringfileinfo): Update to use stringtables.
	* windres.h (append_ver_stringfileinfo): Update declaration.
	(append_ver_stringtable): New declaration.
	* resrc.c (write_rc_versioninfo): Update to support multiple blocks.
	* resbin.c (bin_to_res_version): Likewise.
	(res_to_bin_versioninfo): Likewise.

	* binutils-all\windres\version.rsd: Regenerate.
	* binutils-all\windres\version_cat.rsd: Regenerate.
	* binutils-all\windres\version_mlang.rc: Add new test.
	* binutils-all\windres\version_mlang.rsd: Likewise.
This commit is contained in:
Nick Clifton 2011-10-11 15:56:29 +00:00
parent 941b2081b1
commit bfb6c1ab1e
11 changed files with 334 additions and 100 deletions

View file

@ -1,5 +1,5 @@
/* resrc.c -- read and write Windows rc files.
Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008
Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2011
Free Software Foundation, Inc.
Written by Ian Lance Taylor, Cygnus Support.
Rewritten by Kai Tietz, Onevision.
@ -1803,16 +1803,15 @@ define_versioninfo (rc_res_id id, rc_uint_type language,
/* Add string version info to a list of version information. */
rc_ver_info *
append_ver_stringfileinfo (rc_ver_info *verinfo, const char *language,
rc_ver_stringinfo *strings)
append_ver_stringfileinfo (rc_ver_info *verinfo,
rc_ver_stringtable *stringtables)
{
rc_ver_info *vi, **pp;
vi = (rc_ver_info *) res_alloc (sizeof (rc_ver_info));
vi->next = NULL;
vi->type = VERINFO_STRING;
unicode_from_ascii ((rc_uint_type *) NULL, &vi->u.string.language, language);
vi->u.string.strings = strings;
vi->u.string.stringtables = stringtables;
for (pp = &verinfo; *pp != NULL; pp = &(*pp)->next)
;
@ -1821,6 +1820,25 @@ append_ver_stringfileinfo (rc_ver_info *verinfo, const char *language,
return verinfo;
}
rc_ver_stringtable *
append_ver_stringtable (rc_ver_stringtable *stringtable,
const char *language,
rc_ver_stringinfo *strings)
{
rc_ver_stringtable *vst, **pp;
vst = (rc_ver_stringtable *) res_alloc (sizeof (rc_ver_stringtable));
vst->next = NULL;
unicode_from_ascii ((rc_uint_type *) NULL, &vst->language, language);
vst->strings = strings;
for (pp = &stringtable; *pp != NULL; pp = &(*pp)->next)
;
*pp = vst;
return stringtable;
}
/* Add variable version info to a list of version information. */
rc_ver_info *
@ -3264,25 +3282,31 @@ write_rc_versioninfo (FILE *e, const rc_versioninfo *versioninfo)
{
case VERINFO_STRING:
{
const rc_ver_stringtable *vst;
const rc_ver_stringinfo *vs;
fprintf (e, " BLOCK \"StringFileInfo\"\n");
fprintf (e, " BEGIN\n");
fprintf (e, " BLOCK ");
unicode_print_quoted (e, vi->u.string.language, -1);
fprintf (e, "\n");
fprintf (e, " BEGIN\n");
for (vs = vi->u.string.strings; vs != NULL; vs = vs->next)
for (vst = vi->u.string.stringtables; vst != NULL; vst = vst->next)
{
fprintf (e, " VALUE ");
unicode_print_quoted (e, vs->key, -1);
fprintf (e, ", ");
unicode_print_quoted (e, vs->value, -1);
fprintf (e, "\n");
}
fprintf (e, " BLOCK ");
unicode_print_quoted (e, vst->language, -1);
fprintf (e, " END\n");
fprintf (e, "\n");
fprintf (e, " BEGIN\n");
for (vs = vst->strings; vs != NULL; vs = vs->next)
{
fprintf (e, " VALUE ");
unicode_print_quoted (e, vs->key, -1);
fprintf (e, ", ");
unicode_print_quoted (e, vs->value, -1);
fprintf (e, "\n");
}
fprintf (e, " END\n");
}
fprintf (e, " END\n");
break;
}