gram.y revision c2535118
13e747e6dSmrg/*****************************************************************************/
23e747e6dSmrg/*
33e747e6dSmrg
43e747e6dSmrgCopyright 1989, 1998  The Open Group
53e747e6dSmrg
63e747e6dSmrgPermission to use, copy, modify, distribute, and sell this software and its
73e747e6dSmrgdocumentation for any purpose is hereby granted without fee, provided that
83e747e6dSmrgthe above copyright notice appear in all copies and that both that
93e747e6dSmrgcopyright notice and this permission notice appear in supporting
103e747e6dSmrgdocumentation.
113e747e6dSmrg
123e747e6dSmrgThe above copyright notice and this permission notice shall be included in
133e747e6dSmrgall copies or substantial portions of the Software.
143e747e6dSmrg
153e747e6dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
163e747e6dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
173e747e6dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
183e747e6dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
193e747e6dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
203e747e6dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
213e747e6dSmrg
223e747e6dSmrgExcept as contained in this notice, the name of The Open Group shall not be
233e747e6dSmrgused in advertising or otherwise to promote the sale, use or other dealings
243e747e6dSmrgin this Software without prior written authorization from The Open Group.
253e747e6dSmrg
263e747e6dSmrg*/
273e747e6dSmrg/**       Copyright 1988 by Evans & Sutherland Computer Corporation,        **/
283e747e6dSmrg/**                          Salt Lake City, Utah                           **/
293e747e6dSmrg/**                        Cambridge, Massachusetts                         **/
303e747e6dSmrg/**                                                                         **/
313e747e6dSmrg/**                           All Rights Reserved                           **/
323e747e6dSmrg/**                                                                         **/
333e747e6dSmrg/**    Permission to use, copy, modify, and distribute this software and    **/
343e747e6dSmrg/**    its documentation  for  any  purpose  and  without  fee is hereby    **/
353e747e6dSmrg/**    granted, provided that the above copyright notice appear  in  all    **/
363e747e6dSmrg/**    copies and that both  that  copyright  notice  and  this  permis-    **/
373e747e6dSmrg/**    sion  notice appear in supporting  documentation,  and  that  the    **/
383e747e6dSmrg/**    name of Evans & Sutherland not be used in advertising    **/
393e747e6dSmrg/**    in publicity pertaining to distribution of the  software  without    **/
403e747e6dSmrg/**    specific, written prior permission.                                  **/
413e747e6dSmrg/**                                                                         **/
423e747e6dSmrg/**    EVANS & SUTHERLAND DISCLAIMs ALL WARRANTIES WITH REGARD    **/
433e747e6dSmrg/**    TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES  OF  MERCHANT-    **/
443e747e6dSmrg/**    ABILITY  AND  FITNESS,  IN  NO  EVENT SHALL EVANS & SUTHERLAND    **/
453e747e6dSmrg/**    BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL  DAM-    **/
463e747e6dSmrg/**    AGES OR  ANY DAMAGES WHATSOEVER  RESULTING FROM LOSS OF USE, DATA    **/
473e747e6dSmrg/**    OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER    **/
483e747e6dSmrg/**    TORTIOUS ACTION, ARISING OUT OF OR IN  CONNECTION  WITH  THE  USE    **/
493e747e6dSmrg/**    OR PERFORMANCE OF THIS SOFTWARE.                                     **/
503e747e6dSmrg/*****************************************************************************/
513e747e6dSmrg
523e747e6dSmrg
533e747e6dSmrg/***********************************************************************
543e747e6dSmrg *
553e747e6dSmrg * $Xorg: gram.y,v 1.4 2001/02/09 02:05:36 xorgcvs Exp $
563e747e6dSmrg *
573e747e6dSmrg * .twmrc command grammer
583e747e6dSmrg *
593e747e6dSmrg * 07-Jan-86 Thomas E. LaStrange	File created
603e747e6dSmrg * 11-Nov-90 Dave Sternlicht            Adding SaveColors
613e747e6dSmrg * 10-Oct-90 David M. Sternlicht        Storing saved colors on root
623e747e6dSmrg *
633e747e6dSmrg * $XFree86: xc/programs/twm/gram.y,v 3.8 2002/10/16 21:33:03 tsi Exp $
643e747e6dSmrg *
653e747e6dSmrg ***********************************************************************/
663e747e6dSmrg
673e747e6dSmrg%{
683e747e6dSmrg#include <stdio.h>
693e747e6dSmrg#include <ctype.h>
703e747e6dSmrg#include "twm.h"
713e747e6dSmrg#include "menus.h"
723e747e6dSmrg#include "list.h"
733e747e6dSmrg#include "util.h"
743e747e6dSmrg#include "screen.h"
753e747e6dSmrg#include "parse.h"
763e747e6dSmrg#include "add_window.h"
773e747e6dSmrg#include "icons.h"
783e747e6dSmrg#include <X11/Xos.h>
793e747e6dSmrg#include <X11/Xmu/CharSet.h>
803e747e6dSmrg
813e747e6dSmrgstatic char *Action = "";
823e747e6dSmrgstatic char *Name = "";
833e747e6dSmrgstatic MenuRoot	*root, *pull = NULL;
843e747e6dSmrg
85c2535118Smrgstatic MenuRoot *GetRoot ( const char *name, const char *fore, const char *back );
863e747e6dSmrgstatic void GotButton ( int butt, int func );
873e747e6dSmrgstatic void GotKey ( char *key, int func );
883e747e6dSmrgstatic void GotTitleButton ( char *bitmapname, int func, Bool rightside );
893e747e6dSmrgstatic Bool CheckWarpScreenArg ( char *s );
903e747e6dSmrgstatic Bool CheckWarpRingArg ( char *s );
913e747e6dSmrgstatic Bool CheckColormapArg ( char *s );
92c2535118Smrgstatic void RemoveDQuote ( char *str );
933e747e6dSmrg
943e747e6dSmrgstatic char *ptr;
953e747e6dSmrgstatic name_list **list;
963e747e6dSmrgstatic int cont = 0;
973e747e6dSmrgstatic int color;
983e747e6dSmrgint mods = 0;
993e747e6dSmrgunsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask);
1003e747e6dSmrg
1013e747e6dSmrgextern int yylineno;
102c2535118Smrgstatic void yyerror ( const char *s );
103c2535118Smrg
1043e747e6dSmrg%}
1053e747e6dSmrg
1063e747e6dSmrg%union
1073e747e6dSmrg{
1083e747e6dSmrg    int num;
1093e747e6dSmrg    char *ptr;
1103e747e6dSmrg};
1113e747e6dSmrg
1123e747e6dSmrg%token <num> LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS
113c2535118Smrg%token <num> ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION
1143e747e6dSmrg%token <num> ICONMGR_SHOW ICONMGR WINDOW_FUNCTION ZOOM ICONMGRS
1153e747e6dSmrg%token <num> ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE GRAYSCALE
116c2535118Smrg%token <num> ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING
117c2535118Smrg%token <num> NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION
118c2535118Smrg%token <num> META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME
1193e747e6dSmrg%token <num> COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE
1203e747e6dSmrg%token <num> START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE
121c2535118Smrg%token <num> MOVE RESIZE WAIT SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON
122c2535118Smrg%token <num> NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD
1233e747e6dSmrg%token <num> SKEYWORD DKEYWORD JKEYWORD WINDOW_RING WARP_CURSOR ERRORTOKEN
1243e747e6dSmrg%token <num> NO_STACKMODE
125c2535118Smrg%token <ptr> STRING
1263e747e6dSmrg
1273e747e6dSmrg%type <ptr> string
1283e747e6dSmrg%type <num> pixmap_list cursor_list color_list save_color_list stmt
1293e747e6dSmrg%type <num> win_color_list iconm_list win_list icon_list function menu
1303e747e6dSmrg%type <num> noarg sarg error narg squeeze color_entry
1313e747e6dSmrg%type <num> action button number signed_number full fullkey
1323e747e6dSmrg
133c2535118Smrg%start twmrc
1343e747e6dSmrg
1353e747e6dSmrg%%
1363e747e6dSmrgtwmrc		: stmts
1373e747e6dSmrg		;
1383e747e6dSmrg
1393e747e6dSmrgstmts		: /* Empty */
1403e747e6dSmrg		| stmts stmt
1413e747e6dSmrg		;
1423e747e6dSmrg
1433e747e6dSmrgstmt		: error
1443e747e6dSmrg		| noarg
1453e747e6dSmrg		| sarg
1463e747e6dSmrg		| narg
1473e747e6dSmrg		| squeeze
1483e747e6dSmrg		| ICON_REGION string DKEYWORD DKEYWORD number number
1493e747e6dSmrg					{ AddIconRegion($2, $3, $4, $5, $6); }
1503e747e6dSmrg		| ICONMGR_GEOMETRY string number	{ if (Scr->FirstTime)
1513e747e6dSmrg						  {
1523e747e6dSmrg						    Scr->iconmgr.geometry=$2;
1533e747e6dSmrg						    Scr->iconmgr.columns=$3;
1543e747e6dSmrg						  }
1553e747e6dSmrg						}
1563e747e6dSmrg		| ICONMGR_GEOMETRY string	{ if (Scr->FirstTime)
1573e747e6dSmrg						    Scr->iconmgr.geometry = $2;
1583e747e6dSmrg						}
1593e747e6dSmrg		| ZOOM number		{ if (Scr->FirstTime)
1603e747e6dSmrg					  {
1613e747e6dSmrg						Scr->DoZoom = TRUE;
1623e747e6dSmrg						Scr->ZoomCount = $2;
1633e747e6dSmrg					  }
1643e747e6dSmrg					}
165c2535118Smrg		| ZOOM			{ if (Scr->FirstTime)
1663e747e6dSmrg						Scr->DoZoom = TRUE; }
1673e747e6dSmrg		| PIXMAPS pixmap_list	{}
1683e747e6dSmrg		| CURSORS cursor_list	{}
1693e747e6dSmrg		| ICONIFY_BY_UNMAPPING	{ list = &Scr->IconifyByUn; }
1703e747e6dSmrg		  win_list
171c2535118Smrg		| ICONIFY_BY_UNMAPPING	{ if (Scr->FirstTime)
1723e747e6dSmrg		    Scr->IconifyByUnmapping = TRUE; }
173c2535118Smrg		| LEFT_TITLEBUTTON string EQUALS action {
1743e747e6dSmrg					  GotTitleButton ($2, $4, False);
1753e747e6dSmrg					}
176c2535118Smrg		| RIGHT_TITLEBUTTON string EQUALS action {
1773e747e6dSmrg					  GotTitleButton ($2, $4, True);
1783e747e6dSmrg					}
1793e747e6dSmrg		| button string		{ root = GetRoot($2, NULLSTR, NULLSTR);
1803e747e6dSmrg					  Scr->Mouse[$1][C_ROOT][0].func = F_MENU;
1813e747e6dSmrg					  Scr->Mouse[$1][C_ROOT][0].menu = root;
1823e747e6dSmrg					}
1833e747e6dSmrg		| button action		{ Scr->Mouse[$1][C_ROOT][0].func = $2;
1843e747e6dSmrg					  if ($2 == F_MENU)
1853e747e6dSmrg					  {
1863e747e6dSmrg					    pull->prev = NULL;
1873e747e6dSmrg					    Scr->Mouse[$1][C_ROOT][0].menu = pull;
1883e747e6dSmrg					  }
1893e747e6dSmrg					  else
1903e747e6dSmrg					  {
1913e747e6dSmrg					    root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
192c2535118Smrg					    Scr->Mouse[$1][C_ROOT][0].item =
1933e747e6dSmrg						AddToMenu(root,"x",Action,
1943e747e6dSmrg							  NULL,$2,NULLSTR,NULLSTR);
1953e747e6dSmrg					  }
1963e747e6dSmrg					  Action = "";
1973e747e6dSmrg					  pull = NULL;
1983e747e6dSmrg					}
1993e747e6dSmrg		| string fullkey	{ GotKey($1, $2); }
2003e747e6dSmrg		| button full		{ GotButton($1, $2); }
2013e747e6dSmrg		| DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; }
2023e747e6dSmrg		  win_list
2033e747e6dSmrg		| ICONMGR_NOSHOW	{ list = &Scr->IconMgrNoShow; }
2043e747e6dSmrg		  win_list
2053e747e6dSmrg		| ICONMGR_NOSHOW	{ Scr->IconManagerDontShow = TRUE; }
2063e747e6dSmrg		| ICONMGRS		{ list = &Scr->IconMgrs; }
2073e747e6dSmrg		  iconm_list
2083e747e6dSmrg		| ICONMGR_SHOW		{ list = &Scr->IconMgrShow; }
2093e747e6dSmrg		  win_list
2103e747e6dSmrg		| NO_TITLE_HILITE	{ list = &Scr->NoTitleHighlight; }
2113e747e6dSmrg		  win_list
2123e747e6dSmrg		| NO_TITLE_HILITE	{ if (Scr->FirstTime)
2133e747e6dSmrg						Scr->TitleHighlight = FALSE; }
2143e747e6dSmrg		| NO_HILITE		{ list = &Scr->NoHighlight; }
2153e747e6dSmrg		  win_list
2163e747e6dSmrg		| NO_HILITE		{ if (Scr->FirstTime)
2173e747e6dSmrg						Scr->Highlight = FALSE; }
2183e747e6dSmrg		| NO_STACKMODE		{ list = &Scr->NoStackModeL; }
2193e747e6dSmrg		  win_list
2203e747e6dSmrg		| NO_STACKMODE		{ if (Scr->FirstTime)
2213e747e6dSmrg						Scr->StackMode = FALSE; }
2223e747e6dSmrg		| NO_TITLE		{ list = &Scr->NoTitle; }
2233e747e6dSmrg		  win_list
2243e747e6dSmrg		| NO_TITLE		{ if (Scr->FirstTime)
2253e747e6dSmrg						Scr->NoTitlebar = TRUE; }
2263e747e6dSmrg		| MAKE_TITLE		{ list = &Scr->MakeTitle; }
2273e747e6dSmrg		  win_list
2283e747e6dSmrg		| START_ICONIFIED	{ list = &Scr->StartIconified; }
2293e747e6dSmrg		  win_list
2303e747e6dSmrg		| AUTO_RAISE		{ list = &Scr->AutoRaise; }
2313e747e6dSmrg		  win_list
2323e747e6dSmrg		| MENU string LP string COLON string RP	{
2333e747e6dSmrg					root = GetRoot($2, $4, $6); }
2343e747e6dSmrg		  menu			{ root->real_menu = TRUE;}
2353e747e6dSmrg		| MENU string 		{ root = GetRoot($2, NULLSTR, NULLSTR); }
2363e747e6dSmrg		  menu			{ root->real_menu = TRUE; }
2373e747e6dSmrg		| FUNCTION string	{ root = GetRoot($2, NULLSTR, NULLSTR); }
2383e747e6dSmrg		  function
2393e747e6dSmrg		| ICONS 		{ list = &Scr->IconNames; }
2403e747e6dSmrg		  icon_list
2413e747e6dSmrg		| COLOR 		{ color = COLOR; }
2423e747e6dSmrg		  color_list
2433e747e6dSmrg		| GRAYSCALE 		{ color = GRAYSCALE; }
2443e747e6dSmrg  		  color_list
245c2535118Smrg		| SAVECOLOR
2463e747e6dSmrg                  save_color_list
2473e747e6dSmrg		| MONOCHROME 		{ color = MONOCHROME; }
2483e747e6dSmrg	          color_list
2493e747e6dSmrg		| DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2;
2503e747e6dSmrg					  if ($2 == F_MENU)
2513e747e6dSmrg					  {
2523e747e6dSmrg					    pull->prev = NULL;
2533e747e6dSmrg					    Scr->DefaultFunction.menu = pull;
2543e747e6dSmrg					  }
2553e747e6dSmrg					  else
2563e747e6dSmrg					  {
2573e747e6dSmrg					    root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
258c2535118Smrg					    Scr->DefaultFunction.item =
2593e747e6dSmrg						AddToMenu(root,"x",Action,
2603e747e6dSmrg							  NULL,$2, NULLSTR, NULLSTR);
2613e747e6dSmrg					  }
2623e747e6dSmrg					  Action = "";
2633e747e6dSmrg					  pull = NULL;
2643e747e6dSmrg					}
2653e747e6dSmrg		| WINDOW_FUNCTION action { Scr->WindowFunction.func = $2;
2663e747e6dSmrg					   root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR);
267c2535118Smrg					   Scr->WindowFunction.item =
2683e747e6dSmrg						AddToMenu(root,"x",Action,
2693e747e6dSmrg							  NULL,$2, NULLSTR, NULLSTR);
2703e747e6dSmrg					   Action = "";
2713e747e6dSmrg					   pull = NULL;
2723e747e6dSmrg					}
2733e747e6dSmrg		| WARP_CURSOR		{ list = &Scr->WarpCursorL; }
2743e747e6dSmrg		  win_list
275c2535118Smrg		| WARP_CURSOR		{ if (Scr->FirstTime)
2763e747e6dSmrg					    Scr->WarpCursor = TRUE; }
2773e747e6dSmrg		| WINDOW_RING		{ list = &Scr->WindowRingL; }
2783e747e6dSmrg		  win_list
2793e747e6dSmrg		;
2803e747e6dSmrg
2813e747e6dSmrg
2823e747e6dSmrgnoarg		: KEYWORD		{ if (!do_single_keyword ($1)) {
2833e747e6dSmrg					    twmrc_error_prefix();
2843e747e6dSmrg					    fprintf (stderr,
2853e747e6dSmrg					"unknown singleton keyword %d\n",
2863e747e6dSmrg						     $1);
2873e747e6dSmrg					    ParseError = 1;
2883e747e6dSmrg					  }
2893e747e6dSmrg					}
2903e747e6dSmrg		;
2913e747e6dSmrg
2923e747e6dSmrgsarg		: SKEYWORD string	{ if (!do_string_keyword ($1, $2)) {
2933e747e6dSmrg					    twmrc_error_prefix();
2943e747e6dSmrg					    fprintf (stderr,
2953e747e6dSmrg				"unknown string keyword %d (value \"%s\")\n",
2963e747e6dSmrg						     $1, $2);
2973e747e6dSmrg					    ParseError = 1;
2983e747e6dSmrg					  }
2993e747e6dSmrg					}
3003e747e6dSmrg		;
3013e747e6dSmrg
3023e747e6dSmrgnarg		: NKEYWORD number	{ if (!do_number_keyword ($1, $2)) {
3033e747e6dSmrg					    twmrc_error_prefix();
3043e747e6dSmrg					    fprintf (stderr,
3053e747e6dSmrg				"unknown numeric keyword %d (value %d)\n",
3063e747e6dSmrg						     $1, $2);
3073e747e6dSmrg					    ParseError = 1;
3083e747e6dSmrg					  }
3093e747e6dSmrg					}
3103e747e6dSmrg		;
3113e747e6dSmrg
3123e747e6dSmrg
3133e747e6dSmrg
3143e747e6dSmrgfull		: EQUALS keys COLON contexts COLON action  { $$ = $6; }
3153e747e6dSmrg		;
3163e747e6dSmrg
3173e747e6dSmrgfullkey		: EQUALS keys COLON contextkeys COLON action  { $$ = $6; }
3183e747e6dSmrg		;
3193e747e6dSmrg
3203e747e6dSmrgkeys		: /* Empty */
3213e747e6dSmrg		| keys key
3223e747e6dSmrg		;
3233e747e6dSmrg
3243e747e6dSmrgkey		: META			{ mods |= Mod1Mask; }
3253e747e6dSmrg		| SHIFT			{ mods |= ShiftMask; }
3263e747e6dSmrg		| LOCK			{ mods |= LockMask; }
3273e747e6dSmrg		| CONTROL		{ mods |= ControlMask; }
3283e747e6dSmrg		| META number		{ if ($2 < 1 || $2 > 5) {
3293e747e6dSmrg					     twmrc_error_prefix();
330c2535118Smrg					     fprintf (stderr,
3313e747e6dSmrg				"bad modifier number (%d), must be 1-5\n",
3323e747e6dSmrg						      $2);
3333e747e6dSmrg					     ParseError = 1;
3343e747e6dSmrg					  } else {
3353e747e6dSmrg					     mods |= (Mod1Mask << ($2 - 1));
3363e747e6dSmrg					  }
3373e747e6dSmrg					}
3383e747e6dSmrg		| OR			{ }
3393e747e6dSmrg		;
3403e747e6dSmrg
3413e747e6dSmrgcontexts	: /* Empty */
3423e747e6dSmrg		| contexts context
3433e747e6dSmrg		;
3443e747e6dSmrg
3453e747e6dSmrgcontext		: WINDOW		{ cont |= C_WINDOW_BIT; }
3463e747e6dSmrg		| TITLE			{ cont |= C_TITLE_BIT; }
3473e747e6dSmrg		| ICON			{ cont |= C_ICON_BIT; }
3483e747e6dSmrg		| ROOT			{ cont |= C_ROOT_BIT; }
3493e747e6dSmrg		| FRAME			{ cont |= C_FRAME_BIT; }
3503e747e6dSmrg		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
3513e747e6dSmrg		| META			{ cont |= C_ICONMGR_BIT; }
3523e747e6dSmrg		| ALL			{ cont |= C_ALL_BITS; }
3533e747e6dSmrg		| OR			{  }
3543e747e6dSmrg		;
3553e747e6dSmrg
3563e747e6dSmrgcontextkeys	: /* Empty */
3573e747e6dSmrg		| contextkeys contextkey
3583e747e6dSmrg		;
3593e747e6dSmrg
3603e747e6dSmrgcontextkey	: WINDOW		{ cont |= C_WINDOW_BIT; }
3613e747e6dSmrg		| TITLE			{ cont |= C_TITLE_BIT; }
3623e747e6dSmrg		| ICON			{ cont |= C_ICON_BIT; }
3633e747e6dSmrg		| ROOT			{ cont |= C_ROOT_BIT; }
3643e747e6dSmrg		| FRAME			{ cont |= C_FRAME_BIT; }
3653e747e6dSmrg		| ICONMGR		{ cont |= C_ICONMGR_BIT; }
3663e747e6dSmrg		| META			{ cont |= C_ICONMGR_BIT; }
3673e747e6dSmrg		| ALL			{ cont |= C_ALL_BITS; }
3683e747e6dSmrg		| OR			{ }
3693e747e6dSmrg		| string		{ Name = $1; cont |= C_NAME_BIT; }
3703e747e6dSmrg		;
3713e747e6dSmrg
3723e747e6dSmrg
3733e747e6dSmrgpixmap_list	: LB pixmap_entries RB
3743e747e6dSmrg		;
3753e747e6dSmrg
3763e747e6dSmrgpixmap_entries	: /* Empty */
3773e747e6dSmrg		| pixmap_entries pixmap_entry
3783e747e6dSmrg		;
3793e747e6dSmrg
3803e747e6dSmrgpixmap_entry	: TITLE_HILITE string { SetHighlightPixmap ($2); }
3813e747e6dSmrg		;
3823e747e6dSmrg
3833e747e6dSmrg
3843e747e6dSmrgcursor_list	: LB cursor_entries RB
3853e747e6dSmrg		;
3863e747e6dSmrg
3873e747e6dSmrgcursor_entries	: /* Empty */
3883e747e6dSmrg		| cursor_entries cursor_entry
3893e747e6dSmrg		;
3903e747e6dSmrg
3913e747e6dSmrgcursor_entry	: FRAME string string {
3923e747e6dSmrg			NewBitmapCursor(&Scr->FrameCursor, $2, $3); }
3933e747e6dSmrg		| FRAME string	{
3943e747e6dSmrg			NewFontCursor(&Scr->FrameCursor, $2); }
3953e747e6dSmrg		| TITLE string string {
3963e747e6dSmrg			NewBitmapCursor(&Scr->TitleCursor, $2, $3); }
3973e747e6dSmrg		| TITLE string {
3983e747e6dSmrg			NewFontCursor(&Scr->TitleCursor, $2); }
3993e747e6dSmrg		| ICON string string {
4003e747e6dSmrg			NewBitmapCursor(&Scr->IconCursor, $2, $3); }
4013e747e6dSmrg		| ICON string {
4023e747e6dSmrg			NewFontCursor(&Scr->IconCursor, $2); }
4033e747e6dSmrg		| ICONMGR string string {
4043e747e6dSmrg			NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); }
4053e747e6dSmrg		| ICONMGR string {
4063e747e6dSmrg			NewFontCursor(&Scr->IconMgrCursor, $2); }
4073e747e6dSmrg		| BUTTON string string {
4083e747e6dSmrg			NewBitmapCursor(&Scr->ButtonCursor, $2, $3); }
4093e747e6dSmrg		| BUTTON string {
4103e747e6dSmrg			NewFontCursor(&Scr->ButtonCursor, $2); }
4113e747e6dSmrg		| MOVE string string {
4123e747e6dSmrg			NewBitmapCursor(&Scr->MoveCursor, $2, $3); }
4133e747e6dSmrg		| MOVE string {
4143e747e6dSmrg			NewFontCursor(&Scr->MoveCursor, $2); }
4153e747e6dSmrg		| RESIZE string string {
4163e747e6dSmrg			NewBitmapCursor(&Scr->ResizeCursor, $2, $3); }
4173e747e6dSmrg		| RESIZE string {
4183e747e6dSmrg			NewFontCursor(&Scr->ResizeCursor, $2); }
4193e747e6dSmrg		| WAIT string string {
4203e747e6dSmrg			NewBitmapCursor(&Scr->WaitCursor, $2, $3); }
4213e747e6dSmrg		| WAIT string {
4223e747e6dSmrg			NewFontCursor(&Scr->WaitCursor, $2); }
4233e747e6dSmrg		| MENU string string {
4243e747e6dSmrg			NewBitmapCursor(&Scr->MenuCursor, $2, $3); }
4253e747e6dSmrg		| MENU string {
4263e747e6dSmrg			NewFontCursor(&Scr->MenuCursor, $2); }
4273e747e6dSmrg		| SELECT string string {
4283e747e6dSmrg			NewBitmapCursor(&Scr->SelectCursor, $2, $3); }
4293e747e6dSmrg		| SELECT string {
4303e747e6dSmrg			NewFontCursor(&Scr->SelectCursor, $2); }
4313e747e6dSmrg		| KILL string string {
4323e747e6dSmrg			NewBitmapCursor(&Scr->DestroyCursor, $2, $3); }
4333e747e6dSmrg		| KILL string {
4343e747e6dSmrg			NewFontCursor(&Scr->DestroyCursor, $2); }
4353e747e6dSmrg		;
4363e747e6dSmrg
4373e747e6dSmrgcolor_list	: LB color_entries RB
4383e747e6dSmrg		;
4393e747e6dSmrg
4403e747e6dSmrg
4413e747e6dSmrgcolor_entries	: /* Empty */
4423e747e6dSmrg		| color_entries color_entry
4433e747e6dSmrg		;
4443e747e6dSmrg
4453e747e6dSmrgcolor_entry	: CLKEYWORD string	{ if (!do_colorlist_keyword ($1, color,
4463e747e6dSmrg								     $2)) {
4473e747e6dSmrg					    twmrc_error_prefix();
4483e747e6dSmrg					    fprintf (stderr,
4493e747e6dSmrg			"unhandled list color keyword %d (string \"%s\")\n",
4503e747e6dSmrg						     $1, $2);
4513e747e6dSmrg					    ParseError = 1;
4523e747e6dSmrg					  }
4533e747e6dSmrg					}
4543e747e6dSmrg		| CLKEYWORD string	{ list = do_colorlist_keyword($1,color,
4553e747e6dSmrg								      $2);
4563e747e6dSmrg					  if (!list) {
4573e747e6dSmrg					    twmrc_error_prefix();
4583e747e6dSmrg					    fprintf (stderr,
4593e747e6dSmrg			"unhandled color list keyword %d (string \"%s\")\n",
4603e747e6dSmrg						     $1, $2);
4613e747e6dSmrg					    ParseError = 1;
4623e747e6dSmrg					  }
4633e747e6dSmrg					}
4643e747e6dSmrg		  win_color_list	{ /* No action */; }
4653e747e6dSmrg		| CKEYWORD string	{ if (!do_color_keyword ($1, color,
4663e747e6dSmrg								 $2)) {
4673e747e6dSmrg					    twmrc_error_prefix();
4683e747e6dSmrg					    fprintf (stderr,
4693e747e6dSmrg			"unhandled color keyword %d (string \"%s\")\n",
4703e747e6dSmrg						     $1, $2);
4713e747e6dSmrg					    ParseError = 1;
4723e747e6dSmrg					  }
4733e747e6dSmrg					}
4743e747e6dSmrg		;
4753e747e6dSmrg
476c2535118Smrgsave_color_list : LB s_color_entries RB
4773e747e6dSmrg                ;
4783e747e6dSmrg
4793e747e6dSmrgs_color_entries : /* Empty */
480c2535118Smrg                | s_color_entries s_color_entry
4813e747e6dSmrg                ;
4823e747e6dSmrg
4833e747e6dSmrgs_color_entry   : string            { do_string_savecolor(color, $1); }
4843e747e6dSmrg                | CLKEYWORD         { do_var_savecolor($1); }
4853e747e6dSmrg                ;
4863e747e6dSmrg
4873e747e6dSmrgwin_color_list	: LB win_color_entries RB
4883e747e6dSmrg		;
4893e747e6dSmrg
4903e747e6dSmrgwin_color_entries	: /* Empty */
4913e747e6dSmrg		| win_color_entries win_color_entry
4923e747e6dSmrg		;
4933e747e6dSmrg
4943e747e6dSmrgwin_color_entry	: string string		{ if (Scr->FirstTime &&
4953e747e6dSmrg					      color == Scr->Monochrome)
4963e747e6dSmrg					    AddToList(list, $1, $2); }
4973e747e6dSmrg		;
4983e747e6dSmrg
499c2535118Smrgsqueeze		: SQUEEZE_TITLE {
5003e747e6dSmrg				    if (HasShape) Scr->SqueezeTitle = TRUE;
5013e747e6dSmrg				}
502c2535118Smrg		| SQUEEZE_TITLE { list = &Scr->SqueezeTitleL;
5033e747e6dSmrg				  if (HasShape && Scr->SqueezeTitle == -1)
5043e747e6dSmrg				    Scr->SqueezeTitle = TRUE;
5053e747e6dSmrg				}
5063e747e6dSmrg		  LB win_sqz_entries RB
5073e747e6dSmrg		| DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; }
5083e747e6dSmrg		| DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; }
5093e747e6dSmrg		  win_list
5103e747e6dSmrg		;
5113e747e6dSmrg
5123e747e6dSmrgwin_sqz_entries	: /* Empty */
5133e747e6dSmrg		| win_sqz_entries string JKEYWORD signed_number number	{
5143e747e6dSmrg				if (Scr->FirstTime) {
5153e747e6dSmrg				   do_squeeze_entry (list, $2, $3, $4, $5);
5163e747e6dSmrg				}
5173e747e6dSmrg			}
5183e747e6dSmrg		;
5193e747e6dSmrg
5203e747e6dSmrg
5213e747e6dSmrgiconm_list	: LB iconm_entries RB
5223e747e6dSmrg		;
5233e747e6dSmrg
5243e747e6dSmrgiconm_entries	: /* Empty */
5253e747e6dSmrg		| iconm_entries iconm_entry
5263e747e6dSmrg		;
5273e747e6dSmrg
5283e747e6dSmrgiconm_entry	: string string number	{ if (Scr->FirstTime)
5293e747e6dSmrg					    AddToList(list, $1, (char *)
5303e747e6dSmrg						AllocateIconManager($1, NULLSTR,
5313e747e6dSmrg							$2,$3));
5323e747e6dSmrg					}
5333e747e6dSmrg		| string string string number
5343e747e6dSmrg					{ if (Scr->FirstTime)
5353e747e6dSmrg					    AddToList(list, $1, (char *)
5363e747e6dSmrg						AllocateIconManager($1,$2,
5373e747e6dSmrg						$3, $4));
5383e747e6dSmrg					}
5393e747e6dSmrg		;
5403e747e6dSmrg
5413e747e6dSmrgwin_list	: LB win_entries RB
5423e747e6dSmrg		;
5433e747e6dSmrg
5443e747e6dSmrgwin_entries	: /* Empty */
5453e747e6dSmrg		| win_entries win_entry
5463e747e6dSmrg		;
5473e747e6dSmrg
5483e747e6dSmrgwin_entry	: string		{ if (Scr->FirstTime)
5493e747e6dSmrg					    AddToList(list, $1, 0);
5503e747e6dSmrg					}
5513e747e6dSmrg		;
5523e747e6dSmrg
5533e747e6dSmrgicon_list	: LB icon_entries RB
5543e747e6dSmrg		;
5553e747e6dSmrg
5563e747e6dSmrgicon_entries	: /* Empty */
5573e747e6dSmrg		| icon_entries icon_entry
5583e747e6dSmrg		;
5593e747e6dSmrg
5603e747e6dSmrgicon_entry	: string string		{ if (Scr->FirstTime) AddToList(list, $1, $2); }
5613e747e6dSmrg		;
5623e747e6dSmrg
5633e747e6dSmrgfunction	: LB function_entries RB
5643e747e6dSmrg		;
5653e747e6dSmrg
5663e747e6dSmrgfunction_entries: /* Empty */
5673e747e6dSmrg		| function_entries function_entry
5683e747e6dSmrg		;
5693e747e6dSmrg
5703e747e6dSmrgfunction_entry	: action		{ AddToMenu(root, "", Action, NULL, $1,
5713e747e6dSmrg						NULLSTR, NULLSTR);
5723e747e6dSmrg					  Action = "";
5733e747e6dSmrg					}
5743e747e6dSmrg		;
5753e747e6dSmrg
5763e747e6dSmrgmenu		: LB menu_entries RB
5773e747e6dSmrg		;
5783e747e6dSmrg
5793e747e6dSmrgmenu_entries	: /* Empty */
5803e747e6dSmrg		| menu_entries menu_entry
5813e747e6dSmrg		;
5823e747e6dSmrg
5833e747e6dSmrgmenu_entry	: string action		{ AddToMenu(root, $1, Action, pull, $2,
5843e747e6dSmrg						NULLSTR, NULLSTR);
5853e747e6dSmrg					  Action = "";
5863e747e6dSmrg					  pull = NULL;
5873e747e6dSmrg					}
5883e747e6dSmrg		| string LP string COLON string RP action {
5893e747e6dSmrg					  AddToMenu(root, $1, Action, pull, $7,
5903e747e6dSmrg						$3, $5);
5913e747e6dSmrg					  Action = "";
5923e747e6dSmrg					  pull = NULL;
5933e747e6dSmrg					}
5943e747e6dSmrg		;
5953e747e6dSmrg
5963e747e6dSmrgaction		: FKEYWORD	{ $$ = $1; }
5973e747e6dSmrg		| FSKEYWORD string {
5983e747e6dSmrg				$$ = $1;
5993e747e6dSmrg				Action = $2;
6003e747e6dSmrg				switch ($1) {
6013e747e6dSmrg				  case F_MENU:
6023e747e6dSmrg				    pull = GetRoot ($2, NULLSTR,NULLSTR);
6033e747e6dSmrg				    pull->prev = root;
6043e747e6dSmrg				    break;
6053e747e6dSmrg				  case F_WARPRING:
6063e747e6dSmrg				    if (!CheckWarpRingArg (Action)) {
6073e747e6dSmrg					twmrc_error_prefix();
6083e747e6dSmrg					fprintf (stderr,
6093e747e6dSmrg			"ignoring invalid f.warptoring argument \"%s\"\n",
6103e747e6dSmrg						 Action);
6113e747e6dSmrg					$$ = F_NOP;
6123e747e6dSmrg				    }
6133e747e6dSmrg				  case F_WARPTOSCREEN:
6143e747e6dSmrg				    if (!CheckWarpScreenArg (Action)) {
6153e747e6dSmrg					twmrc_error_prefix();
616c2535118Smrg					fprintf (stderr,
617c2535118Smrg			"ignoring invalid f.warptoscreen argument \"%s\"\n",
6183e747e6dSmrg					         Action);
6193e747e6dSmrg					$$ = F_NOP;
6203e747e6dSmrg				    }
6213e747e6dSmrg				    break;
6223e747e6dSmrg				  case F_COLORMAP:
6233e747e6dSmrg				    if (CheckColormapArg (Action)) {
6243e747e6dSmrg					$$ = F_COLORMAP;
6253e747e6dSmrg				    } else {
6263e747e6dSmrg					twmrc_error_prefix();
6273e747e6dSmrg					fprintf (stderr,
628c2535118Smrg			"ignoring invalid f.colormap argument \"%s\"\n",
6293e747e6dSmrg						 Action);
6303e747e6dSmrg					$$ = F_NOP;
6313e747e6dSmrg				    }
6323e747e6dSmrg				    break;
6333e747e6dSmrg				} /* end switch */
6343e747e6dSmrg				   }
6353e747e6dSmrg		;
6363e747e6dSmrg
6373e747e6dSmrg
6383e747e6dSmrgsigned_number	: number		{ $$ = $1; }
6393e747e6dSmrg		| PLUS number		{ $$ = $2; }
6403e747e6dSmrg		| MINUS number		{ $$ = -($2); }
6413e747e6dSmrg		;
6423e747e6dSmrg
6433e747e6dSmrgbutton		: BUTTON number		{ $$ = $2;
6443e747e6dSmrg					  if ($2 == 0)
6453e747e6dSmrg						yyerror("bad button 0");
6463e747e6dSmrg
6473e747e6dSmrg					  if ($2 > MAX_BUTTONS)
6483e747e6dSmrg					  {
6493e747e6dSmrg						$$ = 0;
6503e747e6dSmrg						yyerror("button number too large");
6513e747e6dSmrg					  }
6523e747e6dSmrg					}
6533e747e6dSmrg		;
6543e747e6dSmrg
655c2535118Smrgstring		: STRING		{ ptr = strdup($1);
6563e747e6dSmrg					  RemoveDQuote(ptr);
6573e747e6dSmrg					  $$ = ptr;
6583e747e6dSmrg					}
6593e747e6dSmrg		;
6603e747e6dSmrgnumber		: NUMBER		{ $$ = $1; }
6613e747e6dSmrg		;
6623e747e6dSmrg
6633e747e6dSmrg%%
664c2535118Smrgstatic void
665c2535118Smrgyyerror(const char *s)
6663e747e6dSmrg{
6673e747e6dSmrg    twmrc_error_prefix();
6683e747e6dSmrg    fprintf (stderr, "error in input file:  %s\n", s ? s : "");
6693e747e6dSmrg    ParseError = 1;
6703e747e6dSmrg}
6713e747e6dSmrg
672c2535118Smrgstatic void
6733e747e6dSmrgRemoveDQuote(char *str)
6743e747e6dSmrg{
6753e747e6dSmrg    register char *i, *o;
6763e747e6dSmrg    register int n;
6773e747e6dSmrg    register int count;
6783e747e6dSmrg
6793e747e6dSmrg    for (i=str+1, o=str; *i && *i != '\"'; o++)
6803e747e6dSmrg    {
6813e747e6dSmrg	if (*i == '\\')
6823e747e6dSmrg	{
6833e747e6dSmrg	    switch (*++i)
6843e747e6dSmrg	    {
6853e747e6dSmrg	    case 'n':
6863e747e6dSmrg		*o = '\n';
6873e747e6dSmrg		i++;
6883e747e6dSmrg		break;
6893e747e6dSmrg	    case 'b':
6903e747e6dSmrg		*o = '\b';
6913e747e6dSmrg		i++;
6923e747e6dSmrg		break;
6933e747e6dSmrg	    case 'r':
6943e747e6dSmrg		*o = '\r';
6953e747e6dSmrg		i++;
6963e747e6dSmrg		break;
6973e747e6dSmrg	    case 't':
6983e747e6dSmrg		*o = '\t';
6993e747e6dSmrg		i++;
7003e747e6dSmrg		break;
7013e747e6dSmrg	    case 'f':
7023e747e6dSmrg		*o = '\f';
7033e747e6dSmrg		i++;
7043e747e6dSmrg		break;
7053e747e6dSmrg	    case '0':
7063e747e6dSmrg		if (*++i == 'x')
7073e747e6dSmrg		    goto hex;
7083e747e6dSmrg		else
7093e747e6dSmrg		    --i;
7103e747e6dSmrg	    case '1': case '2': case '3':
7113e747e6dSmrg	    case '4': case '5': case '6': case '7':
7123e747e6dSmrg		n = 0;
7133e747e6dSmrg		count = 0;
7143e747e6dSmrg		while (*i >= '0' && *i <= '7' && count < 3)
7153e747e6dSmrg		{
7163e747e6dSmrg		    n = (n<<3) + (*i++ - '0');
7173e747e6dSmrg		    count++;
7183e747e6dSmrg		}
7193e747e6dSmrg		*o = n;
7203e747e6dSmrg		break;
7213e747e6dSmrg	    hex:
7223e747e6dSmrg	    case 'x':
7233e747e6dSmrg		n = 0;
7243e747e6dSmrg		count = 0;
7253e747e6dSmrg		while (i++, count++ < 2)
7263e747e6dSmrg		{
7273e747e6dSmrg		    if (*i >= '0' && *i <= '9')
7283e747e6dSmrg			n = (n<<4) + (*i - '0');
7293e747e6dSmrg		    else if (*i >= 'a' && *i <= 'f')
7303e747e6dSmrg			n = (n<<4) + (*i - 'a') + 10;
7313e747e6dSmrg		    else if (*i >= 'A' && *i <= 'F')
7323e747e6dSmrg			n = (n<<4) + (*i - 'A') + 10;
7333e747e6dSmrg		    else
7343e747e6dSmrg			break;
7353e747e6dSmrg		}
7363e747e6dSmrg		*o = n;
7373e747e6dSmrg		break;
7383e747e6dSmrg	    case '\n':
7393e747e6dSmrg		i++;	/* punt */
7403e747e6dSmrg		o--;	/* to account for o++ at end of loop */
7413e747e6dSmrg		break;
7423e747e6dSmrg	    case '\"':
7433e747e6dSmrg	    case '\'':
7443e747e6dSmrg	    case '\\':
7453e747e6dSmrg	    default:
7463e747e6dSmrg		*o = *i++;
7473e747e6dSmrg		break;
7483e747e6dSmrg	    }
7493e747e6dSmrg	}
7503e747e6dSmrg	else
7513e747e6dSmrg	    *o = *i++;
7523e747e6dSmrg    }
7533e747e6dSmrg    *o = '\0';
7543e747e6dSmrg}
7553e747e6dSmrg
756c2535118Smrgstatic MenuRoot *GetRoot(const char *name, const char* fore, const char *back)
7573e747e6dSmrg{
7583e747e6dSmrg    MenuRoot *tmp;
7593e747e6dSmrg
7603e747e6dSmrg    tmp = FindMenuRoot(name);
7613e747e6dSmrg    if (tmp == NULL)
7623e747e6dSmrg	tmp = NewMenuRoot(name);
7633e747e6dSmrg
7643e747e6dSmrg    if (fore)
7653e747e6dSmrg    {
7663e747e6dSmrg	int save;
7673e747e6dSmrg
7683e747e6dSmrg	save = Scr->FirstTime;
7693e747e6dSmrg	Scr->FirstTime = TRUE;
7703e747e6dSmrg	GetColor(COLOR, &tmp->hi_fore, fore);
7713e747e6dSmrg	GetColor(COLOR, &tmp->hi_back, back);
7723e747e6dSmrg	Scr->FirstTime = save;
7733e747e6dSmrg    }
7743e747e6dSmrg
7753e747e6dSmrg    return tmp;
7763e747e6dSmrg}
7773e747e6dSmrg
7783e747e6dSmrgstatic void GotButton(int butt, int func)
7793e747e6dSmrg{
7803e747e6dSmrg    int i;
7813e747e6dSmrg
7823e747e6dSmrg    for (i = 0; i < NUM_CONTEXTS; i++)
7833e747e6dSmrg    {
7843e747e6dSmrg	if ((cont & (1 << i)) == 0)
7853e747e6dSmrg	    continue;
7863e747e6dSmrg
7873e747e6dSmrg	Scr->Mouse[butt][i][mods].func = func;
7883e747e6dSmrg	if (func == F_MENU)
7893e747e6dSmrg	{
7903e747e6dSmrg	    pull->prev = NULL;
7913e747e6dSmrg	    Scr->Mouse[butt][i][mods].menu = pull;
7923e747e6dSmrg	}
7933e747e6dSmrg	else
7943e747e6dSmrg	{
7953e747e6dSmrg	    root = GetRoot(TWM_ROOT, NULLSTR, NULLSTR);
7963e747e6dSmrg	    Scr->Mouse[butt][i][mods].item = AddToMenu(root,"x",Action,
7973e747e6dSmrg		    NULL, func, NULLSTR, NULLSTR);
7983e747e6dSmrg	}
7993e747e6dSmrg    }
8003e747e6dSmrg    Action = "";
8013e747e6dSmrg    pull = NULL;
8023e747e6dSmrg    cont = 0;
8033e747e6dSmrg    mods_used |= mods;
8043e747e6dSmrg    mods = 0;
8053e747e6dSmrg}
8063e747e6dSmrg
8073e747e6dSmrgstatic void GotKey(char *key, int func)
8083e747e6dSmrg{
8093e747e6dSmrg    int i;
8103e747e6dSmrg
8113e747e6dSmrg    for (i = 0; i < NUM_CONTEXTS; i++)
8123e747e6dSmrg    {
813c2535118Smrg	if ((cont & (1 << i)) == 0)
8143e747e6dSmrg	  continue;
815c2535118Smrg	if (!AddFuncKey(key, i, mods, func, Name, Action))
8163e747e6dSmrg	  break;
8173e747e6dSmrg    }
8183e747e6dSmrg
8193e747e6dSmrg    Action = "";
8203e747e6dSmrg    pull = NULL;
8213e747e6dSmrg    cont = 0;
8223e747e6dSmrg    mods_used |= mods;
8233e747e6dSmrg    mods = 0;
8243e747e6dSmrg}
8253e747e6dSmrg
8263e747e6dSmrg
8273e747e6dSmrgstatic void GotTitleButton (char *bitmapname, int func, Bool rightside)
8283e747e6dSmrg{
8293e747e6dSmrg    if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) {
8303e747e6dSmrg	twmrc_error_prefix();
831c2535118Smrg	fprintf (stderr,
8323e747e6dSmrg		 "unable to create %s titlebutton \"%s\"\n",
8333e747e6dSmrg		 rightside ? "right" : "left", bitmapname);
8343e747e6dSmrg    }
8353e747e6dSmrg    Action = "";
8363e747e6dSmrg    pull = NULL;
8373e747e6dSmrg}
8383e747e6dSmrg
8393e747e6dSmrgstatic Bool CheckWarpScreenArg (char *s)
8403e747e6dSmrg{
8413e747e6dSmrg    XmuCopyISOLatin1Lowered (s, s);
8423e747e6dSmrg
8433e747e6dSmrg    if (strcmp (s,  WARPSCREEN_NEXT) == 0 ||
8443e747e6dSmrg	strcmp (s,  WARPSCREEN_PREV) == 0 ||
8453e747e6dSmrg	strcmp (s,  WARPSCREEN_BACK) == 0)
8463e747e6dSmrg      return True;
8473e747e6dSmrg
8483e747e6dSmrg    for (; *s && isascii(*s) && isdigit(*s); s++) ; /* SUPPRESS 530 */
8493e747e6dSmrg    return (*s ? False : True);
8503e747e6dSmrg}
8513e747e6dSmrg
8523e747e6dSmrg
8533e747e6dSmrgstatic Bool CheckWarpRingArg (char *s)
8543e747e6dSmrg{
8553e747e6dSmrg    XmuCopyISOLatin1Lowered (s, s);
8563e747e6dSmrg
8573e747e6dSmrg    if (strcmp (s,  WARPSCREEN_NEXT) == 0 ||
8583e747e6dSmrg	strcmp (s,  WARPSCREEN_PREV) == 0)
8593e747e6dSmrg      return True;
8603e747e6dSmrg
8613e747e6dSmrg    return False;
8623e747e6dSmrg}
8633e747e6dSmrg
8643e747e6dSmrg
8653e747e6dSmrgstatic Bool CheckColormapArg (char *s)
8663e747e6dSmrg{
8673e747e6dSmrg    XmuCopyISOLatin1Lowered (s, s);
8683e747e6dSmrg
8693e747e6dSmrg    if (strcmp (s, COLORMAP_NEXT) == 0 ||
8703e747e6dSmrg	strcmp (s, COLORMAP_PREV) == 0 ||
8713e747e6dSmrg	strcmp (s, COLORMAP_DEFAULT) == 0)
8723e747e6dSmrg      return True;
8733e747e6dSmrg
8743e747e6dSmrg    return False;
8753e747e6dSmrg}
8763e747e6dSmrg
8773e747e6dSmrg
8783e747e6dSmrgvoid
879c2535118Smrgtwmrc_error_prefix (void)
8803e747e6dSmrg{
8813e747e6dSmrg    fprintf (stderr, "%s:  line %d:  ", ProgramName, yylineno);
8823e747e6dSmrg}
883