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