]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/rrenumd/lexer.l
bhyve: Add a slirp network backend
[FreeBSD/FreeBSD.git] / usr.sbin / rrenumd / lexer.l
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 }