Blame tests/Performance/DND/gram.y

Packit b099d7
/*
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */
Packit b099d7
/*
Packit b099d7
 * HISTORY
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
%{
Packit b099d7
#include "stdio.h"
Packit b099d7
#include <Xm/Xm.h>
Packit b099d7
#include "toolchest.h"
Packit b099d7
%}
Packit b099d7
Packit b099d7
%union
Packit b099d7
{
Packit b099d7
    char *string;
Packit b099d7
    struct menuEntry *menuEntry;
Packit b099d7
}
Packit b099d7
Packit b099d7
%token <string>  STRING
Packit b099d7
%token <string>  MENU
Packit b099d7
%token <string>  INCLUDE
Packit b099d7
%token <string>  SINCLUDE
Packit b099d7
%token <string>  REMOVE
Packit b099d7
%token <string>  FROM
Packit b099d7
%token <string>  F_EXEC
Packit b099d7
%token <string>  F_CHECKEXEC
Packit b099d7
%token <string>  F_CHECKEXPR
Packit b099d7
%token <string>  F_SEPARATOR
Packit b099d7
%token <string>  F_LABEL
Packit b099d7
%token <string>  F_TITLE
Packit b099d7
%token <string>  F_MENU
Packit b099d7
Packit b099d7
%type <string> string _string
Packit b099d7
%type <menuEntry> menuitem menuspec
Packit b099d7
Packit b099d7
%%
Packit b099d7
specs	: /* empty */
Packit b099d7
	| specs spec newline
Packit b099d7
	| specs newline
Packit b099d7
	;
Packit b099d7
Packit b099d7
spec	: INCLUDE string
Packit b099d7
	    {
Packit b099d7
		IncludeFile($2, TRUE);
Packit b099d7
	    }
Packit b099d7
	| SINCLUDE string
Packit b099d7
	    {
Packit b099d7
		IncludeFile($2, FALSE);
Packit b099d7
	    }
Packit b099d7
	| MENU string newline '{' newline menuspec '}'
Packit b099d7
	    {
Packit b099d7
		if ($6 != NULL);
Packit b099d7
		{
Packit b099d7
		    register struct menu *menu;
Packit b099d7
		    
Packit b099d7
		    menu = FindMenu($2, TRUE);
Packit b099d7
		    /* if the menu already existed, add new items to end */
Packit b099d7
		    if (menu->firstMenuEntry)
Packit b099d7
		    {
Packit b099d7
			struct menuEntry *tlast;
Packit b099d7
			
Packit b099d7
			menu->lastMenuEntry->next = $6;
Packit b099d7
			$6->prev->next = NULL;
Packit b099d7
			tlast = menu->lastMenuEntry;
Packit b099d7
			menu->lastMenuEntry = $6->prev;
Packit b099d7
			$6->prev = tlast;
Packit b099d7
		    }
Packit b099d7
		    /* otherwise just put these on the new menu */
Packit b099d7
		    else
Packit b099d7
		    {
Packit b099d7
			menu->firstMenuEntry = $6;
Packit b099d7
			menu->lastMenuEntry = $6->prev;
Packit b099d7
			$6->prev->next = NULL;
Packit b099d7
			$6->prev = NULL;
Packit b099d7
		    }
Packit b099d7
#ifdef TCMENU
Packit b099d7
		    {
Packit b099d7
			register struct menuEntry *entry;
Packit b099d7
Packit b099d7
			for (entry = menu->firstMenuEntry; entry;
Packit b099d7
			     entry = entry->next)
Packit b099d7
			    entry->containingMenu = menu;
Packit b099d7
		    }
Packit b099d7
#endif /* TCMENU */
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
		
Packit b099d7
	| REMOVE string
Packit b099d7
	    {
Packit b099d7
		RemoveMenuEntry($2, NULL);
Packit b099d7
	    }
Packit b099d7
	| REMOVE string FROM string
Packit b099d7
	    {
Packit b099d7
		RemoveMenuEntry($2, $4);
Packit b099d7
	    }
Packit b099d7
	;
Packit b099d7
Packit b099d7
menuspec: /* empty */
Packit b099d7
	    {
Packit b099d7
		$$ = NULL;
Packit b099d7
	    }
Packit b099d7
	| menuspec newline
Packit b099d7
	| menuspec menuitem newline
Packit b099d7
	    {
Packit b099d7
		/* so that we can keep track of both the first and
Packit b099d7
		 * last menu entry, keep the menu entries as a circular
Packit b099d7
		 * list.  Always return a pointer to the first item
Packit b099d7
		 */
Packit b099d7
		if ($1 == NULL)
Packit b099d7
		{
Packit b099d7
		    $2->next = $2;
Packit b099d7
		    $2->prev = $2;
Packit b099d7
		    $$=$2;
Packit b099d7
		}
Packit b099d7
		else
Packit b099d7
		{
Packit b099d7
		    $2->prev = $1->prev;
Packit b099d7
		    $2->next = $1;
Packit b099d7
		    $1->prev->next = $2;
Packit b099d7
		    $1->prev = $2;
Packit b099d7
		    $$ = $1;
Packit b099d7
		}
Packit b099d7
	    }
Packit b099d7
	;
Packit b099d7
Packit b099d7
menuitem: string F_MENU string
Packit b099d7
	    {
Packit b099d7
		$$ = NewMenuEntry($1, ME_MENU);
Packit b099d7
		$$->menuName = $3;
Packit b099d7
	    }
Packit b099d7
	| string F_LABEL
Packit b099d7
	    {
Packit b099d7
		$$ = NewMenuEntry($1, ME_LABEL);
Packit b099d7
	    }
Packit b099d7
	| string F_TITLE
Packit b099d7
	    {
Packit b099d7
		$$ = NewMenuEntry($1, ME_TITLE);
Packit b099d7
	    }
Packit b099d7
	| string F_SEPARATOR
Packit b099d7
	    {
Packit b099d7
		$$ = NewMenuEntry($1, ME_SEPARATOR);
Packit b099d7
	    }
Packit b099d7
	| string F_EXEC string
Packit b099d7
	    {
Packit b099d7
		$$ = NewMenuEntry($1, ME_EXEC);
Packit b099d7
		$$->execString = $3;
Packit b099d7
	    }
Packit b099d7
	| string F_CHECKEXEC string
Packit b099d7
	    {
Packit b099d7
		$$ = NewMenuEntry($1, ME_CHECKEXEC);
Packit b099d7
		$$->execString = $3;
Packit b099d7
	    }
Packit b099d7
	| string F_CHECKEXPR string string
Packit b099d7
	    {
Packit b099d7
		$$ = NewMenuEntry($1, ME_CHECKEXPR);
Packit b099d7
		$$->exprString = $3;
Packit b099d7
		$$->execString = $4;
Packit b099d7
	    }
Packit b099d7
	;
Packit b099d7
Packit b099d7
/* all tokens are also valid strings, so accept them.  Include an intermediate
Packit b099d7
 * node so that all strings can be stripped of quotes
Packit b099d7
 */
Packit b099d7
string	: _string
Packit b099d7
	    {
Packit b099d7
		$$ = UnquoteString($1);
Packit b099d7
	    }
Packit b099d7
	;
Packit b099d7
Packit b099d7
_string	: STRING
Packit b099d7
	| MENU
Packit b099d7
	| INCLUDE
Packit b099d7
	| REMOVE
Packit b099d7
	| FROM
Packit b099d7
	| F_EXEC
Packit b099d7
	| F_CHECKEXEC
Packit b099d7
	| F_CHECKEXPR
Packit b099d7
	| F_SEPARATOR
Packit b099d7
	| F_LABEL
Packit b099d7
	| F_TITLE
Packit b099d7
	| F_MENU
Packit b099d7
	| '{'
Packit b099d7
	    {
Packit b099d7
		$$ = "{";
Packit b099d7
	    }
Packit b099d7
	| '}'
Packit b099d7
	    {
Packit b099d7
		$$ = "{";
Packit b099d7
	    }
Packit b099d7
	;
Packit b099d7
Packit b099d7
newline	: '\n'
Packit b099d7
	    {
Packit b099d7
		lineno++;
Packit b099d7
	    }
Packit b099d7
%%
Packit b099d7
yyerror(s)
Packit b099d7
char *s;
Packit b099d7
{
Packit b099d7
    FileError("%s\n",s);
Packit b099d7
}
Packit b099d7
Packit b099d7