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