xref: /freebsd/usr.sbin/rrenumd/lexer.l (revision a03411e84728e9b267056fd31c7d1d9d1dc1b01e)
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 
34 %{
35 #include <sys/param.h>
36 #include <sys/ioctl.h>
37 #include <sys/socket.h>
38 #include <sys/queue.h>
39 
40 #include <string.h>
41 
42 #include <net/if.h>
43 #include <netinet/in.h>
44 #include <netinet/in_var.h>
45 #include <netinet/icmp6.h>
46 
47 #include <arpa/inet.h>
48 
49 #include "y.tab.h"
50 
51 int lineno = 1;
52 
53 #define LINEBUF_SIZE 1000
54 char linebuf[LINEBUF_SIZE];
55 
56 int parse(FILE **);
57 void yyerror(const char *);
58 int yylex(void);
59 %}
60 
61 %option noyywrap
62 %option nounput
63 
64 /* common section */
65 nl		\n
66 ws		[ \t]+
67 digit		[0-9]
68 letter		[0-9A-Za-z]
69 hexdigit	[0-9A-Fa-f]
70 special		[()+\|\?\*,]
71 dot		\.
72 hyphen		\-
73 colon		\:
74 slash		\/
75 bcl		\{
76 ecl		\}
77 semi		\;
78 usec		{dot}{digit}{1,6}
79 comment		\#.*
80 qstring		\"[^"]*\"
81 decstring	{digit}+
82 hexpair		{hexdigit}{hexdigit}
83 hexstring	0[xX]{hexdigit}+
84 octetstring	{octet}({dot}{octet})+
85 ipv4addr	{digit}{1,3}({dot}{digit}{1,3}){0,3}
86 ipv6addr	{hexdigit}{0,4}({colon}{hexdigit}{0,4}){2,7}
87 ipaddrmask	{slash}{digit}{1,3}
88 keyword		{letter}{letter}+
89 name		{letter}(({letter}|{digit}|{hyphen})*({letter}|{digit}))*
90 hostname	{name}(({dot}{name})+{dot}?)?
91 
92 timeval		{digit}{0,2}
93 days		d{timeval}
94 hours		h{timeval}
95 minutes		m{timeval}
96 seconds		s{timeval}
97 
98 mprefix		match_prefix|match-prefix
99 uprefix		use_prefix|use-prefix
100 
101 %%
102 	/* rrenumd keywords */
103 debug		{
104 			return(DEBUG_CMD);
105 		}
106 dest		{
107 			return(DEST_CMD);
108 		}
109 retry		{
110 			return(RETRY_CMD);
111 		}
112 seqnum		{
113 			return(SEQNUM_CMD);
114 		}
115 add		{
116 			yylval.num = RPM_PCO_ADD;
117 			return(ADD);
118 		}
119 change		{
120 			yylval.num = RPM_PCO_CHANGE;
121 			return(CHANGE);
122 		 }
123 setglobal	{
124 			yylval.num = RPM_PCO_SETGLOBAL;
125 			return(SETGLOBAL);
126 		}
127 {mprefix}	{
128 			return(MATCH_PREFIX_CMD);
129 		}
130 maxlen		{
131 			return(MAXLEN_CMD);
132 		}
133 minlen		{
134 			return(MINLEN_CMD);
135 		}
136 {uprefix}	{
137 			return(USE_PREFIX_CMD);
138 		}
139 keeplen		{
140 			return(KEEPLEN_CMD);
141 		}
142 
143 vltime		{
144 			return(VLTIME_CMD);
145 		}
146 pltime		{
147 			return(PLTIME_CMD);
148 		}
149 raf_onlink	{
150 			return(RAF_ONLINK_CMD);
151 		}
152 raf_auto	{
153 			return(RAF_AUTO_CMD);
154 		}
155 rrf_decrvalid	{
156 			return(RAF_DECRVALID_CMD);
157 		}
158 rrf_decrprefd	{
159 			return(RAF_DECRPREFD_CMD);
160 		}
161 {days}		{
162 			yytext++;
163 			yylval.num = atoi(yytext);
164 			return(DAYS);
165 		}
166 {hours}		{
167 			yytext++;
168 			yylval.num = atoi(yytext);
169 			return(HOURS);
170 		}
171 {minutes}	{
172 			yytext++;
173 			yylval.num = atoi(yytext);
174 			return(MINUTES);
175 		}
176 {seconds}	{
177 			yytext++;
178 			yylval.num = atoi(yytext);
179 			return(SECONDS);
180 		}
181 infinity	{
182 			return(INFINITY);
183 		}
184 
185 on		{
186 			yylval.num = 1;
187 			return(ON);
188 		}
189 off		{
190 			yylval.num = 0;
191 			return(OFF);
192 		}
193 
194 	/* basic rules */
195 {ws}		;
196 {nl}		{
197 			lineno++;
198 		}
199 {semi}		{
200 			return EOS;
201 		}
202 {bcl}		{
203 			return BCL;
204 		}
205 {ecl}		{
206 			return ECL;
207 		}
208 {qstring}	{
209 			yylval.cs.cp = yytext;
210 			yylval.cs.len = yyleng;
211 			return QSTRING;
212 		}
213 {decstring}	{
214 			yylval.cs.cp = yytext;
215 			yylval.cs.len = yyleng;
216 			return DECSTRING;
217 		}
218 {name}		{
219 			yylval.cs.cp = yytext;
220 			yylval.cs.len = yyleng;
221 			return NAME;
222 		}
223 {ipv4addr}	{
224 			memset(&yylval.addr4, 0, sizeof(struct in_addr));
225 			if (inet_pton(AF_INET, yytext,
226 				      &yylval.addr4) == 1) {
227 				return IPV4ADDR;
228 			} else {
229 				return ERROR;
230 			}
231 		}
232 {ipv6addr}	{
233 			memset(&yylval.addr6, 0, sizeof(struct in6_addr));
234 			if (inet_pton(AF_INET6, yytext,
235 				      &yylval.addr6) == 1) {
236 				return IPV6ADDR;
237 			} else {
238 				return ERROR;
239 			}
240 		}
241 {ipaddrmask}	{
242 			yytext++;
243 			yylval.num = atoi(yytext);
244 			return(PREFIXLEN);
245 		}
246 {hostname}	{
247 			yylval.cs.cp = yytext;
248 			yylval.cs.len = yyleng;
249 			return HOSTNAME;
250 		}
251 %%
252 
253 int parse(FILE **fp)
254 {
255 	extern int yyparse(void);
256 
257 	yyin = *fp;
258 
259 	if (yyparse())
260 		return(-1);
261 
262 	return(0);
263 
264 }
265 
266 void
267 yyerror(const char *s)
268 {
269 	printf("%s: at %s in line %d\n", s, yytext, lineno);
270 }
271