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