OSDN Git Service

PR binutils/13051
authornickc <nickc>
Tue, 11 Oct 2011 15:56:27 +0000 (15:56 +0000)
committernickc <nickc>
Tue, 11 Oct 2011 15:56:27 +0000 (15:56 +0000)
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.

binutils/ChangeLog
binutils/rcparse.y
binutils/resbin.c
binutils/resrc.c
binutils/testsuite/ChangeLog
binutils/testsuite/binutils-all/windres/version.rsd
binutils/testsuite/binutils-all/windres/version_cat.rsd
binutils/testsuite/binutils-all/windres/version_mlang.rc [new file with mode: 0644]
binutils/testsuite/binutils-all/windres/version_mlang.rsd [new file with mode: 0644]
binutils/windint.h
binutils/windres.h

index 2d66216..4d629ec 100644 (file)
@@ -1,3 +1,23 @@
+2011-10-11  Chris  <player1@onet.eu>
+
+       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.
+
 2011-10-10  Nick Clifton  <nickc@redhat.com>
 
        * po/bg.po: Updated Bulgarian translation.
index 8caa3ef..e260792 100644 (file)
@@ -1,6 +1,6 @@
 %{ /* rcparse.y -- parser for Windows rc files
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008
-   Free Software Foundation, Inc.
+   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008,
+   2011  Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Extended by Kai Tietz, Onevision.
 
@@ -79,6 +79,7 @@ static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}};
   rc_rcdata_item *rcdata_item;
   rc_fixed_versioninfo *fixver;
   rc_ver_info *verinfo;
+  rc_ver_stringtable *verstringtable;
   rc_ver_stringinfo *verstring;
   rc_ver_varinfo *vervar;
   rc_toolbar_item *toobar_item;
@@ -150,6 +151,7 @@ static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}};
 %type <rcdata_item> opt_control_data
 %type <fixver> fixedverinfo
 %type <verinfo> verblocks
+%type <verstringtable> verstringtables
 %type <verstring> vervals
 %type <vervar> vertrans
 %type <toobar_item> toolbar_data
@@ -1471,9 +1473,9 @@ verblocks:
          {
            $$ = NULL;
          }
-       | verblocks BLOCKSTRINGFILEINFO BEG BLOCK BEG vervals END END
+       | verblocks BLOCKSTRINGFILEINFO BEG verstringtables END
          {
-           $$ = append_ver_stringfileinfo ($1, $4, $6);
+           $$ = append_ver_stringfileinfo ($1, $4);
          }
        | verblocks BLOCKVARFILEINFO BEG VALUE res_unicode_string_concat vertrans END
          {
@@ -1481,6 +1483,17 @@ verblocks:
          }
        ;
 
+verstringtables:
+      /* empty */
+         {
+           $$ = NULL;
+         }
+       | verstringtables BLOCK BEG vervals END
+         {
+           $$ = append_ver_stringtable ($1, $2, $4);
+         }
+       ;
+
 vervals:
          /* empty */
          {
index b3682f7..b5dcd9b 100644 (file)
@@ -1,5 +1,5 @@
 /* resbin.c -- manipulate the Windows binary resource format.
-   Copyright 1997, 1998, 1999, 2002, 2003, 2005, 2006, 2007, 2009, 2010
+   Copyright 1997, 1998, 1999, 2002, 2003, 2005, 2006, 2007, 2009, 2010, 2011
    Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Rewritten by Kai Tietz, Onevision.
@@ -1027,7 +1027,7 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
 
       if (ch == 'S')
        {
-         rc_ver_stringinfo **ppvs;
+         rc_ver_stringtable **ppvst;
 
          vi->type = VERINFO_STRING;
 
@@ -1041,36 +1041,54 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
          data += off;
          length -= off;
 
-         get_version_header (wrbfd, data, length, (const char *) NULL,
-                             &vi->u.string.language, &verlen, &vallen,
-                             &type, &off);
-
-         if (vallen != 0)
-           fatal (_("unexpected version stringtable value length %ld"), (long) vallen);
-
-         data += off;
-         length -= off;
-         verlen -= off;
-
-         vi->u.string.strings = NULL;
-         ppvs = &vi->u.string.strings;
-
          /* It's convenient to round verlen to a 4 byte alignment,
              since we round the subvariables in the loop.  */
+
          verlen = (verlen + 3) &~ 3;
 
+         vi->u.string.stringtables = NULL;
+         ppvst = &vi->u.string.stringtables;
+
          while (verlen > 0)
            {
+             rc_ver_stringtable *vst;
+             rc_uint_type stverlen;
+             rc_ver_stringinfo **ppvs;
+
+             if (length < 8)
+               toosmall (_("version stringtable"));
+
+             vst = (rc_ver_stringtable *) res_alloc (sizeof (rc_ver_stringtable));
+
+             get_version_header (wrbfd, data, length, (const char *) NULL,
+                                 &vst->language, &stverlen, &vallen, &type, &off);
+
+             if (vallen != 0)
+               fatal (_("unexpected version stringtable value length %ld"), (long) vallen);
+
+             data += off;
+             length -= off;
+             verlen -= off;
+
+         stverlen = (stverlen + 3) &~ 3;
+         vst->strings = NULL;
+         ppvs = &vst->strings;
+
+         while (stverlen > 0)
+           {
              rc_ver_stringinfo *vs;
-             rc_uint_type subverlen, vslen, valoff;
+             rc_uint_type sverlen, vslen, valoff;
+
+             if (length < 8)
+               toosmall (_("version string"));
 
-             vs = (rc_ver_stringinfo *) res_alloc (sizeof *vs);
+             vs = (rc_ver_stringinfo *) res_alloc (sizeof (rc_ver_stringinfo));
 
-             get_version_header (wrbfd, data, length,
-                                 (const char *) NULL, &vs->key, &subverlen,
-                                 &vallen, &type, &off);
+             get_version_header (wrbfd, data, length, (const char *) NULL,
+                                 &vs->key, &sverlen, &vallen, &type, &off);
 
-             subverlen = (subverlen + 3) &~ 3;
+             sverlen = (sverlen + 3) &~ 3;
 
              data += off;
              length -= off;
@@ -1079,22 +1097,26 @@ bin_to_res_version (windres_bfd *wrbfd, const bfd_byte *data, rc_uint_type lengt
              valoff = vslen * 2 + 2;
              valoff = (valoff + 3) &~ 3;
 
-             if (off + valoff != subverlen)
+             if (off + valoff != sverlen)
                fatal (_("unexpected version string length %ld != %ld + %ld"),
-                      (long) subverlen, (long) off, (long) valoff);
-
-             vs->next = NULL;
-             *ppvs = vs;
-             ppvs = &vs->next;
+                      (long) sverlen, (long) off, (long) valoff);
 
              data += valoff;
              length -= valoff;
 
-             if (verlen < subverlen)
+             if (stverlen < sverlen)
                fatal (_("unexpected version string length %ld < %ld"),
-                      (long) verlen, (long) subverlen);
+                      (long) verlen, (long) sverlen);
+             stverlen -= sverlen;
+
+             vs->next = NULL;
+             *ppvs = vs;
+             ppvs = &vs->next;
+           }
 
-             verlen -= subverlen;
+         vst->next = NULL;
+         *ppvst = vst;
+         ppvst = &vst->next;
            }
        }
       else if (ch == 'V')
@@ -2005,52 +2027,62 @@ res_to_bin_versioninfo (windres_bfd *wrbfd, rc_uint_type off,
          abort ();
        case VERINFO_STRING:
          {
-           struct bin_ver_info bvsd;
-           rc_uint_type vs_off;
-           const rc_ver_stringinfo *vs;
+           const rc_ver_stringtable *vst;
 
            off = string_to_unicode_bin (wrbfd, off, "StringFileInfo");
-           off += (4 - ((off - off_delta) & 3)) & 3;
-
-           vs_off = off;
-
-           off += BIN_VER_INFO_SIZE;
 
-           off = unicode_to_bin (wrbfd, off, vi->u.string.language);
+           if (!vi->u.string.stringtables)
+             off += (4 - ((off - off_delta) & 3)) & 3;
 
-           for (vs = vi->u.string.strings; vs != NULL; vs = vs->next)
+           for (vst = vi->u.string.stringtables; vst != NULL; vst = vst->next)
              {
-               struct bin_ver_info bvss;
-               rc_uint_type vss_off,str_off;
+               struct bin_ver_info bvst;
+               rc_uint_type vst_off;
+               const rc_ver_stringinfo *vs;
 
                off += (4 - ((off - off_delta) & 3)) & 3;
 
-               vss_off = off;
+               vst_off = off;
                off += BIN_VER_INFO_SIZE;
 
-               off = unicode_to_bin (wrbfd, off, vs->key);
+               off = unicode_to_bin (wrbfd, off, vst->language);
 
-               off += (4 - ((off - off_delta) & 3)) & 3;
+               for (vs = vst->strings; vs != NULL; vs = vs->next)
+                 {
+                   struct bin_ver_info bvs;
+                   rc_uint_type vs_off, str_off;
+
+                   off += (4 - ((off - off_delta) & 3)) & 3;
+
+                   vs_off = off;
+                   off += BIN_VER_INFO_SIZE;
+
+                   off = unicode_to_bin (wrbfd, off, vs->key);
+
+                   off += (4 - ((off - off_delta) & 3)) & 3;
+
+                   str_off = off;
+                   off = unicode_to_bin (wrbfd, off, vs->value);
+
+                   if (wrbfd)
+                     {
+                       windres_put_16 (wrbfd, bvs.size, off - vs_off);
+                       windres_put_16 (wrbfd, bvs.sig1, (off - str_off) / 2);
+                       windres_put_16 (wrbfd, bvs.sig2, 1);
+                       set_windres_bfd_content (wrbfd, &bvs, vs_off,
+                                                BIN_VER_INFO_SIZE);
+                     }
+                 }
 
-               str_off = off;
-               off = unicode_to_bin (wrbfd, off, vs->value);
                if (wrbfd)
                  {
-                   windres_put_16 (wrbfd, bvss.size, off - vss_off);
-                   windres_put_16 (wrbfd, bvss.sig1, (off - str_off) / 2);
-                   windres_put_16 (wrbfd, bvss.sig2, 1);
-                   set_windres_bfd_content (wrbfd, &bvss, vss_off,
-                                            BIN_VER_INFO_SIZE);
+                   windres_put_16 (wrbfd, bvst.size, off - vst_off);
+                   windres_put_16 (wrbfd, bvst.sig1, 0);
+                   windres_put_16 (wrbfd, bvst.sig2, 1);
+                   set_windres_bfd_content (wrbfd, &bvst, vst_off,
+                                            BIN_VER_INFO_SIZE);
                  }
              }
-           if (wrbfd)
-             {
-               windres_put_16 (wrbfd, bvsd.size, off - vs_off);
-               windres_put_16 (wrbfd, bvsd.sig1, 0);
-               windres_put_16 (wrbfd, bvsd.sig2, 0);
-               set_windres_bfd_content (wrbfd, &bvsd, vs_off,
-                                        BIN_VER_INFO_SIZE);
-             }
            break;
          }
 
@@ -2100,9 +2132,9 @@ res_to_bin_versioninfo (windres_bfd *wrbfd, rc_uint_type off,
 
       if (wrbfd)
        {
-         windres_put_16 (wrbfd, bv.size, off-bv_off);
+         windres_put_16 (wrbfd, bv.size, off - bv_off);
          windres_put_16 (wrbfd, bv.sig1, 0);
-         windres_put_16 (wrbfd, bv.sig2, 0);
+         windres_put_16 (wrbfd, bv.sig2, 1);
          set_windres_bfd_content (wrbfd, &bv, bv_off,
                                   BIN_VER_INFO_SIZE);
        }
index 0a14ad2..a0308df 100644 (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, "    BLOCK ");
+               unicode_print_quoted (e, vst->language, -1);
+
                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");
+             }
            fprintf (e, "  END\n");
            break;
          }
index 1f3c1cf..d620d8e 100644 (file)
@@ -1,3 +1,11 @@
+2011-10-11  Chris  <player1@onet.eu>
+
+       PR binutils/13051
+       * 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.
+
 2011-10-07  H.J. Lu  <hongjiu.lu@intel.com>
 
        * binutils-all/objdump.exp: Don't run dw2-decodedline.S on ia64.
index 85dd5d3..8ad479c 100644 (file)
@@ -1,7 +1,3 @@
-
-version.res:     file format binary
-
-Contents of section .data:
  0000 00000000 20000000 ffff0000 ffff0000  .... ...........
  0010 00000000 00000000 00000000 00000000  ................
  0020 ec020000 20000000 ffff1000 ffff0100  .... ...........
@@ -12,9 +8,9 @@ Contents of section .data:
  0070 00000100 01000000 00000100 01000000  ................
  0080 3f000000 00000000 04000000 01000000  ?...............
  0090 00000000 00000000 00000000 4c020000  ............L...
- 00a0 00005300 74007200 69006e00 67004600  ..S.t.r.i.n.g.F.
+ 00a0 01005300 74007200 69006e00 67004600  ..S.t.r.i.n.g.F.
  00b0 69006c00 65004900 6e006600 6f000000  i.l.e.I.n.f.o...
- 00c0 28020000 00003000 34003000 37003000  (.....0.4.0.7.0.
+ 00c0 28020000 01003000 34003000 37003000  (.....0.4.0.7.0.
  00d0 34006500 34000000 32000900 01004300  4.e.4...2.....C.
  00e0 6f006d00 70006100 6e007900 4e006100  o.m.p.a.n.y.N.a.
  00f0 6d006500 00000000 62006900 6e007500  m.e.....b.i.n.u.
@@ -48,7 +44,7 @@ Contents of section .data:
  02b0 72000000 34000800 01005000 72006f00  r...4.....P.r.o.
  02c0 64007500 63007400 56006500 72007300  d.u.c.t.V.e.r.s.
  02d0 69006f00 6e000000 31002e00 30002e00  i.o.n...1...0...
- 02e0 30002e00 31000000 44000000 00005600  0...1...D.....V.
+ 02e0 30002e00 31000000 44000000 01005600  0...1...D.....V.
  02f0 61007200 46006900 6c006500 49006e00  a.r.F.i.l.e.I.n.
  0300 66006f00 00000000 24000400 00005400  f.o.....$.....T.
  0310 72006100 6e007300 6c006100 74006900  r.a.n.s.l.a.t.i.
index 85dd5d3..4e57512 100644 (file)
@@ -12,9 +12,9 @@ Contents of section .data:
  0070 00000100 01000000 00000100 01000000  ................
  0080 3f000000 00000000 04000000 01000000  ?...............
  0090 00000000 00000000 00000000 4c020000  ............L...
- 00a0 00005300 74007200 69006e00 67004600  ..S.t.r.i.n.g.F.
+ 00a0 01005300 74007200 69006e00 67004600  ..S.t.r.i.n.g.F.
  00b0 69006c00 65004900 6e006600 6f000000  i.l.e.I.n.f.o...
- 00c0 28020000 00003000 34003000 37003000  (.....0.4.0.7.0.
+ 00c0 28020000 01003000 34003000 37003000  (.....0.4.0.7.0.
  00d0 34006500 34000000 32000900 01004300  4.e.4...2.....C.
  00e0 6f006d00 70006100 6e007900 4e006100  o.m.p.a.n.y.N.a.
  00f0 6d006500 00000000 62006900 6e007500  m.e.....b.i.n.u.
@@ -48,7 +48,7 @@ Contents of section .data:
  02b0 72000000 34000800 01005000 72006f00  r...4.....P.r.o.
  02c0 64007500 63007400 56006500 72007300  d.u.c.t.V.e.r.s.
  02d0 69006f00 6e000000 31002e00 30002e00  i.o.n...1...0...
- 02e0 30002e00 31000000 44000000 00005600  0...1...D.....V.
+ 02e0 30002e00 31000000 44000000 01005600  0...1...D.....V.
  02f0 61007200 46006900 6c006500 49006e00  a.r.F.i.l.e.I.n.
  0300 66006f00 00000000 24000400 00005400  f.o.....$.....T.
  0310 72006100 6e007300 6c006100 74006900  r.a.n.s.l.a.t.i.
diff --git a/binutils/testsuite/binutils-all/windres/version_mlang.rc b/binutils/testsuite/binutils-all/windres/version_mlang.rc
new file mode 100644 (file)
index 0000000..e796ca9
--- /dev/null
@@ -0,0 +1,43 @@
+#include "windows.h"
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 1,0,0,1
+ PRODUCTVERSION 1,0,0,1
+ FILEFLAGSMASK 0x3fL
+ FILEFLAGS 0x0L
+ FILEOS 0x4L
+ FILETYPE 0x1L
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904b0"
+        BEGIN
+            VALUE "CompanyName", "binutils"
+            VALUE "FileDescription", "RC compiler."
+            VALUE "FileVersion", "1.0.0.1"
+            VALUE "InternalName", "windres.exe"
+            VALUE "LegalCopyright", "(c) FSF. All rights are reserved."
+            VALUE "OriginalFilename", "windres.exe"
+            VALUE "ProductName", "windows resource compiler"
+            VALUE "ProductVersion", "1.0.0.1"
+        END
+        BLOCK "041504b0"
+        BEGIN
+            VALUE "CompanyName", "binutils"
+            VALUE "FileDescription", "Kompilator RC."
+            VALUE "FileVersion", "1.0.0.1"
+            VALUE "InternalName", "windres.exe"
+            VALUE "LegalCopyright", "(c) FSF. Wszystkie prawa zastrzezone."
+            VALUE "OriginalFilename", "windres.exe"
+            VALUE "ProductName", "windows resource compiler"
+            VALUE "ProductVersion", "1.0.0.1"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x0409, 0x04b0, 0x0415, 0x04b0
+    END
+END
diff --git a/binutils/testsuite/binutils-all/windres/version_mlang.rsd b/binutils/testsuite/binutils-all/windres/version_mlang.rsd
new file mode 100644 (file)
index 0000000..05ed488
--- /dev/null
@@ -0,0 +1,87 @@
+ 0000 00000000 20000000 ffff0000 ffff0000  .... ...........
+ 0010 00000000 00000000 00000000 00000000  ................
+ 0020 24050000 20000000 ffff1000 ffff0100  $... ...........
+ 0030 00000000 00000000 00000000 00000000  ................
+ 0040 24053400 00005600 53005f00 56004500  $.4...V.S._.V.E.
+ 0050 52005300 49004f00 4e005f00 49004e00  R.S.I.O.N._.I.N.
+ 0060 46004f00 00000000 bd04effe 00000100  F.O.............
+ 0070 00000100 01000000 00000100 01000000  ................
+ 0080 3f000000 00000000 04000000 01000000  ?...............
+ 0090 00000000 00000000 00000000 80040000  ................
+ 00a0 01005300 74007200 69006e00 67004600  ..S.t.r.i.n.g.F.
+ 00b0 69006c00 65004900 6e006600 6f000000  i.l.e.I.n.f.o...
+ 00c0 28020000 01003000 34003000 39003000  (.....0.4.0.9.0.
+ 00d0 34006200 30000000 32000900 01004300  4.b.0...2.....C.
+ 00e0 6f006d00 70006100 6e007900 4e006100  o.m.p.a.n.y.N.a.
+ 00f0 6d006500 00000000 62006900 6e007500  m.e.....b.i.n.u.
+ 0100 74006900 6c007300 00000000 42000d00  t.i.l.s.....B...
+ 0110 01004600 69006c00 65004400 65007300  ..F.i.l.e.D.e.s.
+ 0120 63007200 69007000 74006900 6f006e00  c.r.i.p.t.i.o.n.
+ 0130 00000000 52004300 20006300 6f006d00  ....R.C. .c.o.m.
+ 0140 70006900 6c006500 72002e00 00000000  p.i.l.e.r.......
+ 0150 30000800 01004600 69006c00 65005600  0.....F.i.l.e.V.
+ 0160 65007200 73006900 6f006e00 00000000  e.r.s.i.o.n.....
+ 0170 31002e00 30002e00 30002e00 31000000  1...0...0...1...
+ 0180 38000c00 01004900 6e007400 65007200  8.....I.n.t.e.r.
+ 0190 6e006100 6c004e00 61006d00 65000000  n.a.l.N.a.m.e...
+ 01a0 77006900 6e006400 72006500 73002e00  w.i.n.d.r.e.s...
+ 01b0 65007800 65000000 68002200 01004c00  e.x.e...h."...L.
+ 01c0 65006700 61006c00 43006f00 70007900  e.g.a.l.C.o.p.y.
+ 01d0 72006900 67006800 74000000 28006300  r.i.g.h.t...(.c.
+ 01e0 29002000 46005300 46002e00 20004100  ). .F.S.F... .A.
+ 01f0 6c006c00 20007200 69006700 68007400  l.l. .r.i.g.h.t.
+ 0200 73002000 61007200 65002000 72006500  s. .a.r.e. .r.e.
+ 0210 73006500 72007600 65006400 2e000000  s.e.r.v.e.d.....
+ 0220 40000c00 01004f00 72006900 67006900  @.....O.r.i.g.i.
+ 0230 6e006100 6c004600 69006c00 65006e00  n.a.l.F.i.l.e.n.
+ 0240 61006d00 65000000 77006900 6e006400  a.m.e...w.i.n.d.
+ 0250 72006500 73002e00 65007800 65000000  r.e.s...e.x.e...
+ 0260 54001a00 01005000 72006f00 64007500  T.....P.r.o.d.u.
+ 0270 63007400 4e006100 6d006500 00000000  c.t.N.a.m.e.....
+ 0280 77006900 6e006400 6f007700 73002000  w.i.n.d.o.w.s. .
+ 0290 72006500 73006f00 75007200 63006500  r.e.s.o.u.r.c.e.
+ 02a0 20006300 6f006d00 70006900 6c006500   .c.o.m.p.i.l.e.
+ 02b0 72000000 34000800 01005000 72006f00  r...4.....P.r.o.
+ 02c0 64007500 63007400 56006500 72007300  d.u.c.t.V.e.r.s.
+ 02d0 69006f00 6e000000 31002e00 30002e00  i.o.n...1...0...
+ 02e0 30002e00 31000000 34020000 01003000  0...1...4.....0.
+ 02f0 34003100 35003000 34006200 30000000  4.1.5.0.4.b.0...
+ 0300 32000900 01004300 6f006d00 70006100  2.....C.o.m.p.a.
+ 0310 6e007900 4e006100 6d006500 00000000  n.y.N.a.m.e.....
+ 0320 62006900 6e007500 74006900 6c007300  b.i.n.u.t.i.l.s.
+ 0330 00000000 46000f00 01004600 69006c00  ....F.....F.i.l.
+ 0340 65004400 65007300 63007200 69007000  e.D.e.s.c.r.i.p.
+ 0350 74006900 6f006e00 00000000 4b006f00  t.i.o.n.....K.o.
+ 0360 6d007000 69006c00 61007400 6f007200  m.p.i.l.a.t.o.r.
+ 0370 20005200 43002e00 00000000 30000800   .R.C.......0...
+ 0380 01004600 69006c00 65005600 65007200  ..F.i.l.e.V.e.r.
+ 0390 73006900 6f006e00 00000000 31002e00  s.i.o.n.....1...
+ 03a0 30002e00 30002e00 31000000 38000c00  0...0...1...8...
+ 03b0 01004900 6e007400 65007200 6e006100  ..I.n.t.e.r.n.a.
+ 03c0 6c004e00 61006d00 65000000 77006900  l.N.a.m.e...w.i.
+ 03d0 6e006400 72006500 73002e00 65007800  n.d.r.e.s...e.x.
+ 03e0 65000000 70002600 01004c00 65006700  e...p.&...L.e.g.
+ 03f0 61006c00 43006f00 70007900 72006900  a.l.C.o.p.y.r.i.
+ 0400 67006800 74000000 28006300 29002000  g.h.t...(.c.). .
+ 0410 46005300 46002e00 20005700 73007a00  F.S.F... .W.s.z.
+ 0420 79007300 74006b00 69006500 20007000  y.s.t.k.i.e. .p.
+ 0430 72006100 77006100 20007a00 61007300  r.a.w.a. .z.a.s.
+ 0440 74007200 7a006500 7a006f00 6e006500  t.r.z.e.z.o.n.e.
+ 0450 2e000000 40000c00 01004f00 72006900  ....@.....O.r.i.
+ 0460 67006900 6e006100 6c004600 69006c00  g.i.n.a.l.F.i.l.
+ 0470 65006e00 61006d00 65000000 77006900  e.n.a.m.e...w.i.
+ 0480 6e006400 72006500 73002e00 65007800  n.d.r.e.s...e.x.
+ 0490 65000000 54001a00 01005000 72006f00  e...T.....P.r.o.
+ 04a0 64007500 63007400 4e006100 6d006500  d.u.c.t.N.a.m.e.
+ 04b0 00000000 77006900 6e006400 6f007700  ....w.i.n.d.o.w.
+ 04c0 73002000 72006500 73006f00 75007200  s. .r.e.s.o.u.r.
+ 04d0 63006500 20006300 6f006d00 70006900  c.e. .c.o.m.p.i.
+ 04e0 6c006500 72000000 34000800 01005000  l.e.r...4.....P.
+ 04f0 72006f00 64007500 63007400 56006500  r.o.d.u.c.t.V.e.
+ 0500 72007300 69006f00 6e000000 31002e00  r.s.i.o.n...1...
+ 0510 30002e00 30002e00 31000000 48000000  0...0...1...H...
+ 0520 01005600 61007200 46006900 6c006500  ..V.a.r.F.i.l.e.
+ 0530 49006e00 66006f00 00000000 28000800  I.n.f.o.....(...
+ 0540 00005400 72006100 6e007300 6c006100  ..T.r.a.n.s.l.a.
+ 0550 74006900 6f006e00 00000000 0904b004  t.i.o.n.........
+ 0560 1504b004                             ....            
index eed8f79..0a75899 100644 (file)
@@ -944,6 +944,18 @@ struct __attribute__ ((__packed__)) bin_fixed_versioninfo
 };
 #define BIN_FIXED_VERSIONINFO_SIZE 52
 
+/* A list of string version information.  */
+
+typedef struct rc_ver_stringtable
+{
+  /* Next item.  */
+  struct rc_ver_stringtable *next;
+  /* Language.  */
+  unichar *language;
+  /* Strings.  */
+  struct rc_ver_stringinfo *strings;
+} rc_ver_stringtable;
+
 /* A list of variable version information.  */
 
 typedef struct rc_ver_info
@@ -957,10 +969,8 @@ typedef struct rc_ver_info
     /* StringFileInfo data.  */
     struct
     {
-      /* Language.  */
-      unichar *language;
-      /* Strings.  */
-      struct rc_ver_stringinfo *strings;
+      /* String tables.  */
+      struct rc_ver_stringtable *stringtables;
     } string;
     /* VarFileInfo data.  */
     struct
index 3e65886..b7bd656 100644 (file)
@@ -1,5 +1,5 @@
 /* windres.h -- header file for windres program.
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
+   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2011
    Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Rewritten by Kai Tietz, Onevision.
@@ -109,7 +109,8 @@ extern void define_user_data (rc_res_id, rc_res_id, const rc_res_res_info *, rc_
 extern void define_toolbar (rc_res_id, rc_res_res_info *, rc_uint_type ,rc_uint_type ,rc_toolbar_item *);
 extern void define_user_file (rc_res_id, rc_res_id, const rc_res_res_info *, const char *);
 extern void define_versioninfo (rc_res_id, rc_uint_type, rc_fixed_versioninfo *, rc_ver_info *);
-extern rc_ver_info *append_ver_stringfileinfo (rc_ver_info *, const char *, rc_ver_stringinfo *);
+extern rc_ver_info *append_ver_stringfileinfo (rc_ver_info *, rc_ver_stringtable *);
+extern rc_ver_stringtable *append_ver_stringtable (rc_ver_stringtable *, const char *, rc_ver_stringinfo *);
 extern rc_ver_info *append_ver_varfileinfo (rc_ver_info *, const unichar *, rc_ver_varinfo *);
 extern rc_ver_stringinfo *append_verval (rc_ver_stringinfo *, const unichar *, const unichar *);
 extern rc_ver_varinfo *append_vertrans (rc_ver_varinfo *, rc_uint_type, rc_uint_type);