config_yacc.y revision 1.4 1 1.4 drochner /* $NetBSD: config_yacc.y,v 1.4 2008/07/17 16:24:56 drochner 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.2 jmmv * by Julio M. Merino Vidal.
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.4 drochner __RCSID("$NetBSD: config_yacc.y,v 1.4 2008/07/17 16:24:56 drochner 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.4 drochner #include <stdlib.h>
48 1.1 jmmv
49 1.1 jmmv #include "wsmoused.h"
50 1.1 jmmv
51 1.1 jmmv int yylex(void);
52 1.1 jmmv int yyparse(void);
53 1.1 jmmv int yyerror(const char *, ...);
54 1.1 jmmv void yyrestart(FILE *);
55 1.1 jmmv struct block *config_parse(FILE *);
56 1.1 jmmv
57 1.1 jmmv int yyline;
58 1.1 jmmv static struct block *Conf;
59 1.1 jmmv
60 1.1 jmmv %}
61 1.1 jmmv
62 1.1 jmmv %token TK_EOL
63 1.1 jmmv %token TK_EQUAL TK_LBRACE TK_RBRACE
64 1.3 jmmv %token TK_STRING TK_MODE TK_MODEPROP
65 1.3 jmmv %type <string> TK_STRING TK_MODEPROP
66 1.3 jmmv %type <prop> modeprop
67 1.3 jmmv %type <block> main outermode mode
68 1.1 jmmv %union {
69 1.1 jmmv char *string;
70 1.1 jmmv struct prop *prop;
71 1.1 jmmv struct block *block;
72 1.1 jmmv }
73 1.1 jmmv
74 1.1 jmmv %%
75 1.1 jmmv
76 1.1 jmmv Config :
77 1.1 jmmv main { Conf = $1;
78 1.1 jmmv Conf->b_name = strdup("global"); }
79 1.1 jmmv ;
80 1.1 jmmv
81 1.1 jmmv /* Matches the whole configuration file and constructs a block defining it.
82 1.1 jmmv Can contain mode properties (common to all modes) and mode definitions. */
83 1.1 jmmv main :
84 1.1 jmmv modeprop { struct block *b = block_new(BLOCK_GLOBAL);
85 1.1 jmmv block_add_prop(b, $1);
86 1.1 jmmv $$ = b; }
87 1.1 jmmv | main modeprop { block_add_prop($1, $2); }
88 1.1 jmmv | outermode { struct block *b = block_new(BLOCK_GLOBAL);
89 1.1 jmmv block_add_child(b, $1);
90 1.1 jmmv $$ = b; }
91 1.1 jmmv | main outermode { block_add_child($1, $2); }
92 1.1 jmmv | error TK_EOL { yyerrok; }
93 1.1 jmmv ;
94 1.1 jmmv
95 1.3 jmmv /* Defines the aspect of a mode definition. Returns the block given by the
96 1.1 jmmv mode definition itself. */
97 1.1 jmmv outermode :
98 1.1 jmmv TK_MODE TK_STRING TK_LBRACE mode TK_RBRACE
99 1.1 jmmv { $4->b_name = strdup($2);
100 1.1 jmmv $$ = $4; }
101 1.1 jmmv | TK_MODE TK_STRING TK_LBRACE TK_RBRACE
102 1.1 jmmv { $$ = block_new(BLOCK_MODE);
103 1.1 jmmv $$->b_name = strdup($2); }
104 1.1 jmmv ;
105 1.1 jmmv
106 1.3 jmmv /* Matches a mode and returns a block defining it. Contains properties */
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 | error TK_EOL { yyerrok; }
113 1.1 jmmv ;
114 1.1 jmmv
115 1.1 jmmv /* Matches a mode property and returns a prop defining it. */
116 1.1 jmmv modeprop :
117 1.1 jmmv TK_MODEPROP TK_EQUAL TK_STRING TK_EOL
118 1.1 jmmv { struct prop *p = prop_new();
119 1.1 jmmv p->p_name = strdup($1);
120 1.1 jmmv p->p_value = strdup($3);
121 1.1 jmmv $$ = p; }
122 1.1 jmmv ;
123 1.1 jmmv
124 1.1 jmmv %%
125 1.1 jmmv
126 1.1 jmmv int
127 1.1 jmmv yyerror(const char *fmt, ...)
128 1.1 jmmv {
129 1.1 jmmv va_list ap;
130 1.1 jmmv
131 1.1 jmmv va_start(ap, fmt);
132 1.1 jmmv fprintf(stderr, "%s: ", getprogname());
133 1.1 jmmv vfprintf(stderr, fmt, ap);
134 1.1 jmmv fprintf(stderr, " in line %d\n", yyline);
135 1.1 jmmv va_end(ap);
136 1.1 jmmv return (0);
137 1.1 jmmv }
138 1.1 jmmv
139 1.1 jmmv struct block *
140 1.1 jmmv config_parse(FILE *f)
141 1.1 jmmv {
142 1.1 jmmv Conf = NULL;
143 1.1 jmmv yyrestart(f);
144 1.1 jmmv yyline = 1;
145 1.1 jmmv yyparse();
146 1.1 jmmv
147 1.1 jmmv return Conf;
148 1.1 jmmv }
149