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