|
@@ -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?"); }
|
|
|
};
|
|
|
}
|