[MIPS] Add Loongson 2K1000 proccessor support.
[deliverable/binutils-gdb.git] / binutils / rcparse.y
index ac72ee777789578d528aa70758db5c7f98c283a5..cf499b311f5ea7a0423433ed77a99659b00d13db 100644 (file)
@@ -1,6 +1,5 @@
 %{ /* rcparse.y -- parser for Windows rc files
 %{ /* rcparse.y -- parser for Windows rc files
-   Copyright 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2007
-   Free Software Foundation, Inc.
+   Copyright (C) 1997-2018 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
    Extended by Kai Tietz, Onevision.
 
    Written by Ian Lance Taylor, Cygnus Support.
    Extended by Kai Tietz, Onevision.
 
@@ -8,7 +7,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -21,6 +20,7 @@
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
    02110-1301, USA.  */
 
+
 /* This is a parser for Windows rc files.  It is based on the parser
    by Gunther Ebert <gunther.ebert@ixos-leipzig.de>.  */
 
 /* This is a parser for Windows rc files.  It is based on the parser
    by Gunther Ebert <gunther.ebert@ixos-leipzig.de>.  */
 
@@ -78,6 +78,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_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;
   rc_ver_stringinfo *verstring;
   rc_ver_varinfo *vervar;
   rc_toolbar_item *toobar_item;
@@ -149,6 +150,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 <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
 %type <verstring> vervals
 %type <vervar> vertrans
 %type <toobar_item> toolbar_data
@@ -161,7 +163,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 <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 '|'
 %type <i> sizednumexpr sizedposnumexpr
 
 %left '|'
@@ -560,7 +562,7 @@ control:
              base_style = BS_AUTO3STATE;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_AUTO3STATE;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -572,7 +574,7 @@ control:
              base_style = BS_AUTOCHECKBOX;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_AUTOCHECKBOX;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -584,7 +586,7 @@ control:
              base_style = BS_AUTORADIOBUTTON;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_AUTORADIOBUTTON;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -596,7 +598,7 @@ control:
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -611,7 +613,7 @@ control:
              base_style = BS_CHECKBOX | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_CHECKBOX | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -625,7 +627,7 @@ control:
              base_style = 0;
              class.named = 0;
              class.u.id = CTL_COMBOBOX;
              base_style = 0;
              class.named = 0;
              class.u.id = CTL_COMBOBOX;
-             res_text_field = res_null_text;   
+             res_text_field = res_null_text;
            }
            control_params
          {
            }
            control_params
          {
@@ -657,7 +659,7 @@ control:
              base_style = SS_CENTER;
              class.named = 0;
              class.u.id = CTL_STATIC;
              base_style = SS_CENTER;
              class.named = 0;
              class.u.id = CTL_STATIC;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -669,7 +671,7 @@ control:
              base_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_DEFPUSHBUTTON | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -681,7 +683,7 @@ control:
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
-             res_text_field = res_null_text;   
+             res_text_field = res_null_text;
            }
            control_params
          {
            }
            control_params
          {
@@ -693,7 +695,7 @@ control:
              base_style = BS_GROUPBOX;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_GROUPBOX;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -705,7 +707,7 @@ control:
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -743,7 +745,7 @@ control:
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
              base_style = ES_LEFT | WS_BORDER | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_EDIT;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -758,7 +760,7 @@ control:
              base_style = LBS_NOTIFY | WS_BORDER;
              class.named = 0;
              class.u.id = CTL_LISTBOX;
              base_style = LBS_NOTIFY | WS_BORDER;
              class.named = 0;
              class.u.id = CTL_LISTBOX;
-             res_text_field = res_null_text;   
+             res_text_field = res_null_text;
            }
            control_params
          {
            }
            control_params
          {
@@ -770,7 +772,7 @@ control:
              base_style = SS_LEFT;
              class.named = 0;
              class.u.id = CTL_STATIC;
              base_style = SS_LEFT;
              class.named = 0;
              class.u.id = CTL_STATIC;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -793,7 +795,7 @@ control:
              base_style = BS_PUSHBUTTON | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_PUSHBUTTON | WS_TABSTOP;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -805,7 +807,7 @@ control:
              base_style = BS_RADIOBUTTON;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_RADIOBUTTON;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -817,7 +819,7 @@ control:
              base_style = SS_RIGHT;
              class.named = 0;
              class.u.id = CTL_STATIC;
              base_style = SS_RIGHT;
              class.named = 0;
              class.u.id = CTL_STATIC;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            }
            control_params
          {
@@ -829,7 +831,7 @@ control:
              base_style = 0;
              class.named = 0;
              class.u.id = CTL_SCROLLBAR;
              base_style = 0;
              class.named = 0;
              class.u.id = CTL_SCROLLBAR;
-             res_text_field = res_null_text;   
+             res_text_field = res_null_text;
            }
            control_params
          {
            }
            control_params
          {
@@ -841,14 +843,14 @@ control:
              base_style = BS_3STATE;
              class.named = 0;
              class.u.id = CTL_BUTTON;
              base_style = BS_3STATE;
              class.named = 0;
              class.u.id = CTL_BUTTON;
-             res_text_field = $2;      
+             res_text_field = $2;
            }
            control_params
          {
            $$ = $4;
          }
        | USERBUTTON resref numexpr ',' numexpr ',' numexpr ','
            }
            control_params
          {
            $$ = $4;
          }
        | USERBUTTON resref numexpr ',' numexpr ',' numexpr ','
-           numexpr ',' numexpr ',' 
+           numexpr ',' numexpr ','
            { style = WS_CHILD | WS_VISIBLE; }
            styleexpr optcnumexpr
          {
            { style = WS_CHILD | WS_VISIBLE; }
            styleexpr optcnumexpr
          {
@@ -925,7 +927,7 @@ resid:
            $$.named = 0;
            $$.u.id = $1;
          }
            $$.named = 0;
            $$.u.id = $1;
          }
-       | res_unicode_string
+       | res_unicode_string_concat
          {
            $$.named = 1;
            $$.u.n.name = $1;
          {
            $$.named = 1;
            $$.u.n.name = $1;
@@ -1247,32 +1249,37 @@ rcdata_data:
            $1.last->next = ri;
            $$.last = ri;
          }
            $1.last->next = ri;
            $$.last = ri;
          }
+       | rcdata_data ','
+         {
+           $$=$1;
+         }
        ;
 
 /* Stringtable resources.  */
 
 stringtable:
        ;
 
 /* Stringtable resources.  */
 
 stringtable:
-         STRINGTABLE suboptions BEG 
-           { sub_res_info = $2; }
-           string_data END
+         STRINGTABLE suboptions BEG
+           { sub_res_info = $2; rcparse_rcdata (); }
+           string_data END { rcparse_normal (); }
        ;
 
 string_data:
          /* empty */
        ;
 
 string_data:
          /* empty */
-       | string_data numexpr res_unicode_string_concat
+       | string_data numexpr res_unicode_sizedstring_concat
          {
          {
-           define_stringtable (&sub_res_info, $2, $3);
-           if (yychar != YYEMPTY)
-             YYERROR;
+           define_stringtable (&sub_res_info, $2, $3.s, $3.length);
            rcparse_discard_strings ();
          }
            rcparse_discard_strings ();
          }
-       | string_data numexpr ',' res_unicode_string_concat
+       | string_data numexpr ',' res_unicode_sizedstring_concat
          {
          {
-           define_stringtable (&sub_res_info, $2, $4);
-           if (yychar != YYEMPTY)
-             YYERROR;
+           define_stringtable (&sub_res_info, $2, $4.s, $4.length);
            rcparse_discard_strings ();
          }
            rcparse_discard_strings ();
          }
+       | string_data error
+         {
+           rcparse_warning (_("invalid stringtable resource."));
+           abort ();
+         }
        ;
 
 rcdata_id:
        ;
 
 rcdata_id:
@@ -1415,16 +1422,18 @@ fixedverinfo:
                  res_alloc (sizeof (rc_fixed_versioninfo)));
            memset ($$, 0, sizeof (rc_fixed_versioninfo));
          }
                  res_alloc (sizeof (rc_fixed_versioninfo)));
            memset ($$, 0, sizeof (rc_fixed_versioninfo));
          }
-       | fixedverinfo FILEVERSION numexpr cnumexpr cnumexpr cnumexpr
+       | fixedverinfo FILEVERSION numexpr optcnumexpr optcnumexpr
+         optcnumexpr
          {
          {
-           $1->file_version_ms = ($3 << 16) | $4;
-           $1->file_version_ls = ($5 << 16) | $6;
+           $1->file_version_ms = ($3 << 16) | ($4 & 0xffff);
+           $1->file_version_ls = ($5 << 16) | ($6 & 0xffff);
            $$ = $1;
          }
            $$ = $1;
          }
-       | fixedverinfo PRODUCTVERSION numexpr cnumexpr cnumexpr cnumexpr
+       | fixedverinfo PRODUCTVERSION numexpr optcnumexpr optcnumexpr
+         optcnumexpr
          {
          {
-           $1->product_version_ms = ($3 << 16) | $4;
-           $1->product_version_ls = ($5 << 16) | $6;
+           $1->product_version_ms = ($3 << 16) | ($4 & 0xffff);
+           $1->product_version_ls = ($5 << 16) | ($6 & 0xffff);
            $$ = $1;
          }
        | fixedverinfo FILEFLAGSMASK numexpr
            $$ = $1;
          }
        | fixedverinfo FILEFLAGSMASK numexpr
@@ -1465,9 +1474,9 @@ verblocks:
          {
            $$ = NULL;
          }
          {
            $$ = 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
          {
          }
        | verblocks BLOCKVARFILEINFO BEG VALUE res_unicode_string_concat vertrans END
          {
@@ -1475,6 +1484,17 @@ verblocks:
          }
        ;
 
          }
        ;
 
+verstringtables:
+      /* empty */
+         {
+           $$ = NULL;
+         }
+       | verstringtables BLOCK BEG vervals END
+         {
+           $$ = append_ver_stringtable ($1, $2, $4);
+         }
+       ;
+
 vervals:
          /* empty */
          {
 vervals:
          /* empty */
          {
@@ -1699,6 +1719,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
          {
 sizedstring:
          SIZEDSTRING
          {
@@ -1830,12 +1887,12 @@ sizednumexpr:
          }
        | sizednumexpr '/' sizednumexpr
          {
          }
        | sizednumexpr '/' sizednumexpr
          {
-           $$.val = $1.val / $3.val;
+           $$.val = $1.val / ($3.val ? $3.val : 1);
            $$.dword = $1.dword || $3.dword;
          }
        | sizednumexpr '%' sizednumexpr
          {
            $$.dword = $1.dword || $3.dword;
          }
        | sizednumexpr '%' sizednumexpr
          {
-           $$.val = $1.val % $3.val;
+           $$.val = $1.val % ($3.val ? $3.val : 1);
            $$.dword = $1.dword || $3.dword;
          }
        | sizednumexpr '+' sizednumexpr
            $$.dword = $1.dword || $3.dword;
          }
        | sizednumexpr '+' sizednumexpr
@@ -1909,12 +1966,13 @@ sizedposnumexpr:
          }
        | sizedposnumexpr '/' sizednumexpr
          {
          }
        | sizedposnumexpr '/' sizednumexpr
          {
-           $$.val = $1.val / $3.val;
+           $$.val = $1.val / ($3.val ? $3.val : 1);
            $$.dword = $1.dword || $3.dword;
          }
        | sizedposnumexpr '%' sizednumexpr
          {
            $$.dword = $1.dword || $3.dword;
          }
        | sizedposnumexpr '%' sizednumexpr
          {
-           $$.val = $1.val % $3.val;
+           /* PR 17512: file: 89105a25.  */
+           $$.val = $1.val % ($3.val ? $3.val : 1);
            $$.dword = $1.dword || $3.dword;
          }
        | sizedposnumexpr '+' sizednumexpr
            $$.dword = $1.dword || $3.dword;
          }
        | sizedposnumexpr '+' sizednumexpr
This page took 0.030127 seconds and 4 git commands to generate.