config_yacc.y revision 1.1 1 1.1 jmmv /* $NetBSD: config_yacc.y,v 1.1 2003/03/04 14:33:55 jmmv Exp $ */
2 1.1 jmmv
3 1.1 jmmv /*
4 1.1 jmmv * Copyright (c) 2003 The NetBSD Foundation, Inc.
5 1.1 jmmv * All rights reserved.
6 1.1 jmmv *
7 1.1 jmmv * This code is derived from software contributed to The NetBSD Foundation
8 1.1 jmmv * by Julio Merino.
9 1.1 jmmv *
10 1.1 jmmv * Redistribution and use in source and binary forms, with or without
11 1.1 jmmv * modification, are permitted provided that the following conditions
12 1.1 jmmv * are met:
13 1.1 jmmv * 1. Redistributions of source code must retain the above copyright
14 1.1 jmmv * notice, this list of conditions and the following disclaimer.
15 1.1 jmmv * 2. The name authors may not be used to endorse or promote products
16 1.1 jmmv * derived from this software without specific prior written
17 1.1 jmmv * permission.
18 1.1 jmmv *
19 1.1 jmmv * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
20 1.1 jmmv * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 1.1 jmmv * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 1.1 jmmv * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
23 1.1 jmmv * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 1.1 jmmv * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
25 1.1 jmmv * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 jmmv * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27 1.1 jmmv * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 1.1 jmmv * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29 1.1 jmmv * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 1.1 jmmv */
31 1.1 jmmv
32 1.1 jmmv %{
33 1.1 jmmv
34 1.1 jmmv #include <sys/cdefs.h>
35 1.1 jmmv
36 1.1 jmmv #ifndef lint
37 1.1 jmmv __RCSID("$NetBSD: config_yacc.y,v 1.1 2003/03/04 14:33:55 jmmv Exp $");
38 1.1 jmmv #endif /* not lint */
39 1.1 jmmv
40 1.1 jmmv #include <sys/time.h>
41 1.1 jmmv #include <dev/wscons/wsconsio.h>
42 1.1 jmmv #include <err.h>
43 1.1 jmmv #include <errno.h>
44 1.1 jmmv #include <stdio.h>
45 1.1 jmmv #include <stdarg.h>
46 1.1 jmmv #include <string.h>
47 1.1 jmmv
48 1.1 jmmv #include "wsmoused.h"
49 1.1 jmmv
50 1.1 jmmv int yylex(void);
51 1.1 jmmv int yyparse(void);
52 1.1 jmmv int yyerror(const char *, ...);
53 1.1 jmmv void yyrestart(FILE *);
54 1.1 jmmv struct block *config_parse(FILE *);
55 1.1 jmmv
56 1.1 jmmv int yyline;
57 1.1 jmmv static struct block *Conf;
58 1.1 jmmv
59 1.1 jmmv %}
60 1.1 jmmv
61 1.1 jmmv %token TK_EOL
62 1.1 jmmv %token TK_EQUAL TK_LBRACE TK_RBRACE
63 1.1 jmmv %token TK_STRING TK_EVENT TK_EVENTPROP TK_MODE TK_MODEPROP
64 1.1 jmmv %type <string> TK_STRING TK_EVENTPROP TK_MODEPROP
65 1.1 jmmv %type <prop> eventprop modeprop
66 1.1 jmmv %type <block> main outermode mode outerevent event
67 1.1 jmmv %union {
68 1.1 jmmv char *string;
69 1.1 jmmv struct prop *prop;
70 1.1 jmmv struct block *block;
71 1.1 jmmv }
72 1.1 jmmv
73 1.1 jmmv %%
74 1.1 jmmv
75 1.1 jmmv Config :
76 1.1 jmmv main { Conf = $1;
77 1.1 jmmv Conf->b_name = strdup("global"); }
78 1.1 jmmv ;
79 1.1 jmmv
80 1.1 jmmv /* Matches the whole configuration file and constructs a block defining it.
81 1.1 jmmv Can contain mode properties (common to all modes) and mode definitions. */
82 1.1 jmmv main :
83 1.1 jmmv modeprop { struct block *b = block_new(BLOCK_GLOBAL);
84 1.1 jmmv block_add_prop(b, $1);
85 1.1 jmmv $$ = b; }
86 1.1 jmmv | main modeprop { block_add_prop($1, $2); }
87 1.1 jmmv | outermode { struct block *b = block_new(BLOCK_GLOBAL);
88 1.1 jmmv block_add_child(b, $1);
89 1.1 jmmv $$ = b; }
90 1.1 jmmv | main outermode { block_add_child($1, $2); }
91 1.1 jmmv | error TK_EOL { yyerrok; }
92 1.1 jmmv ;
93 1.1 jmmv
94 1.1 jmmv /* Defines the aspect of a mode definition. Returns the block given by the
95 1.1 jmmv mode definition itself. */
96 1.1 jmmv outermode :
97 1.1 jmmv TK_MODE TK_STRING TK_LBRACE mode TK_RBRACE
98 1.1 jmmv { $4->b_name = strdup($2);
99 1.1 jmmv $$ = $4; }
100 1.1 jmmv | TK_MODE TK_STRING TK_LBRACE TK_RBRACE
101 1.1 jmmv { $$ = block_new(BLOCK_MODE);
102 1.1 jmmv $$->b_name = strdup($2); }
103 1.1 jmmv ;
104 1.1 jmmv
105 1.1 jmmv /* Matches a mode and returns a block defining it. Can contain properties
106 1.1 jmmv and event definitions. */
107 1.1 jmmv mode :
108 1.1 jmmv modeprop { struct block *b = block_new(BLOCK_MODE);
109 1.1 jmmv block_add_prop(b, $1);
110 1.1 jmmv $$ = b; }
111 1.1 jmmv | mode modeprop { block_add_prop($1, $2); }
112 1.1 jmmv | outerevent { struct block *b = block_new(BLOCK_MODE);
113 1.1 jmmv block_add_child(b, $1);
114 1.1 jmmv $$ = b; }
115 1.1 jmmv | mode outerevent { block_add_child($1, $2); }
116 1.1 jmmv | error TK_EOL { yyerrok; }
117 1.1 jmmv ;
118 1.1 jmmv
119 1.1 jmmv /* Defines the aspect of an event definition. Returns the block given by the
120 1.1 jmmv event definition itself. */
121 1.1 jmmv outerevent :
122 1.1 jmmv TK_EVENT TK_LBRACE event TK_RBRACE
123 1.1 jmmv { $$ = $3; }
124 1.1 jmmv TK_EVENT TK_LBRACE TK_RBRACE
125 1.1 jmmv { $$ = block_new(BLOCK_EVENT); }
126 1.1 jmmv ;
127 1.1 jmmv
128 1.1 jmmv /* Matches an event and returns a block defining it. Contains properties. */
129 1.1 jmmv event :
130 1.1 jmmv eventprop { struct block *b = block_new(BLOCK_EVENT);
131 1.1 jmmv block_add_prop(b, $1);
132 1.1 jmmv $$ = b; }
133 1.1 jmmv | event eventprop { block_add_prop($1, $2); }
134 1.1 jmmv | error TK_EOL { yyerrok; }
135 1.1 jmmv | error { yyerrok; }
136 1.1 jmmv ;
137 1.1 jmmv
138 1.1 jmmv /* Matches a mode property and returns a prop defining it. */
139 1.1 jmmv modeprop :
140 1.1 jmmv TK_MODEPROP TK_EQUAL TK_STRING TK_EOL
141 1.1 jmmv { struct prop *p = prop_new();
142 1.1 jmmv p->p_name = strdup($1);
143 1.1 jmmv p->p_value = strdup($3);
144 1.1 jmmv $$ = p; }
145 1.1 jmmv ;
146 1.1 jmmv
147 1.1 jmmv /* Matches an event property and returns a prop defining it. */
148 1.1 jmmv eventprop :
149 1.1 jmmv TK_EVENTPROP TK_EQUAL TK_STRING TK_EOL
150 1.1 jmmv { struct prop *p = prop_new();
151 1.1 jmmv p->p_name = strdup($1);
152 1.1 jmmv p->p_value = strdup($3);
153 1.1 jmmv $$ = p; }
154 1.1 jmmv ;
155 1.1 jmmv
156 1.1 jmmv %%
157 1.1 jmmv
158 1.1 jmmv int
159 1.1 jmmv yyerror(const char *fmt, ...)
160 1.1 jmmv {
161 1.1 jmmv va_list ap;
162 1.1 jmmv
163 1.1 jmmv va_start(ap, fmt);
164 1.1 jmmv fprintf(stderr, "%s: ", getprogname());
165 1.1 jmmv vfprintf(stderr, fmt, ap);
166 1.1 jmmv fprintf(stderr, " in line %d\n", yyline);
167 1.1 jmmv va_end(ap);
168 1.1 jmmv return (0);
169 1.1 jmmv }
170 1.1 jmmv
171 1.1 jmmv struct block *
172 1.1 jmmv config_parse(FILE *f)
173 1.1 jmmv {
174 1.1 jmmv Conf = NULL;
175 1.1 jmmv yyrestart(f);
176 1.1 jmmv yyline = 1;
177 1.1 jmmv yyparse();
178 1.1 jmmv
179 1.1 jmmv return Conf;
180 1.1 jmmv }
181