xref: /dragonfly/usr.sbin/rrenumd/lexer.l (revision 917beb172f5c4ee492fa7b47ce8c161066b977e8)
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