aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2019-05-06 22:11:52 +0300
committerSergey Poznyakoff <gray@gnu.org>2019-05-06 22:11:52 +0300
commitb40eb82c9a837d0338593d475d90402629c1b000 (patch)
tree50781297310b12848fc25803a953c0119ada4d48
parentad71eb9107a378b6a1351a5e9c6295880c3849fa (diff)
downloadrush-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.h1
-rw-r--r--src/cfgram.y28
-rw-r--r--src/cflex.l40
3 files changed, 45 insertions, 24 deletions
diff --git a/src/cf.h b/src/cf.h
index 4ba1800..ada2420 100644
--- a/src/cf.h
+++ b/src/cf.h
@@ -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)
{

Return to:

Send suggestions and report system problems to the System administrator.