#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
};
-// To avoid the call to exit... oops!
+/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::dhcp::Parser4Context::fatal(msg)
%}
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) {
"<?" 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);
<*>{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();
}
{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);
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];
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 + "\"");
}
} 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++;
} 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);
}
\"{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));
}
":" { return isc::dhcp::Dhcp4Parser::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::dhcp::Dhcp4Parser::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 {
loc_.initialize(&file_);
yy_flex_debug = trace_scanning_;
YY_BUFFER_STATE buffer;
- buffer = yy_scan_bytes(str.c_str(), str.size());
+ buffer = parser4__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 */
}
}
yy_flex_debug = trace_scanning_;
YY_BUFFER_STATE buffer;
- // See dhcp4_lexer.cc header for available definitions
+ /* See dhcp4_lexer.cc header for available definitions */
buffer = parser4__create_buffer(f, 65536 /*buffer size*/);
if (!buffer) {
fatal("cannot scan file " + filename);
fclose(sfile_);
sfile_ = 0;
static_cast<void>(parser4_lex_destroy());
- // Close files
+ /* Close files */
while (!sfiles_.empty()) {
FILE* f = sfiles_.back();
if (f) {
}
sfiles_.pop_back();
}
- // Delete states
+ /* Delete states */
while (!states_.empty()) {
parser4__delete_buffer(states_.back());
states_.pop_back();
}
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?"); }
};
}
#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
};
-// To avoid the call to exit... oops!
+/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::dhcp::Parser6Context::fatal(msg)
%}
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) {
"<?" 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);
<*>{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();
}
}
{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);
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];
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 + "\"");
}
} 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++;
} 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);
}
\"{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));
}
":" { return isc::dhcp::Dhcp6Parser::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::dhcp::Dhcp6Parser::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 {
loc_.initialize(&file_);
yy_flex_debug = trace_scanning_;
YY_BUFFER_STATE buffer;
- buffer = yy_scan_bytes(str.c_str(), str.size());
+ buffer = parser6__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 */
}
}
yy_flex_debug = trace_scanning_;
YY_BUFFER_STATE buffer;
- // See dhcp6_lexer.cc header for available definitions
+ /* See dhcp6_lexer.cc header for available definitions */
buffer = parser6__create_buffer(f, 65536 /*buffer size*/);
if (!buffer) {
fatal("cannot scan file " + filename);
fclose(sfile_);
sfile_ = 0;
static_cast<void>(parser6_lex_destroy());
- // Close files
+ /* Close files */
while (!sfiles_.empty()) {
FILE* f = sfiles_.back();
if (f) {
}
sfiles_.pop_back();
}
- // Delete states
+ /* Delete states */
while (!states_.empty()) {
parser6__delete_buffer(states_.back());
states_.pop_back();
}
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?"); }
};
}
#include <asiolink/io_address.h>
#include <boost/lexical_cast.hpp>
-// 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
-// The location of the current token. The lexer will keep updating it. This
-// variable will be useful for logging errors.
+/* The location of the current token. The lexer will keep updating it. This
+ variable will be useful for logging errors. */
static isc::eval::location loc;
-// To avoid the call to exit... oops!
+/* To avoid the call to exit... oops! */
#define YY_FATAL_ERROR(msg) isc::eval::EvalContext::fatal(msg)
%}
addr6 [0-9a-fA-F]*\:[0-9a-fA-F]*\:[0-9a-fA-F:.]*
%{
-// 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 loc.columns(evalleng);
%}
%%
%{
- // Code run each time evallex is called.
+ /* Code run each time evallex is called. */
loc.step();
%}
{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. */
loc.step();
}
[\n]+ {
- // Newline found. Let's update the location and continue.
+ /* Newline found. Let's update the location and continue. */
loc.lines(evalleng);
loc.step();
}
\'[^\'\n]*\' {
- // 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 tmp(evaltext+1);
tmp.resize(tmp.size() - 1);
}
0[xX]{hex} {
- // A hex string has been matched. It contains the '0x' or '0X' header
- // followed by at least one hexadecimal digit.
+ /* A hex string has been matched. It contains the '0x' or '0X' header
+ followed by at least one hexadecimal digit. */
return isc::eval::EvalParser::make_HEXSTRING(evaltext, loc);
}
{int} {
- // An integer was found.
+ /* An integer was found. */
std::string tmp(evaltext);
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. */
static_cast<void>(boost::lexical_cast<int64_t>(tmp));
} catch (const boost::bad_lexical_cast &) {
driver.error(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::eval::EvalParser::make_INTEGER(tmp, loc);
}
[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.
+ /* 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);
}
{addr4}|{addr6} {
- // IPv4 or IPv6 address
+ /* IPv4 or IPv6 address */
std::string tmp(evaltext);
- // Some incorrect addresses can match so we have to check.
+ /* Some incorrect addresses can match so we have to check. */
try {
isc::asiolink::IOAddress ip(tmp);
} catch (...) {
buffer = eval_scan_bytes(string_.c_str(), string_.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 */
}
}
}
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?"); }
};
}