cfgparse.y revision 9ff100ac
1/************************************************************
2 Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc.
3
4 Permission to use, copy, modify, and distribute this
5 software and its documentation for any purpose and without
6 fee is hereby granted, provided that the above copyright
7 notice appear in all copies and that both that copyright
8 notice and this permission notice appear in supporting
9 documentation, and that the name of Silicon Graphics not be
10 used in advertising or publicity pertaining to distribution
11 of the software without specific prior written permission.
12 Silicon Graphics makes no representation about the suitability
13 of this software for any purpose. It is provided "as is"
14 without any express or implied warranty.
15
16 SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
17 SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
18 AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
19 GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
20 DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
21 DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
22 OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION  WITH
23 THE USE OR PERFORMANCE OF THIS SOFTWARE.
24
25 ********************************************************/
26
27%token
28	END_OF_FILE	0
29	ERROR		255
30	BELL		1
31	ACCESSX		2
32	MESSAGE		3
33
34	NONE		20
35	IGNORE		21
36	ECHO		22
37	PRINT_EV	23
38	SHELL		24
39	SOUND		25
40
41	EQUALS		40
42	PLUS		41
43	MINUS		42
44	DIVIDE		43
45	TIMES		44
46	OBRACE		45
47	CBRACE		46
48	OPAREN		47
49	CPAREN		48
50	OBRACKET	49
51	CBRACKET	50
52	DOT		51
53	COMMA		52
54	SEMI		53
55	EXCLAM		54
56	INVERT		55
57	STRING		60
58	INTEGER		61
59	FLOAT		62
60	IDENT		63
61	KEYNAME		64
62%{
63#ifdef DEBUG
64#define	YYDEBUG 1
65#endif
66#include "xkbevd.h"
67#include <stdlib.h>
68%}
69%right	EQUALS
70%left	PLUS MINUS
71%left	TIMES DIVIDE
72%left	EXCLAM INVERT
73%left	OPAREN
74%start	CfgFile
75%union	{
76	char *		str;
77	int		ival;
78	CfgEntryPtr	entry;
79	ActDefPtr	act;
80}
81%type <str>	Ident String OptString NameSpec OptNameSpec
82%type <ival>	ActionType EventType
83%type <act>	ActionDef
84%type <entry>	CfgFile CfgEntryList CfgEntry EventDef VarDef
85%%
86CfgFile		:	CfgEntryList
87			{ InterpretConfigs($1); }
88		;
89
90CfgEntryList	:	CfgEntryList CfgEntry
91			{
92			    CfgEntryPtr tmp;
93			    if ($1!=NULL) {
94				for (tmp=$1;tmp->next!=NULL;tmp=tmp->next) {
95				    /* conditional does the work */
96				}
97				tmp->next= $2;
98				$$= $1;
99			    }
100			    else $$= $2;
101			}
102		|	CfgEntry { $$= $1; }
103		;
104
105CfgEntry	:	EventDef ActionDef
106			{
107			    if (($1)&&($2))
108				$1->action= *($2);
109			    if ($2)
110				free($2);
111			    $$= $1;
112			}
113		|	VarDef 		{ $$= $1; }
114		;
115
116VarDef		:	Ident EQUALS NameSpec
117			{
118			    CfgEntryPtr cfg;
119			    cfg= calloc(1,sizeof(CfgEntryRec));
120			    if (cfg) {
121				cfg->entry_type= VariableDef;
122				cfg->event_type= 0;
123				cfg->name.str= $1;
124				cfg->action.type= UnknownAction;
125				cfg->action.text= $3;
126				cfg->action.priv= 0;
127				cfg->next= NULL;
128			    }
129			    $$= cfg;
130			}
131		;
132
133EventDef	:	EventType OPAREN OptNameSpec CPAREN
134			{
135			    CfgEntryPtr cfg;
136			    cfg= calloc(1,sizeof(CfgEntryRec));
137			    if (cfg) {
138				cfg->entry_type= EventDef;
139				cfg->event_type= $1;
140				cfg->name.str= $3;
141				cfg->action.type= UnknownAction;
142				cfg->action.text= NULL;
143				cfg->action.priv= 0;
144				cfg->next= NULL;
145			    }
146			    $$= cfg;
147			}
148		;
149
150EventType	:	BELL		{ $$= XkbBellNotify; }
151		|	ACCESSX		{ $$= XkbAccessXNotify; }
152		|	MESSAGE		{ $$= XkbActionMessage; }
153		;
154
155ActionDef	:	ActionType OptString
156			{
157			    ActDefPtr act;
158			    act= calloc(1,sizeof(ActDefRec));
159			    if (act) {
160				act->type= $1;
161				act->text= $2;
162			    }
163			    $$= act;
164			}
165		;
166
167ActionType	:	NONE	 { $$ = NoAction; }
168		|	IGNORE	 { $$ = NoAction; }
169		|	ECHO	 { $$ = EchoAction; }
170		|	PRINT_EV { $$ = PrintEvAction; }
171		|	SHELL	 { $$ = ShellAction; }
172		|	SOUND	 { $$ = SoundAction; }
173		|		 { $$ = UnknownAction; }
174		;
175
176OptNameSpec	:	NameSpec { $$= $1; }
177		|		 { $$= NULL; }
178		;
179
180NameSpec	:	Ident	{ $$= $1; }
181		|	String	{ $$= $1; }
182		;
183
184Ident		:	IDENT	{ $$= scanStr; scanStr= NULL; }
185		;
186
187OptString	:	String	{ $$= $1; }
188		|		{ $$= NULL; }
189		;
190
191String		:	STRING	{ $$= scanStr; scanStr= NULL; }
192		;
193%%
194int
195yyerror(char *s)
196{
197    (void)fprintf(stderr,"%s: line %d of %s\n",s,lineNum,
198					(scanFile?scanFile:"(unknown)"));
199    if (scanStr)
200	(void)fprintf(stderr,"last scanned symbol is: %s\n",scanStr);
201    return 1;
202}
203
204
205int
206yywrap(void)
207{
208   return 1;
209}
210
211int
212CFGParseFile(FILE *file)
213{
214    if (file) {
215	yyin= file;
216	if (yyparse()==0) {
217	    return 1;
218	}
219	return 0;
220    }
221    return 1;
222}
223