From: Francis Dupont Date: Fri, 18 Mar 2016 10:04:02 +0000 (+0100) Subject: [master] Finished merge of trac4232a (IP address literal) X-Git-Tag: trac4248_base~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=7917d94e55e4e1167f6220e34af6ea426d8ec043;p=thirdparty%2Fkea.git [master] Finished merge of trac4232a (IP address literal) --- 7917d94e55e4e1167f6220e34af6ea426d8ec043 diff --cc ChangeLog index b8f2e73ea9,eb48dfdd55..985abe9595 --- a/ChangeLog +++ b/ChangeLog @@@ -1,40 -1,3 +1,45 @@@ ++1090. [func] fdupont ++ Added support for IP address (IPv4 and IPv6) literals in ++ classification expressions. ++ (Trac #4232, git xxx) ++ +1089. [func] fdupont + Added relay4[X].exists method in classifications that checks + whether a sub-option is present in theDHCPv4 RAI (Relay Agent + Information, 82) option. + (Trac #4313, git 87397fd75215b69ad79708aaa1d7505aca299fb5) + +1088. [bug] fdupont + Protected DHCP server main() routines against errors raised from + logger calls in the error handler (aka double errors). + (Trac #4310, git 6813e1a7520335f6920ff8de5e52ecdb24712910) + +1087. [bug] fdupont + Empty option specifications no longer require setting the + csv-format parameter. + (Trac #4291, git 398458f3ad4680fd5f3c032eb6c99d50c2981368) + +1086. [func] marcin + The Host class has been extended to store DHCP options to + be assigned to a client. + (Trac #3571, git 9d434f28cc4683eccbcca1ba0d1e45bceb5230d2) + +1085. [bug] sar + Always copy the DHCPv4 flags field from a client's request to the + the server's resposne. + (Trac #4292, git 8b7182abdc7ff47eb9b68451e7507b7e4b9872e0) + +1084. [bug] fdupont + Removed obsolete requirement of python3 by --enable-generate-docs + configuration option. + (Trac #4315, git 2c236316d5fbac9906cf48a6e4df1649e7545e67) + +1083. [bug] marcin + When lease-database configuration parameter is not + specified the default lease database backend (memfile) + is used. + (Trac #3696, git 0be5e6eb32680a742ddcf427b8181f55c0c98115) + 1082. [func] fdupont The following DHCPv4 options are now supported: nisplus-domain-name (64), diff --cc src/lib/eval/lexer.cc index 1be686c8bc,14fbf2adc6..369dc36ce7 --- a/src/lib/eval/lexer.cc +++ b/src/lib/eval/lexer.cc @@@ -492,38 -469,41 +469,41 @@@ struct yy_trans_inf flex_int32_t yy_verify; flex_int32_t yy_nxt; }; - static yyconst flex_int16_t yy_acclist[128] = + static yyconst flex_int16_t yy_acclist[138] = { 0, - 27, 25, 26, 1, 25, 26, 2, 26, 25, 26, - 20, 25, 26, 21, 25, 26, 24, 25, 26, 25, - 26, 19, 25, 26, 5, 25, 26, 5, 25, 26, - 25, 26, 25, 26,16390, 22, 25, 26, 23, 25, - 26, 25, 26,16390, 25, 26,16390, 25, 26,16390, - 25, 26,16390, 25, 26,16390, 25, 26,16390, 25, - 26,16390, 25, 26,16390, 25, 26,16390, 1, 2, - 3, 5, 7,16390, 8198,16390,16390,16390,16390,16390, - 16390,16390, 18,16390,16390,16390,16390, 4, 14,16390, - 17,16390,16390,16390, 11,16390, 16,16390,16390,16390, - - 16390,16390,16390,16390,16390,16390,16390, 10,16390,16390, - 16390,16390,16390,16390, 15,16390, 12,16390, 8,16390, - 9,16390,16390,16390,16390, 13,16390 + 28, 26, 27, 1, 26, 27, 2, 27, 26, 27, + 21, 26, 27, 22, 26, 27, 25, 26, 27, 26, + 27, 20, 26, 27, 5, 26, 27, 5, 26, 27, + 26, 27, 26, 27, 26, 27,16390, 26, 27,16390, + 23, 26, 27, 24, 26, 27, 26, 27,16390, 26, + 27,16390, 26, 27,16390, 26, 27,16390, 26, 27, + 16390, 26, 27,16390, 26, 27,16390, 26, 27,16390, + 26, 27,16390, 1, 2, 3, 5, 5, 7, 8, + 16390,16390, 8198,16390,16390,16390,16390,16390,16390,16390, + 19,16390,16390,16390,16390, 4, 7, 15,16390, 18, + - 16390,16390,16390, 11,16390, 17,16390,16390,16390,16390, - 16390,16390,16390,16390,16390,16390, 10,16390,16390,16390, - 16390,16390,16390, 16,16390, 12,16390, 9,16390, 13, ++ 16390,16390,16390, 12,16390, 17,16390,16390,16390,16390, ++ 16390,16390,16390,16390,16390,16390, 11,16390,16390,16390, ++ 16390,16390,16390, 16,16390, 13,16390, 9,16390, 10, + 16390,16390, 7,16390,16390, 14,16390 } ; - static yyconst flex_int16_t yy_accept[82] = + static yyconst flex_int16_t yy_accept[97] = { 0, 1, 1, 1, 2, 4, 7, 9, 11, 14, 17, - 20, 22, 25, 28, 31, 33, 36, 39, 42, 45, - 48, 51, 54, 57, 60, 63, 66, 69, 70, 71, - 71, 72, 73, 73, 74, 74, 74, 75, 76, 77, - 78, 79, 80, 81, 82, 83, 85, 86, 87, 88, - 89, 91, 93, 94, 95, 97, 99, 100, 101, 102, - 103, 104, 105, 106, 107, 108, 110, 111, 112, 113, - 114, 115, 117, 119, 121, 123, 124, 125, 126, 128, - 128 + 20, 22, 25, 28, 31, 33, 35, 38, 41, 44, + 47, 50, 53, 56, 59, 62, 65, 68, 71, 74, + 75, 76, 76, 77, 78, 78, 79, 79, 79, 79, + 79, 80, 81, 81, 81, 82, 83, 84, 85, 86, + 87, 88, 89, 90, 91, 93, 94, 95, 96, 96, + 97, 98, 100, 102, 103, 104, 106, 108, 109, 110, + 111, 112, 112, 113, 114, 115, 116, 117, 119, 119, + 120, 121, 122, 123, 124, 124, 126, 128, 130, 132, + 133, 134, 135, 136, 138, 138 + } ; - static yyconst YY_CHAR yy_ec[256] = + static yyconst flex_int32_t yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@@ -1238,23 -1222,23 +1222,23 @@@ return isc::eval::EvalParser::make_OPTI YY_BREAK case 10: YY_RULE_SETUP - #line 128 "lexer.ll" - return isc::eval::EvalParser::make_TEXT(loc); + #line 145 "lexer.ll" -return isc::eval::EvalParser::make_TEXT(loc); ++return isc::eval::EvalParser::make_RELAY4(loc); YY_BREAK case 11: YY_RULE_SETUP - #line 129 "lexer.ll" - return isc::eval::EvalParser::make_HEX(loc); + #line 146 "lexer.ll" -return isc::eval::EvalParser::make_HEX(loc); ++return isc::eval::EvalParser::make_TEXT(loc); YY_BREAK case 12: YY_RULE_SETUP - #line 130 "lexer.ll" - return isc::eval::EvalParser::make_EXISTS(loc); + #line 147 "lexer.ll" -return isc::eval::EvalParser::make_EXISTS(loc); ++return isc::eval::EvalParser::make_HEX(loc); YY_BREAK case 13: YY_RULE_SETUP - #line 131 "lexer.ll" - return isc::eval::EvalParser::make_SUBSTRING(loc); + #line 148 "lexer.ll" -return isc::eval::EvalParser::make_RELAY4(loc); ++return isc::eval::EvalParser::make_EXISTS(loc); YY_BREAK case 14: YY_RULE_SETUP diff --cc src/lib/eval/lexer.ll index 0ad7285eba,3701d2d9f3..18a4b87591 --- a/src/lib/eval/lexer.ll +++ b/src/lib/eval/lexer.ll @@@ -122,9 -126,22 +126,23 @@@ addr6 [0-9a-fA-F]*\:[0-9a-fA-F]*\:[0-9a return isc::eval::EvalParser::make_OPTION_NAME(yytext, loc); } + {addr4}|{addr6} { + // IPv4 or IPv6 address + std::string tmp(yytext); + + // Some incorrect addresses can match so we have to check. + try { + isc::asiolink::IOAddress ip(tmp); + } catch (...) { + driver.error(loc, "Failed to convert " + tmp + " to an IP address."); + } + + return isc::eval::EvalParser::make_IP_ADDRESS(yytext, loc); + } + "==" return isc::eval::EvalParser::make_EQUAL(loc); "option" return isc::eval::EvalParser::make_OPTION(loc); +"relay4" return isc::eval::EvalParser::make_RELAY4(loc); "text" return isc::eval::EvalParser::make_TEXT(loc); "hex" return isc::eval::EvalParser::make_HEX(loc); "exists" return isc::eval::EvalParser::make_EXISTS(loc); diff --cc src/lib/eval/location.hh index effaa15add,92744a61cb..e5fd35d82b --- a/src/lib/eval/location.hh +++ b/src/lib/eval/location.hh @@@ -40,9 -41,9 +40,9 @@@ # include "position.hh" - #line 13 "parser.yy" // location.cc:296 -#line 13 "parser.yy" // location.cc:291 ++#line 13 "parser.yy" // location.cc:337 namespace isc { namespace eval { - #line 46 "location.hh" // location.cc:296 -#line 46 "location.hh" // location.cc:291 ++#line 46 "location.hh" // location.cc:337 /// Abstract a location. class location { @@@ -186,7 -182,7 +186,7 @@@ return ostr; } - #line 13 "parser.yy" // location.cc:296 -#line 13 "parser.yy" // location.cc:291 ++#line 13 "parser.yy" // location.cc:337 } } // isc::eval - #line 192 "location.hh" // location.cc:296 -#line 187 "location.hh" // location.cc:291 ++#line 192 "location.hh" // location.cc:337 #endif // !YY_YY_LOCATION_HH_INCLUDED diff --cc src/lib/eval/parser.cc index 0effbea998,d1d6150525..2887ba9461 --- a/src/lib/eval/parser.cc +++ b/src/lib/eval/parser.cc @@@ -334,44 -336,51 +336,51 @@@ namespace isc { namespace eval { case 21: // "constant string" --#line 72 "parser.yy" // lalr1.cc:636 ++#line 73 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } - #line 340 "parser.cc" // lalr1.cc:636 + #line 342 "parser.cc" // lalr1.cc:636 break; case 22: // "integer" --#line 72 "parser.yy" // lalr1.cc:636 ++#line 73 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } - #line 347 "parser.cc" // lalr1.cc:636 + #line 349 "parser.cc" // lalr1.cc:636 break; case 23: // "constant hexstring" --#line 72 "parser.yy" // lalr1.cc:636 ++#line 73 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } - #line 354 "parser.cc" // lalr1.cc:636 + #line 356 "parser.cc" // lalr1.cc:636 break; case 24: // "option name" --#line 72 "parser.yy" // lalr1.cc:636 ++#line 73 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< std::string > (); } - #line 361 "parser.cc" // lalr1.cc:636 + #line 363 "parser.cc" // lalr1.cc:636 break; - case 29: // option_code + case 25: // "ip address" --#line 72 "parser.yy" // lalr1.cc:636 ++#line 73 "parser.yy" // lalr1.cc:636 + { yyoutput << yysym.value.template as< std::string > (); } + #line 370 "parser.cc" // lalr1.cc:636 + break; + + case 30: // option_code + -#line 72 "parser.yy" // lalr1.cc:636 ++#line 73 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< uint16_t > (); } - #line 368 "parser.cc" // lalr1.cc:636 + #line 377 "parser.cc" // lalr1.cc:636 break; - case 30: // option_repr_type + case 31: // option_repr_type --#line 72 "parser.yy" // lalr1.cc:636 ++#line 73 "parser.yy" // lalr1.cc:636 { yyoutput << yysym.value.template as< TokenOption::RepresentationType > (); } - #line 375 "parser.cc" // lalr1.cc:636 + #line 384 "parser.cc" // lalr1.cc:636 break; @@@ -604,7 -614,7 +614,7 @@@ switch (yyn) { case 4: --#line 86 "parser.yy" // lalr1.cc:859 ++#line 87 "parser.yy" // lalr1.cc:859 { TokenPtr neg(new TokenNot()); ctx.expression.push_back(neg); @@@ -613,7 -623,7 +623,7 @@@ break; case 5: --#line 91 "parser.yy" // lalr1.cc:859 ++#line 92 "parser.yy" // lalr1.cc:859 { TokenPtr neg(new TokenAnd()); ctx.expression.push_back(neg); @@@ -622,7 -632,7 +632,7 @@@ break; case 6: --#line 96 "parser.yy" // lalr1.cc:859 ++#line 97 "parser.yy" // lalr1.cc:859 { TokenPtr neg(new TokenOr()); ctx.expression.push_back(neg); @@@ -631,7 -641,7 +641,7 @@@ break; case 7: --#line 101 "parser.yy" // lalr1.cc:859 ++#line 102 "parser.yy" // lalr1.cc:859 { TokenPtr eq(new TokenEqual()); ctx.expression.push_back(eq); @@@ -640,7 -650,7 +650,7 @@@ break; case 8: --#line 106 "parser.yy" // lalr1.cc:859 ++#line 107 "parser.yy" // lalr1.cc:859 { TokenPtr opt(new TokenOption(yystack_[3].value.as< uint16_t > (), TokenOption::EXISTS)); ctx.expression.push_back(opt); @@@ -649,58 -659,43 +659,67 @@@ break; case 9: - #line 111 "parser.yy" // lalr1.cc:859 -#line 113 "parser.yy" // lalr1.cc:859 ++#line 112 "parser.yy" // lalr1.cc:859 + { + switch (ctx.getUniverse()) { + case Option::V4: + { + TokenPtr opt(new TokenRelay4Option(yystack_[3].value.as< uint16_t > (), TokenOption::EXISTS)); + ctx.expression.push_back(opt); + break; + } + case Option::V6: + // We will have relay6[123] for the DHCPv6. + // In a very distant future we'll possibly be able + // to mix both if we have DHCPv4-over-DHCPv6, so it + // has some sense to make it explicit whether we + // talk about DHCPv4 relay or DHCPv6 relay. However, + // for the time being relay4 can be used in DHCPv4 + // only. + error(yystack_[5].location, "relay4 can only be used in DHCPv4."); + } + } - #line 673 "parser.cc" // lalr1.cc:859 ++#line 683 "parser.cc" // lalr1.cc:859 + break; + + case 10: - #line 133 "parser.yy" // lalr1.cc:859 ++#line 134 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(str); } - #line 682 "parser.cc" // lalr1.cc:859 -#line 668 "parser.cc" // lalr1.cc:859 ++#line 692 "parser.cc" // lalr1.cc:859 break; - case 10: -#line 118 "parser.yy" // lalr1.cc:859 + case 11: - #line 138 "parser.yy" // lalr1.cc:859 ++#line 139 "parser.yy" // lalr1.cc:859 { TokenPtr hex(new TokenHexString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(hex); } - #line 691 "parser.cc" // lalr1.cc:859 -#line 677 "parser.cc" // lalr1.cc:859 ++#line 701 "parser.cc" // lalr1.cc:859 break; - case 11: -#line 123 "parser.yy" // lalr1.cc:859 + case 12: - #line 143 "parser.yy" // lalr1.cc:859 ++#line 144 "parser.yy" // lalr1.cc:859 + { + TokenPtr ip(new TokenIpAddress(yystack_[0].value.as< std::string > ())); + ctx.expression.push_back(ip); + } -#line 686 "parser.cc" // lalr1.cc:859 ++#line 710 "parser.cc" // lalr1.cc:859 + break; + - case 12: -#line 128 "parser.yy" // lalr1.cc:859 ++ case 13: ++#line 149 "parser.yy" // lalr1.cc:859 { TokenPtr opt(new TokenOption(yystack_[3].value.as< uint16_t > (), yystack_[0].value.as< TokenOption::RepresentationType > ())); ctx.expression.push_back(opt); } - #line 700 "parser.cc" // lalr1.cc:859 -#line 695 "parser.cc" // lalr1.cc:859 ++#line 719 "parser.cc" // lalr1.cc:859 break; -- case 13: - #line 148 "parser.yy" // lalr1.cc:859 -#line 133 "parser.yy" // lalr1.cc:859 ++ case 14: ++#line 154 "parser.yy" // lalr1.cc:859 { switch (ctx.getUniverse()) { case Option::V4: @@@ -720,88 -715,88 +739,88 @@@ error(yystack_[5].location, "relay4 can only be used in DHCPv4."); } } - #line 724 "parser.cc" // lalr1.cc:859 -#line 719 "parser.cc" // lalr1.cc:859 ++#line 743 "parser.cc" // lalr1.cc:859 break; -- case 14: - #line 168 "parser.yy" // lalr1.cc:859 -#line 153 "parser.yy" // lalr1.cc:859 ++ case 15: ++#line 174 "parser.yy" // lalr1.cc:859 { TokenPtr sub(new TokenSubstring()); ctx.expression.push_back(sub); } - #line 733 "parser.cc" // lalr1.cc:859 -#line 728 "parser.cc" // lalr1.cc:859 ++#line 752 "parser.cc" // lalr1.cc:859 break; -- case 15: - #line 173 "parser.yy" // lalr1.cc:859 -#line 158 "parser.yy" // lalr1.cc:859 ++ case 16: ++#line 179 "parser.yy" // lalr1.cc:859 { TokenPtr conc(new TokenConcat()); ctx.expression.push_back(conc); } - #line 742 "parser.cc" // lalr1.cc:859 -#line 737 "parser.cc" // lalr1.cc:859 ++#line 761 "parser.cc" // lalr1.cc:859 break; -- case 16: - #line 180 "parser.yy" // lalr1.cc:859 -#line 165 "parser.yy" // lalr1.cc:859 ++ case 17: ++#line 186 "parser.yy" // lalr1.cc:859 { yylhs.value.as< uint16_t > () = ctx.convertOptionCode(yystack_[0].value.as< std::string > (), yystack_[0].location); } - #line 750 "parser.cc" // lalr1.cc:859 -#line 745 "parser.cc" // lalr1.cc:859 ++#line 769 "parser.cc" // lalr1.cc:859 break; -- case 17: - #line 184 "parser.yy" // lalr1.cc:859 -#line 169 "parser.yy" // lalr1.cc:859 ++ case 18: ++#line 190 "parser.yy" // lalr1.cc:859 { yylhs.value.as< uint16_t > () = ctx.convertOptionName(yystack_[0].value.as< std::string > (), yystack_[0].location); } - #line 758 "parser.cc" // lalr1.cc:859 -#line 753 "parser.cc" // lalr1.cc:859 ++#line 777 "parser.cc" // lalr1.cc:859 break; -- case 18: - #line 190 "parser.yy" // lalr1.cc:859 -#line 175 "parser.yy" // lalr1.cc:859 ++ case 19: ++#line 196 "parser.yy" // lalr1.cc:859 { yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::TEXTUAL; } - #line 766 "parser.cc" // lalr1.cc:859 -#line 761 "parser.cc" // lalr1.cc:859 ++#line 785 "parser.cc" // lalr1.cc:859 break; -- case 19: - #line 194 "parser.yy" // lalr1.cc:859 -#line 179 "parser.yy" // lalr1.cc:859 ++ case 20: ++#line 200 "parser.yy" // lalr1.cc:859 { yylhs.value.as< TokenOption::RepresentationType > () = TokenOption::HEXADECIMAL; } - #line 774 "parser.cc" // lalr1.cc:859 -#line 769 "parser.cc" // lalr1.cc:859 ++#line 793 "parser.cc" // lalr1.cc:859 break; -- case 20: - #line 200 "parser.yy" // lalr1.cc:859 -#line 185 "parser.yy" // lalr1.cc:859 ++ case 21: ++#line 206 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(str); } - #line 783 "parser.cc" // lalr1.cc:859 -#line 778 "parser.cc" // lalr1.cc:859 ++#line 802 "parser.cc" // lalr1.cc:859 break; -- case 21: - #line 207 "parser.yy" // lalr1.cc:859 -#line 192 "parser.yy" // lalr1.cc:859 ++ case 22: ++#line 213 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString(yystack_[0].value.as< std::string > ())); ctx.expression.push_back(str); } - #line 792 "parser.cc" // lalr1.cc:859 -#line 787 "parser.cc" // lalr1.cc:859 ++#line 811 "parser.cc" // lalr1.cc:859 break; -- case 22: - #line 212 "parser.yy" // lalr1.cc:859 -#line 197 "parser.yy" // lalr1.cc:859 ++ case 23: ++#line 218 "parser.yy" // lalr1.cc:859 { TokenPtr str(new TokenString("all")); ctx.expression.push_back(str); } - #line 801 "parser.cc" // lalr1.cc:859 -#line 796 "parser.cc" // lalr1.cc:859 ++#line 820 "parser.cc" // lalr1.cc:859 break; - #line 805 "parser.cc" // lalr1.cc:859 -#line 800 "parser.cc" // lalr1.cc:859 ++#line 824 "parser.cc" // lalr1.cc:859 default: break; } @@@ -1063,91 -1058,86 +1082,89 @@@ const signed char EvalParser::yypact_[] = { - -1, -1, -1, 1, 10, 28, 36, -29, -29, 32, - 0, 41, 29, -29, -7, -7, 17, 17, -29, -1, - -1, 17, -29, -29, -29, 38, 39, 42, 43, 37, - 40, -29, 46, -29, 44, 45, -7, -7, 47, 17, - 27, 30, 48, 49, -29, 51, 58, -29, -29, -29, - -29, -29, -29, 50, 52, -4, -29, 33, 33, -29, - -29, 60, -29 - -1, -17, -8, 4, -1, 12, -1, -18, -18, -18, - 35, 6, 36, 20, 7, 7, -18, 20, 18, -18, - -1, -1, 7, -18, -18, 26, 29, 31, 34, 32, - -18, -18, 41, -18, 38, 20, 37, 7, 39, 28, - 40, -18, 42, 43, 33, -18, -18, -18, -18, 47, - 15, -18, -18, 33, -18, -18, 45, -18 ++ -1, -1, -1, 24, 27, 18, 37, -29, -29, -29, ++ 50, 6, 43, 11, -29, 10, 10, 16, 16, -29, ++ -1, -1, 16, -29, -29, -29, 40, 41, 44, 45, ++ 35, 38, -29, 52, -29, 46, 47, 10, 10, 39, ++ 16, 28, 31, 51, 53, -29, 48, 58, -29, -29, ++ -29, -29, -29, -29, 55, 56, -15, -29, 34, 34, ++ -29, -29, 60, -29 }; const unsigned char EvalParser::yydefact_[] = { - 0, 0, 0, 0, 0, 0, 0, 10, 11, 0, - 2, 0, 0, 4, 0, 0, 0, 0, 1, 0, - 0, 0, 3, 16, 17, 0, 0, 0, 0, 0, - 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 0, 0, 18, 19, 8, - 12, 9, 13, 0, 0, 0, 15, 0, 0, 22, - 21, 0, 14 - 0, 0, 0, 0, 0, 0, 0, 9, 10, 11, - 0, 2, 0, 0, 0, 0, 4, 0, 0, 1, - 0, 0, 0, 16, 17, 0, 0, 0, 0, 0, - 3, 5, 6, 7, 0, 0, 0, 0, 0, 0, - 0, 20, 0, 0, 0, 18, 19, 8, 12, 0, - 0, 15, 13, 0, 22, 21, 0, 14 ++ 0, 0, 0, 0, 0, 0, 0, 10, 11, 12, ++ 0, 2, 0, 0, 4, 0, 0, 0, 0, 1, ++ 0, 0, 0, 3, 17, 18, 0, 0, 0, 0, ++ 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 21, 0, 0, 19, 20, ++ 8, 13, 9, 14, 0, 0, 0, 16, 0, 0, ++ 23, 22, 0, 15 }; const signed char EvalParser::yypgoto_[] = { - -29, -29, 9, -16, -12, -28, -29, -29 - -18, -18, 13, -14, -10, 11, -18, -18 ++ -29, -29, 9, -17, -10, -28, -29, -29 }; const signed char EvalParser::yydefgoto_[] = { - -1, 9, 10, 11, 25, 50, 45, 61 - -1, 10, 11, 12, 25, 48, 42, 56 ++ -1, 10, 11, 12, 26, 51, 46, 62 }; const unsigned char EvalParser::yytable_[] = { - 29, 30, 1, 26, 2, 33, 19, 20, 3, 4, - 12, 13, 14, 52, 59, 23, 5, 24, 60, 6, - 7, 15, 8, 46, 42, 43, 27, 28, 31, 32, - 52, 16, 18, 22, 5, 19, 20, 6, 7, 17, - 8, 47, 48, 49, 47, 48, 51, 47, 48, 21, - 34, 35, 19, 36, 37, 0, 38, 40, 41, 39, - 53, 54, 56, 57, 62, 58, 0, 0, 0, 44, - 55 - 27, 28, 13, 1, 2, 3, 4, 29, 33, 14, - 5, 26, 2, 3, 20, 21, 6, 16, 5, 18, - 7, 15, 8, 43, 9, 40, 20, 21, 7, 54, - 8, 17, 9, 31, 32, 19, 30, 55, 45, 22, - 46, 47, 23, 45, 24, 46, 34, 36, 35, 20, - 37, 0, 38, 39, 44, 52, 0, 0, 50, 41, - 49, 51, 53, 57 ++ 30, 31, 1, 60, 2, 34, 27, 61, 3, 4, ++ 13, 14, 20, 21, 53, 23, 5, 20, 21, 6, ++ 7, 17, 8, 47, 9, 28, 29, 43, 44, 32, ++ 33, 53, 24, 5, 25, 15, 6, 7, 16, 8, ++ 18, 9, 48, 49, 50, 48, 49, 52, 48, 49, ++ 19, 22, 35, 36, 39, 37, 38, 40, 20, 41, ++ 42, 45, 57, 54, 63, 55, 0, 56, 58, 59 }; const signed char EvalParser::yycheck_[] = { - 16, 17, 3, 15, 5, 21, 6, 7, 9, 10, - 1, 2, 11, 41, 18, 22, 17, 24, 22, 20, - 21, 11, 23, 39, 36, 37, 9, 10, 19, 20, - 58, 3, 0, 4, 17, 6, 7, 20, 21, 3, - 23, 14, 15, 16, 14, 15, 16, 14, 15, 8, - 12, 12, 6, 11, 11, -1, 19, 13, 13, 19, - 12, 12, 4, 13, 4, 13, -1, -1, -1, 22, - 19 - 14, 15, 19, 4, 5, 6, 7, 17, 22, 17, - 11, 4, 5, 6, 8, 9, 17, 4, 11, 6, - 21, 17, 23, 37, 25, 35, 8, 9, 21, 14, - 23, 19, 25, 20, 21, 0, 18, 22, 10, 3, - 12, 13, 22, 10, 24, 12, 20, 16, 19, 8, - 16, -1, 20, 15, 15, 44, -1, -1, 16, 22, - 20, 18, 15, 18 ++ 17, 18, 3, 18, 5, 22, 16, 22, 9, 10, ++ 1, 2, 6, 7, 42, 4, 17, 6, 7, 20, ++ 21, 3, 23, 40, 25, 9, 10, 37, 38, 20, ++ 21, 59, 22, 17, 24, 11, 20, 21, 11, 23, ++ 3, 25, 14, 15, 16, 14, 15, 16, 14, 15, ++ 0, 8, 12, 12, 19, 11, 11, 19, 6, 13, ++ 13, 22, 4, 12, 4, 12, -1, 19, 13, 13 }; const unsigned char EvalParser::yystos_[] = { - 0, 3, 5, 9, 10, 17, 20, 21, 23, 26, - 27, 28, 27, 27, 11, 11, 3, 3, 0, 6, - 7, 8, 4, 22, 24, 29, 29, 9, 10, 28, - 28, 27, 27, 28, 12, 12, 11, 11, 19, 19, - 13, 13, 29, 29, 22, 31, 28, 14, 15, 16, - 30, 16, 30, 12, 12, 19, 4, 13, 13, 18, - 22, 32, 4 - 0, 4, 5, 6, 7, 11, 17, 21, 23, 25, - 27, 28, 29, 19, 17, 17, 28, 19, 28, 0, - 8, 9, 3, 22, 24, 30, 4, 29, 29, 30, - 18, 28, 28, 29, 20, 19, 16, 16, 20, 15, - 30, 22, 32, 29, 15, 10, 12, 13, 31, 20, - 16, 18, 31, 15, 14, 22, 33, 18 ++ 0, 3, 5, 9, 10, 17, 20, 21, 23, 25, ++ 27, 28, 29, 28, 28, 11, 11, 3, 3, 0, ++ 6, 7, 8, 4, 22, 24, 30, 30, 9, 10, ++ 29, 29, 28, 28, 29, 12, 12, 11, 11, 19, ++ 19, 13, 13, 30, 30, 22, 32, 29, 14, 15, ++ 16, 31, 16, 31, 12, 12, 19, 4, 13, 13, ++ 18, 22, 33, 4 }; const unsigned char EvalParser::yyr1_[] = { - 0, 25, 26, 27, 27, 27, 27, 27, 27, 27, - 28, 28, 28, 28, 28, 28, 29, 29, 30, 30, - 31, 32, 32 - 0, 26, 27, 28, 28, 28, 28, 28, 28, 29, - 29, 29, 29, 29, 29, 29, 30, 30, 31, 31, - 32, 33, 33 ++ 0, 26, 27, 28, 28, 28, 28, 28, 28, 28, ++ 29, 29, 29, 29, 29, 29, 29, 30, 30, 31, ++ 31, 32, 33, 33 }; const unsigned char EvalParser::yyr2_[] = { - 0, 2, 1, 3, 2, 3, 3, 3, 6, 1, - 1, 1, 6, 6, 8, 6, 1, 1, 1, 1, - 1, 1, 1 + 0, 2, 1, 3, 2, 3, 3, 3, 6, 6, - 1, 1, 6, 6, 8, 6, 1, 1, 1, 1, - 1, 1, 1 ++ 1, 1, 1, 6, 6, 8, 6, 1, 1, 1, ++ 1, 1, 1, 1 }; @@@ -1157,22 -1147,22 +1174,22 @@@ const char* const EvalParser::yytname_[] = { - "\"end of file\"", "error", "$undefined", "\"==\"", "\"option\"", - "\"substring\"", "\"concat\"", "\"not\"", "\"and\"", "\"or\"", - "\"text\"", "\"relay4\"", "\"hex\"", "\"exists\"", "\"all\"", "\".\"", - "\",\"", "\"(\"", "\")\"", "\"[\"", "\"]\"", "\"constant string\"", - "\"integer\"", "\"constant hexstring\"", "\"option name\"", - "\"ip address\"", "$accept", "expression", "bool_expr", "string_expr", - "option_code", "option_repr_type", "start_expr", "length_expr", YY_NULLPTR + "\"end of file\"", "error", "$undefined", "\"(\"", "\")\"", "\"not\"", + "\"and\"", "\"or\"", "\"==\"", "\"option\"", "\"relay4\"", "\"[\"", + "\"]\"", "\".\"", "\"text\"", "\"hex\"", "\"exists\"", "\"substring\"", + "\"all\"", "\",\"", "\"concat\"", "\"constant string\"", "\"integer\"", - "\"constant hexstring\"", "\"option name\"", "$accept", "expression", - "bool_expr", "string_expr", "option_code", "option_repr_type", - "start_expr", "length_expr", YY_NULLPTR ++ "\"constant hexstring\"", "\"option name\"", "\"ip address\"", "$accept", ++ "expression", "bool_expr", "string_expr", "option_code", ++ "option_repr_type", "start_expr", "length_expr", YY_NULLPTR }; #if YYDEBUG const unsigned char EvalParser::yyrline_[] = { - 0, 81, 81, 84, 85, 90, 95, 100, 105, 110, - 132, 137, 142, 147, 167, 172, 179, 183, 189, 193, - 199, 206, 211 - 0, 81, 81, 84, 85, 90, 95, 100, 105, 112, - 117, 122, 127, 132, 152, 157, 164, 168, 174, 178, - 184, 191, 196 ++ 0, 82, 82, 85, 86, 91, 96, 101, 106, 111, ++ 133, 138, 143, 148, 153, 173, 178, 185, 189, 195, ++ 199, 205, 212, 217 }; // Print the state stack on the debug stream. @@@ -1207,8 -1197,8 +1224,8 @@@ #line 13 "parser.yy" // lalr1.cc:1167 } } // isc::eval - #line 1211 "parser.cc" // lalr1.cc:1167 - #line 218 "parser.yy" // lalr1.cc:1168 -#line 1201 "parser.cc" // lalr1.cc:1167 -#line 203 "parser.yy" // lalr1.cc:1168 ++#line 1228 "parser.cc" // lalr1.cc:1167 ++#line 224 "parser.yy" // lalr1.cc:1168 void isc::eval::EvalParser::error(const location_type& loc, diff --cc src/lib/eval/parser.h index 27e4a4320b,9638bd1c55..ac0e3971b3 --- a/src/lib/eval/parser.h +++ b/src/lib/eval/parser.h @@@ -758,12 -764,12 +764,12 @@@ namespace isc { namespace eval enum { yyeof_ = 0, - yylast_ = 70, ///< Last index in yytable_. - yylast_ = 63, ///< Last index in yytable_. ++ yylast_ = 69, ///< Last index in yytable_. yynnts_ = 8, ///< Number of nonterminal symbols. - yyfinal_ = 18, ///< Termination state number. + yyfinal_ = 19, ///< Termination state number. yyterror_ = 1, yyerrcode_ = 256, - yyntokens_ = 25 ///< Number of tokens. + yyntokens_ = 26 ///< Number of tokens. }; diff --cc src/lib/eval/position.hh index b3eebe04f6,5055601da3..4e09385e65 --- a/src/lib/eval/position.hh +++ b/src/lib/eval/position.hh @@@ -50,9 -51,9 +50,9 @@@ # endif # endif - #line 13 "parser.yy" // location.cc:296 -#line 13 "parser.yy" // location.cc:291 ++#line 13 "parser.yy" // location.cc:337 namespace isc { namespace eval { - #line 56 "position.hh" // location.cc:296 -#line 56 "position.hh" // location.cc:291 ++#line 56 "position.hh" // location.cc:337 /// Abstract a position. class position { @@@ -174,7 -175,7 +174,7 @@@ return ostr << pos.line << '.' << pos.column; } - #line 13 "parser.yy" // location.cc:296 -#line 13 "parser.yy" // location.cc:291 ++#line 13 "parser.yy" // location.cc:337 } } // isc::eval - #line 180 "position.hh" // location.cc:296 -#line 180 "position.hh" // location.cc:291 ++#line 180 "position.hh" // location.cc:337 #endif // !YY_YY_POSITION_HH_INCLUDED diff --cc src/lib/eval/stack.hh index 6bda37bbcf,71e91c2652..fa0d0d87a2 --- a/src/lib/eval/stack.hh +++ b/src/lib/eval/stack.hh @@@ -40,9 -41,9 +40,9 @@@ # include - #line 13 "parser.yy" // stack.hh:132 -#line 13 "parser.yy" // stack.hh:133 ++#line 13 "parser.yy" // stack.hh:151 namespace isc { namespace eval { - #line 46 "stack.hh" // stack.hh:132 -#line 46 "stack.hh" // stack.hh:133 ++#line 46 "stack.hh" // stack.hh:151 template > class stack { @@@ -150,8 -152,8 +150,8 @@@ unsigned int range_; }; - #line 13 "parser.yy" // stack.hh:132 -#line 13 "parser.yy" // stack.hh:133 ++#line 13 "parser.yy" // stack.hh:151 } } // isc::eval - #line 156 "stack.hh" // stack.hh:132 -#line 157 "stack.hh" // stack.hh:133 ++#line 156 "stack.hh" // stack.hh:151 #endif // !YY_YY_STACK_HH_INCLUDED