1999-09-04 Steve Chamberlain <sac@pobox.com>
[deliverable/binutils-gdb.git] / binutils / rcparse.y
index 9ea9cf5eae4b9b5d878301a17cc7ad8b0ee08f69..03cbbdc5b67e194bc894f96c364a0f0400a43c5f 100644 (file)
@@ -1,5 +1,5 @@
 %{ /* rcparse.y -- parser for Windows rc files
-   Copyright 1997 Free Software Foundation, Inc.
+   Copyright 1997, 1998 Free Software Foundation, Inc.
    Written by Ian Lance Taylor, Cygnus Support.
 
    This file is part of GNU Binutils.
@@ -107,7 +107,7 @@ static unsigned long class;
 %token BEDIT HEDIT IEDIT
 %token FONT
 %token ICON
-%token LANGUAGE CHARACTERISTICS VERSION
+%token LANGUAGE CHARACTERISTICS VERSIONK
 %token MENU MENUEX MENUITEM SEPARATOR POPUP CHECKED GRAYED HELP INACTIVE
 %token MENUBARBREAK MENUBREAK
 %token MESSAGETABLE
@@ -122,6 +122,7 @@ static unsigned long class;
 %token <s> QUOTEDSTRING STRING
 %token <i> NUMBER
 %token <ss> SIZEDSTRING
+%token IGNORED_TOKEN
 
 %type <pacc> acc_entries
 %type <acc> acc_entry acc_event
@@ -167,6 +168,7 @@ input:
        | input newcmd stringtable
        | input newcmd user
        | input newcmd versioninfo
+       | input newcmd IGNORED_TOKEN
        ;
 
 newcmd:
@@ -221,6 +223,9 @@ acc_entry:
            $$ = $1;
            $$.id = $2;
            $$.flags |= $4;
+           if (($$.flags & ACC_VIRTKEY) == 0
+               && ($$.flags & (ACC_SHIFT | ACC_CONTROL | ACC_ALT)) != 0)
+             rcparse_warning (_("inappropriate modifiers for non-VIRTKEY"));
          }
        ;
 
@@ -228,21 +233,27 @@ acc_event:
          QUOTEDSTRING
          {
            const char *s = $1;
+           char ch;
 
+           $$.next = NULL;
            $$.id = 0;
-           if (*s != '^')
+           ch = *s;
+           if (ch != '^')
              $$.flags = 0;
            else
              {
-               $$.flags = ACC_CONTROL;
+               $$.flags = ACC_CONTROL | ACC_VIRTKEY;
                ++s;
+               ch = *s;
+               ch = toupper ((unsigned char) ch);
              }
-           $$.key = *s;
+           $$.key = ch;
            if (s[1] != '\0')
-             rcparse_warning ("accelerator should only be one character");
+             rcparse_warning (_("accelerator should only be one character"));
          }
        | posnumexpr
          {
+           $$.next = NULL;
            $$.flags = 0;
            $$.id = 0;
            $$.key = $1;
@@ -258,6 +269,11 @@ acc_options:
          {
            $$ = $1 | $3;
          }
+       /* I've had one report that the comma is optional.  */
+       | acc_options acc_option
+         {
+           $$ = $1 | $2;
+         }
        ;
 
 acc_option:
@@ -319,6 +335,8 @@ dialog:
              dialog.height = $8;
              dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
              dialog.exstyle = $4;
+             dialog.menu.named = 1;
+             dialog.class.named = 1;
              dialog.font = NULL;
              dialog.ex = NULL;
              dialog.controls = NULL;
@@ -338,6 +356,8 @@ dialog:
              dialog.height = $8;
              dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
              dialog.exstyle = $4;
+             dialog.menu.named = 1;
+             dialog.class.named = 1;
              dialog.font = NULL;
              dialog.ex = ((struct dialog_ex *)
                           res_alloc (sizeof (struct dialog_ex)));
@@ -359,6 +379,8 @@ dialog:
              dialog.height = $8;
              dialog.style = WS_POPUP | WS_BORDER | WS_SYSMENU;
              dialog.exstyle = $4;
+             dialog.menu.named = 1;
+             dialog.class.named = 1;
              dialog.font = NULL;
              dialog.ex = ((struct dialog_ex *)
                           res_alloc (sizeof (struct dialog_ex)));
@@ -395,7 +417,7 @@ styles:
            dialog.class = $3;
          }
        | styles STYLE
-           { style = dialog.style }
+           { style = dialog.style; }
            styleexpr
          {
            dialog.style = style;
@@ -406,15 +428,17 @@ styles:
          }
        | styles FONT numexpr ',' QUOTEDSTRING
          {
+           dialog.style |= DS_SETFONT;
            dialog.pointsize = $3;
            unicode_from_ascii ((int *) NULL, &dialog.font, $5);
          }
        | styles FONT numexpr ',' QUOTEDSTRING cnumexpr cnumexpr
          {
+           dialog.style |= DS_SETFONT;
            dialog.pointsize = $3;
            unicode_from_ascii ((int *) NULL, &dialog.font, $5);
            if (dialog.ex == NULL)
-             rcparse_warning ("extended FONT requires DIALOGEX");
+             rcparse_warning (_("extended FONT requires DIALOGEX"));
            else
              {
                dialog.ex->weight = $6;
@@ -433,7 +457,7 @@ styles:
          {
            sub_res_info.language = $3 | ($4 << 8);
          }
-       | styles VERSION numexpr
+       | styles VERSIONK numexpr
          {
            sub_res_info.version = $3;
          }
@@ -492,7 +516,7 @@ control:
          {
            $$ = $3;
            if (dialog.ex == NULL)
-             rcparse_warning ("IEDIT requires DIALOGEX");
+             rcparse_warning (_("IEDIT requires DIALOGEX"));
            res_string_to_id (&$$->class, "BEDIT");
          }
        | CHECKBOX
@@ -522,7 +546,7 @@ control:
            if ($11 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $11;
              }
          }
@@ -531,10 +555,34 @@ control:
          {
            $$ = define_control ($2, $3, $6, $7, $8, $9, $4, style, $10);
            if (dialog.ex == NULL)
-             rcparse_warning ("help ID requires DIALOGEX");
+             rcparse_warning (_("help ID requires DIALOGEX"));
            $$->help = $11;
            $$->data = $12;
          }
+       | CONTROL optstringc numexpr ',' QUOTEDSTRING control_styleexpr
+           cnumexpr cnumexpr cnumexpr cnumexpr optcnumexpr opt_control_data
+         {
+           $$ = define_control ($2, $3, $7, $8, $9, $10, 0, style, $11);
+           if ($12 != NULL)
+             {
+               if (dialog.ex == NULL)
+                 rcparse_warning ("control data requires DIALOGEX");
+               $$->data = $12;
+             }
+           $$->class.named = 1;
+           unicode_from_ascii(&$$->class.u.n.length, &$$->class.u.n.name, $5);
+         }
+       | CONTROL optstringc numexpr ',' QUOTEDSTRING control_styleexpr
+           cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr cnumexpr opt_control_data
+         {
+           $$ = define_control ($2, $3, $7, $8, $9, $10, 0, style, $11);
+           if (dialog.ex == NULL)
+             rcparse_warning ("help ID requires DIALOGEX");
+           $$->help = $12;
+           $$->data = $13;
+           $$->class.named = 1;
+           unicode_from_ascii(&$$->class.u.n.length, &$$->class.u.n.name, $5);
+         }
        | CTEXT
            {
              default_style = SS_CENTER | WS_GROUP;
@@ -585,7 +633,7 @@ control:
          {
            $$ = $3;
            if (dialog.ex == NULL)
-             rcparse_warning ("IEDIT requires DIALOGEX");
+             rcparse_warning (_("IEDIT requires DIALOGEX"));
            res_string_to_id (&$$->class, "HEDIT");
          }
        | ICON optstringc numexpr cnumexpr cnumexpr opt_control_data
@@ -595,7 +643,7 @@ control:
            if ($6 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $6;
              }
          }
@@ -607,7 +655,7 @@ control:
            if ($10 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $10;
              }
          }
@@ -617,7 +665,7 @@ control:
            $$ = define_control ($2, $3, $4, $5, $6, $7, CTL_STATIC,
                                 style, $9);
            if (dialog.ex == NULL)
-             rcparse_warning ("help ID requires DIALOGEX");
+             rcparse_warning (_("help ID requires DIALOGEX"));
            $$->help = $10;
            $$->data = $11;
          }
@@ -631,7 +679,7 @@ control:
          {
            $$ = $3;
            if (dialog.ex == NULL)
-             rcparse_warning ("IEDIT requires DIALOGEX");
+             rcparse_warning (_("IEDIT requires DIALOGEX"));
            res_string_to_id (&$$->class, "IEDIT");
          }
        | LISTBOX
@@ -716,7 +764,7 @@ control:
          }
        | USERBUTTON QUOTEDSTRING ',' numexpr ',' numexpr ',' numexpr ','
            numexpr ',' numexpr ',' 
-           { style = WS_CHILD | WS_VISIBLE }
+           { style = WS_CHILD | WS_VISIBLE; }
            styleexpr optcnumexpr
          {
            $$ = define_control ($2, $4, $6, $8, $10, $12, CTL_BUTTON,
@@ -740,7 +788,7 @@ control_params:
            if ($7 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $7;
              }
          }
@@ -751,7 +799,7 @@ control_params:
            if ($9 != NULL)
              {
                if (dialog.ex == NULL)
-                 rcparse_warning ("control data requires DIALOGEX");
+                 rcparse_warning (_("control data requires DIALOGEX"));
                $$->data = $9;
              }
          }
@@ -760,7 +808,7 @@ control_params:
          {
            $$ = define_control ($1, $2, $3, $4, $5, $6, class, style, $8);
            if (dialog.ex == NULL)
-             rcparse_warning ("help ID requires DIALOGEX");
+             rcparse_warning (_("help ID requires DIALOGEX"));
            $$->help = $9;
            $$->data = $10;
          }
@@ -966,6 +1014,10 @@ menuexitem:
          {
            $$ = define_menuitem ($2, $3, $4, $5, 0, NULL);
          }
+       | MENUITEM SEPARATOR
+         {
+           $$ = define_menuitem (NULL, 0, 0, 0, 0, NULL);
+         }
        | POPUP QUOTEDSTRING BEG menuexitems END
          {
            $$ = define_menuitem ($2, 0, 0, 0, 0, $4);
@@ -1213,8 +1265,8 @@ id:
            /* It seems that resource ID's are forced to upper case.  */
            copy = xstrdup ($1);
            for (s = copy; *s != '\0'; s++)
-             if (islower (*s))
-               *s = toupper (*s);
+             if (islower ((unsigned char) *s))
+               *s = toupper ((unsigned char) *s);
            res_string_to_id (&$$, copy);
            free (copy);
          }
@@ -1247,7 +1299,7 @@ suboptions:
            $$ = $1;
            $$.language = $3 | ($4 << 8);
          }
-       | suboptions VERSION numexpr
+       | suboptions VERSIONK numexpr
          {
            $$ = $1;
            $$.version = $3;
@@ -1280,7 +1332,7 @@ memflags_move:
            $$.language = language;
            $$.memflags = MEMFLAG_MOVEABLE;
          }
-       | memflags_move_discard memflag
+       | memflags_move memflag
          {
            $$ = $1;
            $$.memflags |= $2.on;
This page took 0.029264 seconds and 4 git commands to generate.