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 } 270