xref: /dragonfly/usr.sbin/rrenumd/lexer.l (revision a4da4a90)
1 /*	$KAME: lexer.l,v 1.7 2000/11/08 02:40:53 itojun Exp $	*/
2 
3 /*
4  * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the project nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  * $FreeBSD: src/usr.sbin/rrenumd/lexer.l,v 1.1.2.2 2001/07/03 11:02:10 ume Exp $
32  */
33 
34 %{
35 
36 #include <sys/param.h>
37 #include <sys/ioctl.h>
38 #include <sys/socket.h>
39 #include <sys/queue.h>
40 
41 #include <string.h>
42 
43 #include <net/if.h>
44 #if defined(__DragonFly__)
45 #include <net/if_var.h>
46 #endif /* __DragonFly__  */
47 
48 #include <netinet/in.h>
49 #include <netinet/in_var.h>
50 #include <netinet/icmp6.h>
51 
52 #include <arpa/inet.h>
53 
54 #include "y.tab.h"
55 
56 int lineno = 1;
57 
58 #define LINEBUF_SIZE 1000
59 char linebuf[LINEBUF_SIZE];
60 
61 int parse(FILE **);
62 void yyerror(const char *);
63 %}
64 
65 %option noinput
66 %option nounput
67 
68 /* common section */
69 nl		\n
70 ws		[ \t]+
71 digit		[0-9]
72 letter		[0-9A-Za-z]
73 hexdigit	[0-9A-Fa-f]
74 special		[()+\|\?\*,]
75 dot		\.
76 hyphen		\-
77 colon		\:
78 slash		\/
79 bcl		\{
80 ecl		\}
81 semi		\;
82 usec		{dot}{digit}{1,6}
83 comment		\#.*
84 qstring		\"[^"]*\"
85 decstring	{digit}+
86 hexpair		{hexdigit}{hexdigit}
87 hexstring	0[xX]{hexdigit}+
88 octetstring	{octet}({dot}{octet})+
89 ipv4addr	{digit}{1,3}({dot}{digit}{1,3}){0,3}
90 ipv6addr	{hexdigit}{0,4}({colon}{hexdigit}{0,4}){2,7}
91 ipaddrmask	{slash}{digit}{1,3}
92 keyword		{letter}{letter}+
93 name		{letter}(({letter}|{digit}|{hyphen})*({letter}|{digit}))*
94 hostname	{name}(({dot}{name})+{dot}?)?
95 
96 timeval		{digit}{0,2}
97 days		d{timeval}
98 hours		h{timeval}
99 minutes		m{timeval}
100 seconds		s{timeval}
101 
102 mprefix		match_prefix|match-prefix
103 uprefix		use_prefix|use-prefix
104 
105 %%
106 	/* rrenumd keywords */
107 debug		{
108 			return(DEBUG_CMD);
109 		}
110 dest		{
111 			return(DEST_CMD);
112 		}
113 retry		{
114 			return(RETRY_CMD);
115 		}
116 seqnum		{
117 			return(SEQNUM_CMD);
118 		}
119 add		{
120 			yylval.num = RPM_PCO_ADD;
121 			return(ADD);
122 		}
123 change		{
124 			yylval.num = RPM_PCO_CHANGE;
125 			return(CHANGE);
126 		 }
127 setglobal	{
128 			yylval.num = RPM_PCO_SETGLOBAL;
129 			return(SETGLOBAL);
130 		}
131 {mprefix}	{
132 			return(MATCH_PREFIX_CMD);
133 		}
134 maxlen		{
135 			return(MAXLEN_CMD);
136 		}
137 minlen		{
138 			return(MINLEN_CMD);
139 		}
140 {uprefix}	{
141 			return(USE_PREFIX_CMD);
142 		}
143 keeplen		{
144 			return(KEEPLEN_CMD);
145 		}
146 
147 vltime		{
148 			return(VLTIME_CMD);
149 		}
150 pltime		{
151 			return(PLTIME_CMD);
152 		}
153 raf_onlink	{
154 			return(RAF_ONLINK_CMD);
155 		}
156 raf_auto	{
157 			return(RAF_AUTO_CMD);
158 		}
159 rrf_decrvalid	{
160 			return(RAF_DECRVALID_CMD);
161 		}
162 rrf_decrprefd	{
163 			return(RAF_DECRPREFD_CMD);
164 		}
165 {days}		{
166 			yytext++;
167 			yylval.num = atoi(yytext);
168 			return(DAYS);
169 		}
170 {hours}		{
171 			yytext++;
172 			yylval.num = atoi(yytext);
173 			return(HOURS);
174 		}
175 {minutes}	{
176 			yytext++;
177 			yylval.num = atoi(yytext);
178 			return(MINUTES);
179 		}
180 {seconds}	{
181 			yytext++;
182 			yylval.num = atoi(yytext);
183 			return(SECONDS);
184 		}
185 infinity	{
186 			return(INFINITY);
187 		}
188 
189 on		{
190 			yylval.num = 1;
191 			return(ON);
192 		}
193 off		{
194 			yylval.num = 0;
195 			return(OFF);
196 		}
197 
198 	/* basic rules */
199 {ws}		;
200 {nl}		{
201 			lineno++;
202 		}
203 {semi}		{
204 			return EOS;
205 		}
206 {bcl}		{
207 			return BCL;
208 		}
209 {ecl}		{
210 			return ECL;
211 		}
212 {qstring}	{
213 			yylval.cs.cp = yytext;
214 			yylval.cs.len = yyleng;
215 			return QSTRING;
216 		}
217 {decstring}	{
218 			yylval.cs.cp = yytext;
219 			yylval.cs.len = yyleng;
220 			return DECSTRING;
221 		}
222 {name}		{
223 			yylval.cs.cp = yytext;
224 			yylval.cs.len = yyleng;
225 			return NAME;
226 		}
227 {ipv4addr}	{
228 			memset(&yylval.addr4, 0, sizeof(struct in_addr));
229 			if (inet_pton(AF_INET, yytext,
230 				      &yylval.addr4) == 1) {
231 				return IPV4ADDR;
232 			} else {
233 				return ERROR;
234 			}
235 		}
236 {ipv6addr}	{
237 			memset(&yylval.addr6, 0, sizeof(struct in6_addr));
238 			if (inet_pton(AF_INET6, yytext,
239 				      &yylval.addr6) == 1) {
240 				return IPV6ADDR;
241 			} else {
242 				return ERROR;
243 			}
244 		}
245 {ipaddrmask}	{
246 			yytext++;
247 			yylval.num = atoi(yytext);
248 			return(PREFIXLEN);
249 		}
250 {hostname}	{
251 			yylval.cs.cp = yytext;
252 			yylval.cs.len = yyleng;
253 			return HOSTNAME;
254 		}
255 %%
256 
257 int parse(FILE **fp)
258 {
259 	extern int yyparse(void);
260 
261 	yyin = *fp;
262 
263 	if (yyparse())
264 		return(-1);
265 
266 	return(0);
267 
268 }
269 
270 void
271 yyerror(const char *s)
272 {
273 	printf("%s: at %s in line %d\n", s, yytext, lineno);
274 }
275