Commit 69f9ca1e authored by Francis Dupont's avatar Francis Dupont

[master] Finishing merge of trac5106 (flex 2.6.2 compat)

parents 44908c5f 2e4c196d
......@@ -15,10 +15,12 @@
#include <exceptions/exceptions.h>
#include <cc/dhcp_config_error.h>
// Work around an incompatibility in flex (at least versions
// 2.5.31 through 2.5.33): it generates code that does
// not conform to C89. See Debian bug 333231
// <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.
/* Please avoid C++ style comments (// ... eol) as they break flex 2.6.2 */
/* Work around an incompatibility in flex (at least versions
2.5.31 through 2.5.33): it generates code that does
not conform to C89. See Debian bug 333231
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
# undef yywrap
# define yywrap() 1
......@@ -34,7 +36,7 @@ using isc::agent::AgentParser;
};
// To avoid the call to exit... oops!
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::agent::ParserContext::fatal(msg)
%}
......@@ -87,28 +89,28 @@ ControlCharacter [\x00-\x1f]
ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
%{
// This code run each time a pattern is matched. It updates the location
// by moving it ahead by yyleng bytes. yyleng specifies the length of the
// currently matched token.
/* This code run each time a pattern is matched. It updates the location
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng);
%}
%%
%{
// This part of the code is copied over to the verbatim to the top
// of the generated yylex function. Explanation:
// http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html
/* This part of the code is copied over to the verbatim to the top
of the generated yylex function. Explanation:
http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html */
// Code run each time yylex is called.
/* Code run each time yylex is called. */
driver.loc_.step();
// We currently have 3 points of entries defined:
// START_JSON - which expects any valid JSON
// START_AGENT - which expects full configuration (with outer map and Control-agent
// object in it.
// START_SUB_AGENT - which expects only content of the Control-agent, this is
// primarily useful for testing.
/* We currently have 3 points of entries defined:
START_JSON - which expects any valid JSON
START_AGENT - which expects full configuration (with outer map and Control-agent
object in it.
START_SUB_AGENT - which expects only content of the Control-agent, this is
primarily useful for testing. */
if (start_token_flag) {
start_token_flag = false;
switch (start_token_value) {
......@@ -141,9 +143,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
"<?" BEGIN(DIR_ENTER);
<DIR_ENTER>"include" BEGIN(DIR_INCLUDE);
<DIR_INCLUDE>\"([^\"\n])+\" {
// Include directive.
/* Include directive. */
// Extract the filename.
/* Extract the filename. */
std::string tmp(yytext+1);
tmp.resize(tmp.size() - 1);
......@@ -156,12 +158,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
<*>{blank}+ {
// Ok, we found a with space. Let's ignore it and update loc variable.
/* Ok, we found a with space. Let's ignore it and update loc variable. */
driver.loc_.step();
}
<*>[\n]+ {
// Newline found. Let's update the location and continue.
/* Newline found. Let's update the location and continue. */
driver.loc_.lines(yyleng);
driver.loc_.step();
}
......@@ -402,9 +404,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
{JSONString} {
// A string has been matched. It contains the actual string and single quotes.
// We need to get those quotes out of the way and just use its content, e.g.
// for 'foo' we should get foo
/* A string has been matched. It contains the actual string and single quotes.
We need to get those quotes out of the way and just use its content, e.g.
for 'foo' we should get foo */
std::string raw(yytext+1);
size_t len = raw.size() - 1;
raw.resize(len);
......@@ -415,12 +417,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
char c = raw[pos];
switch (c) {
case '"':
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
case '\\':
++pos;
if (pos >= len) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Overflow escape in \"" + raw + "\"");
}
c = raw[pos];
......@@ -446,10 +448,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
decoded.push_back('\t');
break;
case 'u':
// support only \u0000 to \u00ff
/* support only \u0000 to \u00ff */
++pos;
if (pos + 4 > len) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_,
"Overflow unicode escape in \"" + raw + "\"");
}
......@@ -465,7 +467,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b = (c - 'a' + 10) << 4;
} else {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
}
pos++;
......@@ -477,19 +479,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b |= c - 'a' + 10;
} else {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
}
decoded.push_back(static_cast<char>(b & 0xff));
break;
default:
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Bad escape in \"" + raw + "\"");
}
break;
default:
if ((c >= 0) && (c < 0x20)) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Invalid control in \"" + raw + "\"");
}
decoded.push_back(c);
......@@ -500,17 +502,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
\"{JSONStringCharacter}*{ControlCharacter}{ControlCharacterFill}*\" {
// Bad string with a forbidden control character inside
/* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
}
\"{JSONStringCharacter}*\\{BadJSONEscapeSequence}[^\x00-\x1f"]*\" {
// Bad string with a bad escape inside
/* Bad string with a bad escape inside */
driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
}
\"{JSONStringCharacter}*\\\" {
// Bad string with an open escape at the end
/* Bad string with an open escape at the end */
driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
}
......@@ -522,25 +524,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
":" { return AgentParser::make_COLON(driver.loc_); }
{int} {
// An integer was found.
/* An integer was found. */
std::string tmp(yytext);
int64_t integer = 0;
try {
// In substring we want to use negative values (e.g. -1).
// In enterprise-id we need to use values up to 0xffffffff.
// To cover both of those use cases, we need at least
// int64_t.
/* In substring we want to use negative values (e.g. -1).
In enterprise-id we need to use values up to 0xffffffff.
To cover both of those use cases, we need at least
int64_t. */
integer = boost::lexical_cast<int64_t>(tmp);
} catch (const boost::bad_lexical_cast &) {
driver.error(driver.loc_, "Failed to convert " + tmp + " to an integer.");
}
// The parser needs the string form as double conversion is no lossless
/* The parser needs the string form as double conversion is no lossless */
return AgentParser::make_INTEGER(integer, driver.loc_);
}
[-+]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)? {
// A floating point was found.
/* A floating point was found. */
std::string tmp(yytext);
double fp = 0.0;
try {
......@@ -610,7 +612,7 @@ ParserContext::scanStringBegin(const std::string& str, ParserType parser_type)
buffer = agent__scan_bytes(str.c_str(), str.size());
if (!buffer) {
fatal("cannot scan string");
// fatal() throws an exception so this can't be reached
/* fatal() throws an exception so this can't be reached */
}
}
......@@ -628,7 +630,7 @@ ParserContext::scanFileBegin(FILE * f,
yy_flex_debug = trace_scanning_;
YY_BUFFER_STATE buffer;
// See dhcp6_lexer.cc header for available definitions
/* See agent_lexer.cc header for available definitions */
buffer = agent__create_buffer(f, 65536 /*buffer size*/);
if (!buffer) {
fatal("cannot scan file " + filename);
......@@ -642,7 +644,7 @@ ParserContext::scanEnd() {
fclose(sfile_);
sfile_ = 0;
static_cast<void>(agent_lex_destroy());
// Close files
/* Close files */
while (!sfiles_.empty()) {
FILE* f = sfiles_.back();
if (f) {
......@@ -650,7 +652,7 @@ ParserContext::scanEnd() {
}
sfiles_.pop_back();
}
// Delete states
/* Delete states */
while (!states_.empty()) {
agent__delete_buffer(states_.back());
states_.pop_back();
......@@ -687,9 +689,9 @@ ParserContext::includeFile(const std::string& filename) {
}
namespace {
/// To avoid unused function error
/** To avoid unused function error */
class Dummy {
// cppcheck-suppress unusedPrivateFunction
/* cppcheck-suppress unusedPrivateFunction */
void dummy() { yy_fatal_error("Fix me: how to disable its definition?"); }
};
}
......@@ -14,10 +14,12 @@
#include <boost/lexical_cast.hpp>
#include <exceptions/exceptions.h>
// Work around an incompatibility in flex (at least versions
// 2.5.31 through 2.5.33): it generates code that does
// not conform to C89. See Debian bug 333231
// <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.
/* Please avoid C++ style comments (// ... eol) as they break flex 2.6.2 */
/* Work around an incompatibility in flex (at least versions
2.5.31 through 2.5.33): it generates code that does
not conform to C89. See Debian bug 333231
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
# undef yywrap
# define yywrap() 1
......@@ -30,7 +32,7 @@ unsigned int comment_start_line = 0;
};
// To avoid the call to exit... oops!
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::d2::D2ParserContext::fatal(msg)
%}
......@@ -83,20 +85,20 @@ ControlCharacter [\x00-\x1f]
ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
%{
// This code run each time a pattern is matched. It updates the location
// by moving it ahead by yyleng bytes. yyleng specifies the length of the
// currently matched token.
/* This code run each time a pattern is matched. It updates the location
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng);
%}
%%
%{
// This part of the code is copied over to the verbatim to the top
// of the generated yylex function. Explanation:
// http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html
/* This part of the code is copied over to the verbatim to the top
of the generated yylex function. Explanation:
http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html */
// Code run each time yylex is called.
/* Code run each time yylex is called. */
driver.loc_.step();
if (start_token_flag) {
......@@ -141,9 +143,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
"<?" BEGIN(DIR_ENTER);
<DIR_ENTER>"include" BEGIN(DIR_INCLUDE);
<DIR_INCLUDE>\"([^\"\n])+\" {
// Include directive.
/* Include directive. */
// Extract the filename.
/* Extract the filename. */
std::string tmp(yytext+1);
tmp.resize(tmp.size() - 1);
......@@ -156,12 +158,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
<*>{blank}+ {
// Ok, we found a with space. Let's ignore it and update loc variable.
/* Ok, we found a with space. Let's ignore it and update loc variable. */
driver.loc_.step();
}
<*>[\n]+ {
// Newline found. Let's update the location and continue.
/* Newline found. Let's update the location and continue. */
driver.loc_.lines(yyleng);
driver.loc_.step();
}
......@@ -467,9 +469,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
{JSONString} {
// A string has been matched. It contains the actual string and single quotes.
// We need to get those quotes out of the way and just use its content, e.g.
// for 'foo' we should get foo
/* A string has been matched. It contains the actual string and single quotes.
We need to get those quotes out of the way and just use its content, e.g.
for 'foo' we should get foo */
std::string raw(yytext+1);
size_t len = raw.size() - 1;
raw.resize(len);
......@@ -480,12 +482,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
char c = raw[pos];
switch (c) {
case '"':
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
case '\\':
++pos;
if (pos >= len) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Overflow escape in \"" + raw + "\"");
}
c = raw[pos];
......@@ -511,10 +513,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
decoded.push_back('\t');
break;
case 'u':
// support only \u0000 to \u00ff
/* support only \u0000 to \u00ff */
++pos;
if (pos + 4 > len) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_,
"Overflow unicode escape in \"" + raw + "\"");
}
......@@ -530,7 +532,7 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b = (c - 'a' + 10) << 4;
} else {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
}
pos++;
......@@ -542,19 +544,19 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
} else if ((c >= 'a') && (c <= 'f')) {
b |= c - 'a' + 10;
} else {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Not hexadecimal in unicode escape in \"" + raw + "\"");
}
decoded.push_back(static_cast<char>(b & 0xff));
break;
default:
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Bad escape in \"" + raw + "\"");
}
break;
default:
if ((c >= 0) && (c < 0x20)) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Invalid control in \"" + raw + "\"");
}
decoded.push_back(c);
......@@ -565,17 +567,17 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
}
\"{JSONStringCharacter}*{ControlCharacter}{ControlCharacterFill}*\" {
// Bad string with a forbidden control character inside
/* Bad string with a forbidden control character inside */
driver.error(driver.loc_, "Invalid control in " + std::string(yytext));
}
\"{JSONStringCharacter}*\\{BadJSONEscapeSequence}[^\x00-\x1f"]*\" {
// Bad string with a bad escape inside
/* Bad string with a bad escape inside */
driver.error(driver.loc_, "Bad escape in " + std::string(yytext));
}
\"{JSONStringCharacter}*\\\" {
// Bad string with an open escape at the end
/* Bad string with an open escape at the end */
driver.error(driver.loc_, "Overflow escape in " + std::string(yytext));
}
......@@ -587,25 +589,25 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
":" { return isc::d2::D2Parser::make_COLON(driver.loc_); }
{int} {
// An integer was found.
/* An integer was found. */
std::string tmp(yytext);
int64_t integer = 0;
try {
// In substring we want to use negative values (e.g. -1).
// In enterprise-id we need to use values up to 0xffffffff.
// To cover both of those use cases, we need at least
// int64_t.
/* In substring we want to use negative values (e.g. -1).
In enterprise-id we need to use values up to 0xffffffff.
To cover both of those use cases, we need at least
int64_t. */
integer = boost::lexical_cast<int64_t>(tmp);
} catch (const boost::bad_lexical_cast &) {
driver.error(driver.loc_, "Failed to convert " + tmp + " to an integer.");
}
// The parser needs the string form as double conversion is no lossless
/* The parser needs the string form as double conversion is no lossless */
return isc::d2::D2Parser::make_INTEGER(integer, driver.loc_);
}
[-+]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)? {
// A floating point was found.
/* A floating point was found. */
std::string tmp(yytext);
double fp = 0.0;
try {
......@@ -675,7 +677,7 @@ D2ParserContext::scanStringBegin(const std::string& str, ParserType parser_type)
buffer = d2_parser__scan_bytes(str.c_str(), str.size());
if (!buffer) {
fatal("cannot scan string");
// fatal() throws an exception so this can't be reached
/* fatal() throws an exception so this can't be reached */
}
}
......@@ -693,7 +695,7 @@ D2ParserContext::scanFileBegin(FILE * f,
yy_flex_debug = trace_scanning_;
YY_BUFFER_STATE buffer;
// See d2_lexer.cc header for available definitions
/* See d2_lexer.cc header for available definitions */
buffer = d2_parser__create_buffer(f, 65536 /*buffer size*/);
if (!buffer) {
fatal("cannot scan file " + filename);
......@@ -707,7 +709,7 @@ D2ParserContext::scanEnd() {
fclose(sfile_);
sfile_ = 0;
static_cast<void>(d2_parser_lex_destroy());
// Close files
/* Close files */
while (!sfiles_.empty()) {
FILE* f = sfiles_.back();
if (f) {
......@@ -715,7 +717,7 @@ D2ParserContext::scanEnd() {
}
sfiles_.pop_back();
}
// Delete states
/* Delete states */
while (!states_.empty()) {
d2_parser__delete_buffer(states_.back());
states_.pop_back();
......@@ -752,9 +754,9 @@ D2ParserContext::includeFile(const std::string& filename) {
}
namespace {
/// To avoid unused function error
/** To avoid unused function error */
class Dummy {
// cppcheck-suppress unusedPrivateFunction
/* cppcheck-suppress unusedPrivateFunction */
void dummy() { yy_fatal_error("Fix me: how to disable its definition?"); }
};
}
......@@ -14,10 +14,12 @@
#include <boost/lexical_cast.hpp>
#include <exceptions/exceptions.h>
// Work around an incompatibility in flex (at least versions
// 2.5.31 through 2.5.33): it generates code that does
// not conform to C89. See Debian bug 333231
// <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.
/* Please avoid C++ style comments (// ... eol) as they break flex 2.6.2 */
/* Work around an incompatibility in flex (at least versions
2.5.31 through 2.5.33): it generates code that does
not conform to C89. See Debian bug 333231
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
# undef yywrap
# define yywrap() 1
......@@ -30,7 +32,7 @@ unsigned int comment_start_line = 0;
};
// To avoid the call to exit... oops!
/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg)
%}
......@@ -83,20 +85,20 @@ ControlCharacter [\x00-\x1f]
ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
%{
// This code run each time a pattern is matched. It updates the location
// by moving it ahead by yyleng bytes. yyleng specifies the length of the
// currently matched token.
/* This code run each time a pattern is matched. It updates the location
by moving it ahead by yyleng bytes. yyleng specifies the length of the
currently matched token. */
#define YY_USER_ACTION driver.loc_.columns(yyleng);
%}
%%
%{
// This part of the code is copied over to the verbatim to the top
// of the generated yylex function. Explanation:
// http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html
/* This part of the code is copied over to the verbatim to the top
of the generated yylex function. Explanation:
http://www.gnu.org/software/bison/manual/html_node/Multiple-start_002dsymbols.html */
// Code run each time yylex is called.
/* Code run each time yylex is called. */
driver.loc_.step();
if (start_token_flag) {
......@@ -145,9 +147,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
"<?" BEGIN(DIR_ENTER);
<DIR_ENTER>"include" BEGIN(DIR_INCLUDE);
<DIR_INCLUDE>\"([^\"\n])+\" {
// Include directive.
/* Include directive. */
// Extract the filename.
/* Extract the filename. */
std::string tmp(yytext+1);
tmp.resize(tmp.size() - 1);
......@@ -160,12 +162,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
<*>{blank}+ {
// Ok, we found a with space. Let's ignore it and update loc variable.
/* Ok, we found a with space. Let's ignore it and update loc variable. */
driver.loc_.step();
}
<*>[\n]+ {
// Newline found. Let's update the location and continue.
/* Newline found. Let's update the location and continue. */
driver.loc_.lines(yyleng);
driver.loc_.step();
}
......@@ -1283,9 +1285,9 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
{JSONString} {
// A string has been matched. It contains the actual string and single quotes.
// We need to get those quotes out of the way and just use its content, e.g.
// for 'foo' we should get foo
/* A string has been matched. It contains the actual string and single quotes.
We need to get those quotes out of the way and just use its content, e.g.
for 'foo' we should get foo */
std::string raw(yytext+1);
size_t len = raw.size() - 1;
raw.resize(len);
......@@ -1296,12 +1298,12 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
char c = raw[pos];
switch (c) {
case '"':
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Bad quote in \"" + raw + "\"");
case '\\':
++pos;
if (pos >= len) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_, "Overflow escape in \"" + raw + "\"");
}
c = raw[pos];
......@@ -1327,10 +1329,10 @@ ControlCharacterFill [^"\\]|\\{JSONEscapeSequence}
decoded.push_back('\t');
break;
case 'u':
// support only \u0000 to \u00ff
/* support only \u0000 to \u00ff */
++pos;
if (pos + 4 > len) {
// impossible condition
/* impossible condition */
driver.error(driver.loc_,
"Overflow unicode escape in \"" + raw + "\"");