diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-05-06 22:11:52 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-05-06 22:11:52 +0300 |
commit | b40eb82c9a837d0338593d475d90402629c1b000 (patch) | |
tree | 50781297310b12848fc25803a953c0119ada4d48 | |
parent | ad71eb9107a378b6a1351a5e9c6295880c3849fa (diff) | |
download | rush-b40eb82c9a837d0338593d475d90402629c1b000.tar.gz rush-b40eb82c9a837d0338593d475d90402629c1b000.tar.bz2 |
Change config format version recognition.
* src/cf.h (cflex_normal): New proto.
* src/cfgram.y: Change format version selection algorithm.
* src/cflex.l: Likewise.
-rw-r--r-- | src/cf.h | 1 | ||||
-rw-r--r-- | src/cfgram.y | 28 | ||||
-rw-r--r-- | src/cflex.l | 40 |
3 files changed, 45 insertions, 24 deletions
@@ -103,6 +103,7 @@ void cflex_setup(CFSTREAM *cf, char const *filename, int line); int cflex_include(char const *filename, struct cfloc const *loc); void cflex_pushargs(void); void cflex_popargs(void); +void cflex_normal(void); void skiptoeol(void); void restorenormal(void); diff --git a/src/cfgram.y b/src/cfgram.y index 51689d0..e4c5f29 100644 --- a/src/cfgram.y +++ b/src/cfgram.y @@ -60,13 +60,15 @@ static void add_asgn_list(struct asgn *head, enum envar_type type); struct argval *head; struct argval *tail; } arglist; + struct { unsigned major, minor; } version; } %token <str> STRING "string" %token <str> IDENT "identifier" %token <num> NUMBER "number" -%token PREFACE "\"rush VERSION\"" +%token RUSH "rush" +%token <version> T_VERSION %token RULE "\"rule\"" %token GLOBAL "\"global\"" %token EOL "end of line" @@ -118,7 +120,11 @@ static void add_asgn_list(struct asgn *head, enum envar_type type); %type <arglist> arglist %% -rcfile : PREFACE eol content +rcfile : skipeol select + ; + + +select : preface content { if (errors) YYERROR; @@ -130,6 +136,21 @@ rcfile : PREFACE eol content } ; +preface : RUSH T_VERSION EOL + { + if ($2.major == 2 && $2.minor == 0) { + cflex_normal(); + } else { + cferror(&@2, _("unsupported configuration file version")); + YYERROR; + } + } + ; + +skipeol : /* empty */ + | eol + ; + eol : EOL | eol EOL ; @@ -222,8 +243,9 @@ stmt : match_stmt eol | include_stmt eol | flowctl_stmt eol | attrib_stmt eol - | error { skiptoeol(); } eol + | error { + skiptoeol(); restorenormal(); yyerrok; yyclearin; diff --git a/src/cflex.l b/src/cflex.l index c83deb8..b8a41c4 100644 --- a/src/cflex.l +++ b/src/cflex.l @@ -169,16 +169,18 @@ stringbuf_add_escape_hex(struct stringbuf *sb, char const *text, size_t leng) %} %x NORMAL ARGS INMATCH QSTR VAR +%option nounput %% <INITIAL>{ -rush[ \t]+2\.0[ \t]*$ { - BEGIN(NORMAL); - return tok(PREFACE); - } -#.*\n { advance_line(1); } -\n+ { advance_line(yyleng); } -[ \t]+ reset_loc(); -. return tok(BOGUS); +"rush" return RUSH; +[0-9]+\.[0-9]+ { char *p; + yylval.version.major = strtoul(yytext, &p, 10); + yylval.version.minor = strtoul(p + 1, NULL, 10); + return tok(T_VERSION); } +#.*\n { advance_line(1); return EOL; } +\n+ { advance_line(yyleng); return EOL; } +[ \t]+ reset_loc(); +. return tok(BOGUS); } <NORMAL,INMATCH,ARGS>{ @@ -364,19 +366,9 @@ void skiptoeol(void) { int c; - extern int yychar; - - if (yychar == EOL) - return; - c = input(); - if (c == EOF) - return; - do { - if (c == '\n') { - break; - } - } while ((c = input()) != EOF); - unput('\n'); + + while ((c = input()) != EOF && c != '\n') + ; } void @@ -478,6 +470,12 @@ cflex_debug(int v) #endif } +void +cflex_normal(void) +{ + BEGIN(NORMAL); +} + int cflex_include(char const *filename, struct cfloc const *loc) { |