2
0
mirror of https://gitlab.isc.org/isc-projects/kea synced 2025-09-01 06:25:34 +00:00

[602-kea-takes-a-long-time-to-process-an-invalid-configuration-file] Removed a variable trailing context rule in client class expression scan

This commit is contained in:
Francis Dupont
2019-06-06 14:07:19 +02:00
parent 86900123a8
commit aeab2b2362
2 changed files with 192 additions and 208 deletions

View File

@@ -719,69 +719,32 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
static const flex_int16_t yy_acclist[298] =
static const flex_int16_t yy_accept[213] =
{ 0,
55, 53, 54, 1, 53, 54, 2, 54, 53, 54,
47, 53, 54, 48, 53, 54, 52, 53, 54, 51,
53, 54, 53, 54, 46, 53, 54, 5, 53, 54,
5, 53, 54, 53, 54, 53, 54, 53, 54,16390,
53, 54,16390, 49, 53, 54, 50, 53, 54, 53,
54,16390, 53, 54,16390, 53, 54,16390, 53, 54,
16390, 53, 54,16390, 53, 54,16390, 53, 54,16390,
53, 54,16390, 53, 54,16390, 53, 54,16390, 53,
54,16390, 53, 54,16390, 53, 54,16390, 53, 54,
16390, 53, 54,16390, 53, 54,16390, 53, 54,16390,
0, 0, 55, 53, 1, 2, 53, 47, 48, 52,
51, 53, 46, 5, 5, 53, 53, 53, 53, 49,
50, 53, 53, 53, 53, 53, 53, 53, 53, 53,
53, 53, 53, 53, 53, 53, 53, 53, 1, 2,
0, 3, 5, 0, 5, 0, 0, 0, 0, 7,
8, 0, 0, 0, 0, 6, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 44, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 4, 7,
38, 43, 0, 0, 0, 20, 0, 0, 0, 15,
1, 2, 3, 5, 5, 7, 8,16390,16390, 8198,
16390,16390,16390,16390,16390,16390,16390,16390,16390,16390,
16390,16390,16390,16390,16390,16390,16390,16390,16390,16390,
44,16390,16390,16390,16390,16390,16390,16390,16390,16390,
16390,16390, 4, 7, 38,16390, 43,16390,16390,16390,
16390, 20,16390,16390,16390,16390, 15,16390,16390,16390,
16390,16390, 21,16390,16390, 23,16390,16390,16390, 42,
16390,16390,16390, 17,16390,16390,16390, 19,16390,16390,
16390,16390,16390,16390,16390,16390, 35,16390,16390,16390,
16390,16390, 24,16390,16390,16390,16390,16390,16390,16390,
0, 0, 0, 0, 21, 0, 23, 0, 0, 42,
0, 0, 17, 0, 0, 19, 0, 0, 0, 0,
0, 0, 0, 0, 35, 0, 0, 0, 0, 24,
0, 0, 0, 0, 0, 0, 0, 0, 22, 30,
0, 0, 0, 14, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 25, 18, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 26,
39, 0, 16, 27, 0, 40, 0, 45, 0, 9,
0, 10, 11, 29, 0, 0, 33, 28, 7, 0,
0, 0, 31, 0, 0, 32, 0, 0, 0, 13,
16390,16390, 22,16390, 30,16390,16390,16390,16390, 14,
16390,16390,16390,16390,16390,16390,16390,16390,16390,16390,
25,16390, 18,16390,16390,16390,16390,16390,16390,16390,
16390,16390,16390,16390,16390,16390, 26,16390, 39,16390,
16390, 16,16390, 27,16390,16390, 40,16390,16390, 45,
16390,16390, 9,16390,16390, 10,16390, 11,16390, 29,
16390,16390,16390, 33,16390, 28,16390, 7,16390,16390,
16390, 31,16390,16390,16390, 32,16390,16390,16390, 13,
16390, 12,16390,16390,16390,16390, 41,16390, 37,16390,
16390, 36,16390,16390,16390, 34,16390
} ;
static const flex_int16_t yy_accept[214] =
{ 0,
1, 1, 1, 2, 4, 7, 9, 11, 14, 17,
20, 23, 25, 28, 31, 34, 36, 38, 41, 44,
47, 50, 53, 56, 59, 62, 65, 68, 71, 74,
77, 80, 83, 86, 89, 92, 95, 98, 101, 102,
103, 103, 104, 105, 105, 106, 106, 106, 106, 106,
107, 108, 108, 108, 109, 110, 111, 112, 113, 114,
115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
125, 126, 127, 128, 129, 130, 131, 133, 134, 135,
136, 137, 138, 139, 140, 141, 142, 143, 143, 144,
145, 147, 149, 150, 151, 152, 154, 155, 156, 157,
159, 160, 161, 162, 163, 165, 166, 168, 169, 170,
172, 173, 174, 176, 177, 178, 180, 181, 182, 183,
184, 185, 185, 186, 187, 189, 190, 191, 192, 193,
195, 196, 197, 198, 199, 200, 201, 202, 203, 205,
207, 208, 209, 210, 212, 213, 214, 215, 215, 216,
217, 218, 219, 220, 221, 223, 225, 226, 227, 228,
229, 230, 231, 232, 233, 234, 235, 236, 237, 237,
239, 241, 242, 244, 246, 247, 249, 250, 252, 253,
255, 256, 258, 260, 262, 263, 264, 266, 268, 269,
270, 271, 272, 274, 275, 276, 278, 278, 279, 280,
282, 284, 285, 286, 287, 289, 291, 292, 294, 295,
296, 298, 298
12, 0, 0, 0, 41, 37, 0, 36, 0, 0,
34, 0
} ;
static const YY_CHAR yy_ec[256] =
@@ -976,38 +939,26 @@ static const flex_int32_t yy_rule_can_match_eol[55] =
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, };
static yy_state_type yy_last_accepting_state;
static char *yy_last_accepting_cpos;
extern int yy_flex_debug;
int yy_flex_debug = 1;
static const flex_int16_t yy_rule_linenum[54] =
{ 0,
106, 111, 117, 127, 133, 151, 158, 172, 173, 174,
175, 176, 177, 178, 179, 180, 181, 182, 183, 184,
185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
195, 196, 197, 198, 199, 200, 201, 202, 203, 204,
205, 206, 207, 208, 209, 210, 211, 212, 213, 214,
215, 216, 217
106, 111, 117, 127, 133, 151, 175, 189, 190, 191,
192, 193, 194, 195, 196, 197, 198, 199, 200, 201,
202, 203, 204, 205, 206, 207, 208, 209, 210, 211,
212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
222, 223, 224, 225, 226, 227, 228, 229, 230, 231,
232, 233, 234
} ;
static yy_state_type *yy_state_buf=0, *yy_state_ptr=0;
static char *yy_full_match;
static int yy_lp;
static int yy_looking_for_trail_begin = 0;
static int yy_full_lp;
static int *yy_full_state;
#define YY_TRAILING_MASK 0x2000
#define YY_TRAILING_HEAD_MASK 0x4000
#define REJECT \
{ \
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */ \
yy_cp = (yy_full_match); /* restore poss. backed-over text */ \
(yy_lp) = (yy_full_lp); /* restore orig. accepting pos. */ \
(yy_state_ptr) = (yy_full_state); /* restore orig. state */ \
yy_current_state = *(yy_state_ptr); /* restore curr. state */ \
++(yy_lp); \
goto find_rule; \
}
/* The intent behind this definition is that it'll catch
* any uses of REJECT which flex missed.
*/
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
@@ -1052,7 +1003,7 @@ namespace {
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::eval::EvalContext::fatal(msg)
#line 1055 "lexer.cc"
#line 1006 "lexer.cc"
/* noyywrap disables automatic rewinding for the next file to parse. Since we
always parse only a single string, there's no need to do any wraps. And
using yywrap requires linking with -lfl, which provides the default yywrap
@@ -1077,8 +1028,8 @@ namespace {
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION loc.columns(evalleng);
#line 1080 "lexer.cc"
#line 1081 "lexer.cc"
#line 1031 "lexer.cc"
#line 1032 "lexer.cc"
#define INITIAL 0
@@ -1328,12 +1279,6 @@ YY_DECL
YY_USER_INIT;
#endif
/* Create the reject buffer large enough to save one state per allowed character. */
if ( ! (yy_state_buf) )
(yy_state_buf) = (yy_state_type *)yyalloc(YY_STATE_BUF_SIZE );
if ( ! (yy_state_buf) )
YY_FATAL_ERROR( "out of dynamic memory in yylex()" );
if ( ! (yy_start) )
(yy_start) = 1; /* first start state */
@@ -1383,7 +1328,7 @@ YY_DECL
#line 1386 "lexer.cc"
#line 1331 "lexer.cc"
while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */
{
@@ -1400,14 +1345,15 @@ YY_DECL
/* %% [9.0] code to set up and find next match goes here */
yy_current_state = (yy_start);
(yy_state_ptr) = (yy_state_buf);
*(yy_state_ptr)++ = yy_current_state;
yy_match:
do
{
YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
if ( yy_accept[yy_current_state] )
{
(yy_last_accepting_state) = yy_current_state;
(yy_last_accepting_cpos) = yy_cp;
}
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
@@ -1415,50 +1361,15 @@ yy_match:
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
*(yy_state_ptr)++ = yy_current_state;
++yy_cp;
}
while ( yy_current_state != 212 );
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
yy_find_action:
/* %% [10.0] code to find the action number goes here */
yy_current_state = *--(yy_state_ptr);
(yy_lp) = yy_accept[yy_current_state];
find_rule: /* we branch to this label when backing up */
for ( ; ; ) /* until we find what rule we matched */
{
if ( (yy_lp) && (yy_lp) < yy_accept[yy_current_state + 1] )
{
yy_act = yy_acclist[(yy_lp)];
if ( yy_act & YY_TRAILING_HEAD_MASK ||
(yy_looking_for_trail_begin) )
{
if ( yy_act == (yy_looking_for_trail_begin) )
{
(yy_looking_for_trail_begin) = 0;
yy_act &= ~YY_TRAILING_HEAD_MASK;
break;
}
}
else if ( yy_act & YY_TRAILING_MASK )
{
(yy_looking_for_trail_begin) = yy_act & ~YY_TRAILING_MASK;
(yy_looking_for_trail_begin) |= YY_TRAILING_HEAD_MASK;
}
else
{
(yy_full_match) = yy_cp;
(yy_full_state) = (yy_state_ptr);
(yy_full_lp) = (yy_lp);
break;
}
++(yy_lp);
goto find_rule;
}
--yy_cp;
yy_current_state = *--(yy_state_ptr);
(yy_lp) = yy_accept[yy_current_state];
}
yy_act = yy_accept[yy_current_state];
YY_DO_BEFORE_ACTION;
@@ -1496,6 +1407,13 @@ do_action: /* This label is used only to access EOF actions. */
switch ( yy_act )
{ /* beginning of action switch */
/* %% [13.0] actions go here */
case 0: /* must back up */
/* undo the effects of YY_DO_BEFORE_ACTION */
*yy_cp = (yy_hold_char);
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
goto yy_find_action;
case 1:
YY_RULE_SETUP
#line 106 "lexer.ll"
@@ -1559,18 +1477,39 @@ YY_RULE_SETUP
YY_BREAK
case 6:
/* rule 6 can match eol */
*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
YY_LINENO_REWIND_TO(yy_cp - 1);
(yy_c_buf_p) = yy_cp -= 1;
YY_DO_BEFORE_ACTION; /* set up yytext again */
YY_RULE_SETUP
#line 151 "lexer.ll"
{
/* This string specifies option name starting with a letter
and further containing letters, digits, hyphens and
underscores and finishing by letters or digits. */
return isc::eval::EvalParser::make_OPTION_NAME(evaltext, loc);
/* Moved from a variable trailing context to C++ code as it was too slow */
std::string tmp(evaltext);
/* remove possible trailing blanks or newlines */
while (tmp.size() > 1) {
char last = tmp[tmp.size() - 1];
if ((last != ' ') && (last != '\t') && (last != '\n')) {
break;
}
if (last == '\n') {
/* Take embedded newlines into account */
/* Can make it more complex to handle spaces after the last
newline but currently keep it simple... */
loc.lines();
loc.step();
}
tmp.resize(tmp.size() - 1);
}
return isc::eval::EvalParser::make_OPTION_NAME(tmp, loc);
}
YY_BREAK
case 7:
YY_RULE_SETUP
#line 158 "lexer.ll"
#line 175 "lexer.ll"
{
/* IPv4 or IPv6 address */
std::string tmp(evaltext);
@@ -1587,244 +1526,244 @@ YY_RULE_SETUP
YY_BREAK
case 8:
YY_RULE_SETUP
#line 172 "lexer.ll"
#line 189 "lexer.ll"
return isc::eval::EvalParser::make_EQUAL(loc);
YY_BREAK
case 9:
YY_RULE_SETUP
#line 173 "lexer.ll"
#line 190 "lexer.ll"
return isc::eval::EvalParser::make_OPTION(loc);
YY_BREAK
case 10:
YY_RULE_SETUP
#line 174 "lexer.ll"
#line 191 "lexer.ll"
return isc::eval::EvalParser::make_RELAY4(loc);
YY_BREAK
case 11:
YY_RULE_SETUP
#line 175 "lexer.ll"
#line 192 "lexer.ll"
return isc::eval::EvalParser::make_RELAY6(loc);
YY_BREAK
case 12:
YY_RULE_SETUP
#line 176 "lexer.ll"
#line 193 "lexer.ll"
return isc::eval::EvalParser::make_PEERADDR(loc);
YY_BREAK
case 13:
YY_RULE_SETUP
#line 177 "lexer.ll"
#line 194 "lexer.ll"
return isc::eval::EvalParser::make_LINKADDR(loc);
YY_BREAK
case 14:
YY_RULE_SETUP
#line 178 "lexer.ll"
#line 195 "lexer.ll"
return isc::eval::EvalParser::make_TEXT(loc);
YY_BREAK
case 15:
YY_RULE_SETUP
#line 179 "lexer.ll"
#line 196 "lexer.ll"
return isc::eval::EvalParser::make_HEX(loc);
YY_BREAK
case 16:
YY_RULE_SETUP
#line 180 "lexer.ll"
#line 197 "lexer.ll"
return isc::eval::EvalParser::make_EXISTS(loc);
YY_BREAK
case 17:
YY_RULE_SETUP
#line 181 "lexer.ll"
#line 198 "lexer.ll"
return isc::eval::EvalParser::make_PKT(loc);
YY_BREAK
case 18:
YY_RULE_SETUP
#line 182 "lexer.ll"
#line 199 "lexer.ll"
return isc::eval::EvalParser::make_IFACE(loc);
YY_BREAK
case 19:
YY_RULE_SETUP
#line 183 "lexer.ll"
#line 200 "lexer.ll"
return isc::eval::EvalParser::make_SRC(loc);
YY_BREAK
case 20:
YY_RULE_SETUP
#line 184 "lexer.ll"
#line 201 "lexer.ll"
return isc::eval::EvalParser::make_DST(loc);
YY_BREAK
case 21:
YY_RULE_SETUP
#line 185 "lexer.ll"
#line 202 "lexer.ll"
return isc::eval::EvalParser::make_LEN(loc);
YY_BREAK
case 22:
YY_RULE_SETUP
#line 186 "lexer.ll"
#line 203 "lexer.ll"
return isc::eval::EvalParser::make_PKT4(loc);
YY_BREAK
case 23:
YY_RULE_SETUP
#line 187 "lexer.ll"
#line 204 "lexer.ll"
return isc::eval::EvalParser::make_CHADDR(loc);
YY_BREAK
case 24:
YY_RULE_SETUP
#line 188 "lexer.ll"
#line 205 "lexer.ll"
return isc::eval::EvalParser::make_HLEN(loc);
YY_BREAK
case 25:
YY_RULE_SETUP
#line 189 "lexer.ll"
#line 206 "lexer.ll"
return isc::eval::EvalParser::make_HTYPE(loc);
YY_BREAK
case 26:
YY_RULE_SETUP
#line 190 "lexer.ll"
#line 207 "lexer.ll"
return isc::eval::EvalParser::make_CIADDR(loc);
YY_BREAK
case 27:
YY_RULE_SETUP
#line 191 "lexer.ll"
#line 208 "lexer.ll"
return isc::eval::EvalParser::make_GIADDR(loc);
YY_BREAK
case 28:
YY_RULE_SETUP
#line 192 "lexer.ll"
#line 209 "lexer.ll"
return isc::eval::EvalParser::make_YIADDR(loc);
YY_BREAK
case 29:
YY_RULE_SETUP
#line 193 "lexer.ll"
#line 210 "lexer.ll"
return isc::eval::EvalParser::make_SIADDR(loc);
YY_BREAK
case 30:
YY_RULE_SETUP
#line 194 "lexer.ll"
#line 211 "lexer.ll"
return isc::eval::EvalParser::make_PKT6(loc);
YY_BREAK
case 31:
YY_RULE_SETUP
#line 195 "lexer.ll"
#line 212 "lexer.ll"
return isc::eval::EvalParser::make_MSGTYPE(loc);
YY_BREAK
case 32:
YY_RULE_SETUP
#line 196 "lexer.ll"
#line 213 "lexer.ll"
return isc::eval::EvalParser::make_TRANSID(loc);
YY_BREAK
case 33:
YY_RULE_SETUP
#line 197 "lexer.ll"
#line 214 "lexer.ll"
return isc::eval::EvalParser::make_VENDOR(loc);
YY_BREAK
case 34:
YY_RULE_SETUP
#line 198 "lexer.ll"
#line 215 "lexer.ll"
return isc::eval::EvalParser::make_VENDOR_CLASS(loc);
YY_BREAK
case 35:
YY_RULE_SETUP
#line 199 "lexer.ll"
#line 216 "lexer.ll"
return isc::eval::EvalParser::make_DATA(loc);
YY_BREAK
case 36:
YY_RULE_SETUP
#line 200 "lexer.ll"
#line 217 "lexer.ll"
return isc::eval::EvalParser::make_ENTERPRISE(loc);
YY_BREAK
case 37:
YY_RULE_SETUP
#line 201 "lexer.ll"
#line 218 "lexer.ll"
return isc::eval::EvalParser::make_SUBSTRING(loc);
YY_BREAK
case 38:
YY_RULE_SETUP
#line 202 "lexer.ll"
#line 219 "lexer.ll"
return isc::eval::EvalParser::make_ALL(loc);
YY_BREAK
case 39:
YY_RULE_SETUP
#line 203 "lexer.ll"
#line 220 "lexer.ll"
return isc::eval::EvalParser::make_CONCAT(loc);
YY_BREAK
case 40:
YY_RULE_SETUP
#line 204 "lexer.ll"
#line 221 "lexer.ll"
return isc::eval::EvalParser::make_IFELSE(loc);
YY_BREAK
case 41:
YY_RULE_SETUP
#line 205 "lexer.ll"
#line 222 "lexer.ll"
return isc::eval::EvalParser::make_TOHEXSTRING(loc);
YY_BREAK
case 42:
YY_RULE_SETUP
#line 206 "lexer.ll"
#line 223 "lexer.ll"
return isc::eval::EvalParser::make_NOT(loc);
YY_BREAK
case 43:
YY_RULE_SETUP
#line 207 "lexer.ll"
#line 224 "lexer.ll"
return isc::eval::EvalParser::make_AND(loc);
YY_BREAK
case 44:
YY_RULE_SETUP
#line 208 "lexer.ll"
#line 225 "lexer.ll"
return isc::eval::EvalParser::make_OR(loc);
YY_BREAK
case 45:
YY_RULE_SETUP
#line 209 "lexer.ll"
#line 226 "lexer.ll"
return isc::eval::EvalParser::make_MEMBER(loc);
YY_BREAK
case 46:
YY_RULE_SETUP
#line 210 "lexer.ll"
#line 227 "lexer.ll"
return isc::eval::EvalParser::make_DOT(loc);
YY_BREAK
case 47:
YY_RULE_SETUP
#line 211 "lexer.ll"
#line 228 "lexer.ll"
return isc::eval::EvalParser::make_LPAREN(loc);
YY_BREAK
case 48:
YY_RULE_SETUP
#line 212 "lexer.ll"
#line 229 "lexer.ll"
return isc::eval::EvalParser::make_RPAREN(loc);
YY_BREAK
case 49:
YY_RULE_SETUP
#line 213 "lexer.ll"
#line 230 "lexer.ll"
return isc::eval::EvalParser::make_LBRACKET(loc);
YY_BREAK
case 50:
YY_RULE_SETUP
#line 214 "lexer.ll"
#line 231 "lexer.ll"
return isc::eval::EvalParser::make_RBRACKET(loc);
YY_BREAK
case 51:
YY_RULE_SETUP
#line 215 "lexer.ll"
#line 232 "lexer.ll"
return isc::eval::EvalParser::make_COMA(loc);
YY_BREAK
case 52:
YY_RULE_SETUP
#line 216 "lexer.ll"
#line 233 "lexer.ll"
return isc::eval::EvalParser::make_ANY(loc);
YY_BREAK
case 53:
YY_RULE_SETUP
#line 217 "lexer.ll"
#line 234 "lexer.ll"
driver.error (loc, "Invalid character: " + std::string(evaltext));
YY_BREAK
case YY_STATE_EOF(INITIAL):
#line 218 "lexer.ll"
#line 235 "lexer.ll"
return isc::eval::EvalParser::make_END(loc);
YY_BREAK
case 54:
YY_RULE_SETUP
#line 219 "lexer.ll"
#line 236 "lexer.ll"
ECHO;
YY_BREAK
#line 1827 "lexer.cc"
#line 1766 "lexer.cc"
case YY_END_OF_BUFFER:
{
@@ -1894,7 +1833,8 @@ ECHO;
else
{
/* %% [14.0] code to do back-up for compressed tables and set up yy_cp goes here */
yy_cp = (yy_c_buf_p);
yy_cp = (yy_last_accepting_cpos);
yy_current_state = (yy_last_accepting_state);
goto yy_find_action;
}
}
@@ -2031,8 +1971,38 @@ static int yy_get_next_buffer (void)
while ( num_to_read <= 0 )
{ /* Not enough room in the buffer - grow it. */
YY_FATAL_ERROR(
"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
/* just a shorter name for the current buffer */
YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
int yy_c_buf_p_offset =
(int) ((yy_c_buf_p) - b->yy_ch_buf);
if ( b->yy_is_our_buffer )
{
int new_size = b->yy_buf_size * 2;
if ( new_size <= 0 )
b->yy_buf_size += b->yy_buf_size / 8;
else
b->yy_buf_size *= 2;
b->yy_ch_buf = (char *)
/* Include room in for 2 EOB chars. */
yyrealloc( (void *) b->yy_ch_buf,
(yy_size_t) (b->yy_buf_size + 2) );
}
else
/* Can't grow it, we don't own it. */
b->yy_ch_buf = NULL;
if ( ! b->yy_ch_buf )
YY_FATAL_ERROR(
"fatal error - scanner input buffer overflow" );
(yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
number_to_move - 1;
}
@@ -2100,13 +2070,15 @@ static int yy_get_next_buffer (void)
/* %% [15.0] code to get the start state into yy_current_state goes here */
yy_current_state = (yy_start);
(yy_state_ptr) = (yy_state_buf);
*(yy_state_ptr)++ = yy_current_state;
for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
{
/* %% [16.0] code to find the next state goes here */
YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
if ( yy_accept[yy_current_state] )
{
(yy_last_accepting_state) = yy_current_state;
(yy_last_accepting_cpos) = yy_cp;
}
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
@@ -2114,7 +2086,6 @@ static int yy_get_next_buffer (void)
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
*(yy_state_ptr)++ = yy_current_state;
}
return yy_current_state;
@@ -2133,8 +2104,14 @@ static int yy_get_next_buffer (void)
{
int yy_is_jam;
/* %% [17.0] code to find the next state, and perhaps do backing up, goes here */
char *yy_cp = (yy_c_buf_p);
YY_CHAR yy_c = 1;
if ( yy_accept[yy_current_state] )
{
(yy_last_accepting_state) = yy_current_state;
(yy_last_accepting_cpos) = yy_cp;
}
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
@@ -2143,8 +2120,6 @@ static int yy_get_next_buffer (void)
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
yy_is_jam = (yy_current_state == 212);
if ( ! yy_is_jam )
*(yy_state_ptr)++ = yy_current_state;
return yy_is_jam ? 0 : yy_current_state;
}
@@ -2803,11 +2778,6 @@ static int yy_init_globals (void)
(yy_init) = 0;
(yy_start) = 0;
(yy_state_buf) = 0;
(yy_state_ptr) = 0;
(yy_full_match) = 0;
(yy_lp) = 0;
/* Defined in main.c */
#ifdef YY_STDINIT
yyin = stdin;
@@ -2840,9 +2810,6 @@ int yylex_destroy (void)
yyfree((yy_buffer_stack) );
(yy_buffer_stack) = NULL;
yyfree ( (yy_state_buf) );
(yy_state_buf) = NULL;
/* Reset the globals. This is important in a non-reentrant scanner so the next time
* yylex() is called, initialization will occur. */
yy_init_globals( );
@@ -2908,7 +2875,7 @@ void yyfree (void * ptr )
/* %ok-for-header */
#line 219 "lexer.ll"
#line 236 "lexer.ll"
using namespace isc::eval;

View File

@@ -147,11 +147,28 @@ addr6 [0-9a-fA-F]*\:[0-9a-fA-F]*\:[0-9a-fA-F:.]*
return isc::eval::EvalParser::make_INTEGER(tmp, loc);
}
[A-Za-z]([-_A-Za-z0-9]*[A-Za-z0-9])?/({blank}|\n)*] {
[A-Za-z]([-_A-Za-z0-9]*[A-Za-z0-9])?({blank}|\n)*/] {
/* This string specifies option name starting with a letter
and further containing letters, digits, hyphens and
underscores and finishing by letters or digits. */
return isc::eval::EvalParser::make_OPTION_NAME(evaltext, loc);
/* Moved from a variable trailing context to C++ code as it was too slow */
std::string tmp(evaltext);
/* remove possible trailing blanks or newlines */
while (tmp.size() > 1) {
char last = tmp[tmp.size() - 1];
if ((last != ' ') && (last != '\t') && (last != '\n')) {
break;
}
if (last == '\n') {
/* Take embedded newlines into account */
/* Can make it more complex to handle spaces after the last
newline but currently keep it simple... */
loc.lines();
loc.step();
}
tmp.resize(tmp.size() - 1);
}
return isc::eval::EvalParser::make_OPTION_NAME(tmp, loc);
}
{addr4}|{addr6} {