56d5e0967c
Sponsored by: Nginx, Inc.
270 lines
5.1 KiB
Plaintext
270 lines
5.1 KiB
Plaintext
/* $KAME: lexer.l,v 1.7 2000/11/08 02:40:53 itojun Exp $ */
|
|
|
|
/*
|
|
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the project nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* $FreeBSD$
|
|
*/
|
|
|
|
%{
|
|
#include <sys/param.h>
|
|
#include <sys/ioctl.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/queue.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <net/if.h>
|
|
#include <netinet/in.h>
|
|
#include <netinet/in_var.h>
|
|
#include <netinet/icmp6.h>
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
#include "y.tab.h"
|
|
|
|
int lineno = 1;
|
|
|
|
#define LINEBUF_SIZE 1000
|
|
char linebuf[LINEBUF_SIZE];
|
|
|
|
int parse(FILE **);
|
|
void yyerror(const char *);
|
|
int yylex(void);
|
|
%}
|
|
|
|
%option nounput
|
|
|
|
/* common section */
|
|
nl \n
|
|
ws [ \t]+
|
|
digit [0-9]
|
|
letter [0-9A-Za-z]
|
|
hexdigit [0-9A-Fa-f]
|
|
special [()+\|\?\*,]
|
|
dot \.
|
|
hyphen \-
|
|
colon \:
|
|
slash \/
|
|
bcl \{
|
|
ecl \}
|
|
semi \;
|
|
usec {dot}{digit}{1,6}
|
|
comment \#.*
|
|
qstring \"[^"]*\"
|
|
decstring {digit}+
|
|
hexpair {hexdigit}{hexdigit}
|
|
hexstring 0[xX]{hexdigit}+
|
|
octetstring {octet}({dot}{octet})+
|
|
ipv4addr {digit}{1,3}({dot}{digit}{1,3}){0,3}
|
|
ipv6addr {hexdigit}{0,4}({colon}{hexdigit}{0,4}){2,7}
|
|
ipaddrmask {slash}{digit}{1,3}
|
|
keyword {letter}{letter}+
|
|
name {letter}(({letter}|{digit}|{hyphen})*({letter}|{digit}))*
|
|
hostname {name}(({dot}{name})+{dot}?)?
|
|
|
|
timeval {digit}{0,2}
|
|
days d{timeval}
|
|
hours h{timeval}
|
|
minutes m{timeval}
|
|
seconds s{timeval}
|
|
|
|
mprefix match_prefix|match-prefix
|
|
uprefix use_prefix|use-prefix
|
|
|
|
%%
|
|
/* rrenumd keywords */
|
|
debug {
|
|
return(DEBUG_CMD);
|
|
}
|
|
dest {
|
|
return(DEST_CMD);
|
|
}
|
|
retry {
|
|
return(RETRY_CMD);
|
|
}
|
|
seqnum {
|
|
return(SEQNUM_CMD);
|
|
}
|
|
add {
|
|
yylval.num = RPM_PCO_ADD;
|
|
return(ADD);
|
|
}
|
|
change {
|
|
yylval.num = RPM_PCO_CHANGE;
|
|
return(CHANGE);
|
|
}
|
|
setglobal {
|
|
yylval.num = RPM_PCO_SETGLOBAL;
|
|
return(SETGLOBAL);
|
|
}
|
|
{mprefix} {
|
|
return(MATCH_PREFIX_CMD);
|
|
}
|
|
maxlen {
|
|
return(MAXLEN_CMD);
|
|
}
|
|
minlen {
|
|
return(MINLEN_CMD);
|
|
}
|
|
{uprefix} {
|
|
return(USE_PREFIX_CMD);
|
|
}
|
|
keeplen {
|
|
return(KEEPLEN_CMD);
|
|
}
|
|
|
|
vltime {
|
|
return(VLTIME_CMD);
|
|
}
|
|
pltime {
|
|
return(PLTIME_CMD);
|
|
}
|
|
raf_onlink {
|
|
return(RAF_ONLINK_CMD);
|
|
}
|
|
raf_auto {
|
|
return(RAF_AUTO_CMD);
|
|
}
|
|
rrf_decrvalid {
|
|
return(RAF_DECRVALID_CMD);
|
|
}
|
|
rrf_decrprefd {
|
|
return(RAF_DECRPREFD_CMD);
|
|
}
|
|
{days} {
|
|
yytext++;
|
|
yylval.num = atoi(yytext);
|
|
return(DAYS);
|
|
}
|
|
{hours} {
|
|
yytext++;
|
|
yylval.num = atoi(yytext);
|
|
return(HOURS);
|
|
}
|
|
{minutes} {
|
|
yytext++;
|
|
yylval.num = atoi(yytext);
|
|
return(MINUTES);
|
|
}
|
|
{seconds} {
|
|
yytext++;
|
|
yylval.num = atoi(yytext);
|
|
return(SECONDS);
|
|
}
|
|
infinity {
|
|
return(INFINITY);
|
|
}
|
|
|
|
on {
|
|
yylval.num = 1;
|
|
return(ON);
|
|
}
|
|
off {
|
|
yylval.num = 0;
|
|
return(OFF);
|
|
}
|
|
|
|
/* basic rules */
|
|
{ws} ;
|
|
{nl} {
|
|
lineno++;
|
|
}
|
|
{semi} {
|
|
return EOS;
|
|
}
|
|
{bcl} {
|
|
return BCL;
|
|
}
|
|
{ecl} {
|
|
return ECL;
|
|
}
|
|
{qstring} {
|
|
yylval.cs.cp = yytext;
|
|
yylval.cs.len = yyleng;
|
|
return QSTRING;
|
|
}
|
|
{decstring} {
|
|
yylval.cs.cp = yytext;
|
|
yylval.cs.len = yyleng;
|
|
return DECSTRING;
|
|
}
|
|
{name} {
|
|
yylval.cs.cp = yytext;
|
|
yylval.cs.len = yyleng;
|
|
return NAME;
|
|
}
|
|
{ipv4addr} {
|
|
memset(&yylval.addr4, 0, sizeof(struct in_addr));
|
|
if (inet_pton(AF_INET, yytext,
|
|
&yylval.addr4) == 1) {
|
|
return IPV4ADDR;
|
|
} else {
|
|
return ERROR;
|
|
}
|
|
}
|
|
{ipv6addr} {
|
|
memset(&yylval.addr6, 0, sizeof(struct in6_addr));
|
|
if (inet_pton(AF_INET6, yytext,
|
|
&yylval.addr6) == 1) {
|
|
return IPV6ADDR;
|
|
} else {
|
|
return ERROR;
|
|
}
|
|
}
|
|
{ipaddrmask} {
|
|
yytext++;
|
|
yylval.num = atoi(yytext);
|
|
return(PREFIXLEN);
|
|
}
|
|
{hostname} {
|
|
yylval.cs.cp = yytext;
|
|
yylval.cs.len = yyleng;
|
|
return HOSTNAME;
|
|
}
|
|
%%
|
|
|
|
int parse(FILE **fp)
|
|
{
|
|
extern int yyparse(void);
|
|
|
|
yyin = *fp;
|
|
|
|
if (yyparse())
|
|
return(-1);
|
|
|
|
return(0);
|
|
|
|
}
|
|
|
|
void
|
|
yyerror(const char *s)
|
|
{
|
|
printf("%s: at %s in line %d\n", s, yytext, lineno);
|
|
}
|