diff options
Diffstat (limited to 'binutils-2.22/binutils/rcparse.y')
-rw-r--r-- | binutils-2.22/binutils/rcparse.y | 72 |
1 files changed, 61 insertions, 11 deletions
diff --git a/binutils-2.22/binutils/rcparse.y b/binutils-2.22/binutils/rcparse.y index 8caa3ef..e80cbc6 100644 --- a/binutils-2.22/binutils/rcparse.y +++ b/binutils-2.22/binutils/rcparse.y @@ -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 @@ -162,7 +164,7 @@ static const rc_res_id res_null_text = { 1, {{0, &null_unichar}}}; %type <s> file_name %type <uni> res_unicode_string resname res_unicode_string_concat %type <ss> sizedstring -%type <suni> sizedunistring +%type <suni> sizedunistring res_unicode_sizedstring res_unicode_sizedstring_concat %type <i> sizednumexpr sizedposnumexpr %left '|' @@ -1258,20 +1260,20 @@ rcdata_data: stringtable: STRINGTABLE suboptions BEG - { sub_res_info = $2; } - string_data END + { sub_res_info = $2; rcparse_rcdata (); } + string_data END { rcparse_normal (); } ; string_data: /* empty */ - | string_data numexpr res_unicode_string_concat + | string_data numexpr res_unicode_sizedstring_concat { - define_stringtable (&sub_res_info, $2, $3); + define_stringtable (&sub_res_info, $2, $3.s, $3.length); rcparse_discard_strings (); } - | string_data numexpr ',' res_unicode_string_concat + | string_data numexpr ',' res_unicode_sizedstring_concat { - define_stringtable (&sub_res_info, $2, $4); + define_stringtable (&sub_res_info, $2, $4.s, $4.length); rcparse_discard_strings (); } | string_data error @@ -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 */ { @@ -1705,6 +1718,43 @@ res_unicode_string: } ; +res_unicode_sizedstring: + sizedunistring + { + $$ = $1; + } + | sizedstring + { + unichar *h = NULL; + rc_uint_type l = 0; + unicode_from_ascii_len (&l, &h, $1.s, $1.length); + $$.s = h; + $$.length = l; + } + ; + +/* Concat string */ +res_unicode_sizedstring_concat: + res_unicode_sizedstring + { + $$ = $1; + } + | + res_unicode_sizedstring_concat res_unicode_sizedstring + { + rc_uint_type l1 = $1.length; + rc_uint_type l2 = $2.length; + unichar *h = (unichar *) res_alloc ((l1 + l2 + 1) * sizeof (unichar)); + if (l1 != 0) + memcpy (h, $1.s, l1 * sizeof (unichar)); + if (l2 != 0) + memcpy (h + l1, $2.s, l2 * sizeof (unichar)); + h[l1 + l2] = 0; + $$.length = l1 + l2; + $$.s = h; + } + ; + sizedstring: SIZEDSTRING { |