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