bird/conf/confbase.Y
Martin Mares e0f2e42f4f A couple of filter tweaks:
o  Introduced struct filter which serves as an external reference
      to filter. Using struct symbol for this is unwise since it doesn't
      allow extra information attached to the filter and it also forces
      all filters to be named.
   o  Implemented config rule 'filter' which matches either named filter
      or an embedded unnamed filter (`{ <filter> }').
   o  Fixed totally bogus comment at the top of filter.h.
   o  Added a missing prototype for f_run() to filter.h.
1999-03-17 14:29:39 +00:00

111 lines
1.9 KiB
Plaintext

/*
* BIRD -- Configuration Parser Top
*
* (c) 1998--1999 Martin Mares <mj@ucw.cz>
*
* Can be freely distributed and used under the terms of the GNU GPL.
*/
CF_HDR
#include "nest/bird.h"
#include "conf/conf.h"
#include "lib/resource.h"
#include "lib/socket.h"
#include "lib/timer.h"
#include "nest/protocol.h"
#include "nest/iface.h"
#include "nest/route.h"
#include "filter/filter.h"
CF_DECLS
%union {
int i;
ip_addr a;
struct symbol *s;
char *t;
struct f_inst *x;
struct filter *f;
}
%token END
%token <i> NUM
%token <a> IPA
%token <s> SYM
%token <t> TEXT
%type <i> expr bool pxlen
%left '='
%left '+' '-'
%left '*' '/' '%'
CF_KEYWORDS(DEFINE, ON, OFF, YES, NO)
CF_GRAMMAR
/* Basic config file structure */
config: conf_entries END {
return 0;
}
;
conf_entries:
/* EMPTY */
| conf_entries conf ';'
;
CF_ADDTO(conf, /* EMPTY */)
/* Constant expressions */
expr:
NUM
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); }
| expr '%' expr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); }
| '(' expr ')' { $$ = $2; }
| SYM { if ($1->class != SYM_NUMBER) cf_error("Number expected"); else $$ = $1->aux; }
;
CF_ADDTO(conf, definition)
definition:
DEFINE SYM '=' expr {
if ($2->class != SYM_VOID) cf_error("Symbol already defined");
$2->class = SYM_NUMBER;
$2->aux = $4;
}
;
/* Switches */
bool:
expr {$$ = !!$1; }
| ON { $$ = 1; }
| YES { $$ = 1; }
| OFF { $$ = 0; }
| NO { $$ = 0; }
| /* Silence means agreement */ { $$ = 1; }
;
/* Prefixes and netmasks */
pxlen:
'/' NUM {
if ($2 < 0 || $2 > 32) cf_error("Invalid prefix length %d", $2);
$$ = $2;
}
| ':' IPA {
$$ = ipa_mklen($2);
if ($$ < 0) cf_error("Invalid netmask %I", $2);
}
;
CF_CODE
CF_END