|
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 |
|