{
}
-EvalContext::~EvalContext()
-{
+EvalContext::~EvalContext() {
}
bool
}
bool
-EvalContext::parseString(const std::string& str, ParserType type)
-{
+EvalContext::parseString(const std::string& str, ParserType type) {
file_ = "<string>";
string_ = str;
scanStringBegin(type);
}
void
-EvalContext::error(const isc::eval::location& loc, const std::string& what)
-{
+EvalContext::error(const isc::eval::location& loc, const std::string& what) {
isc_throw(EvalParseError, loc << ": " << what);
}
void
-EvalContext::error (const std::string& what)
-{
+EvalContext::error (const std::string& what) {
isc_throw(EvalParseError, what);
}
uint16_t
EvalContext::convertOptionCode(const std::string& option_code,
- const isc::eval::location& loc)
-{
+ const isc::eval::location& loc) {
int n = 0;
try {
n = boost::lexical_cast<int>(option_code);
uint16_t
EvalContext::convertOptionName(const std::string& option_name,
- const isc::eval::location& loc)
-{
+ const isc::eval::location& loc) {
const std::string global_space = (option_universe_ == Option::V4) ?
DHCP4_OPTION_SPACE : DHCP6_OPTION_SPACE;
int8_t
EvalContext::convertNestLevelNumber(const std::string& nest_level,
- const isc::eval::location& loc)
-{
+ const isc::eval::location& loc) {
int8_t n = convertInt8(nest_level, loc);
if (option_universe_ == Option::V6) {
if ((n < - HOP_COUNT_LIMIT) || (n >= HOP_COUNT_LIMIT)) {
uint8_t
EvalContext::convertUint8(const std::string& number,
- const isc::eval::location& loc)
-{
- int n = 0;
+ const isc::eval::location& loc) {
+ int32_t n = 0;
try {
- n = boost::lexical_cast<int>(number);
+ n = boost::lexical_cast<int32_t>(number);
} catch (const boost::bad_lexical_cast &) {
error(loc, "Invalid integer value in " + number);
}
int8_t
EvalContext::convertInt8(const std::string& number,
- const isc::eval::location& loc)
-{
- int n = 0;
+ const isc::eval::location& loc) {
+ int32_t n = 0;
try {
- n = boost::lexical_cast<int>(number);
+ n = boost::lexical_cast<int32_t>(number);
} catch (const boost::bad_lexical_cast &) {
error(loc, "Invalid integer value in " + number);
}
if (n < std::numeric_limits<int8_t>::min() ||
n > std::numeric_limits<int8_t>::max()) {
error(loc, "Invalid value in "
- + number + ". Allowed range: 0..255");
+ + number + ". Allowed range: -128..127");
}
- return (static_cast<uint8_t>(n));
+ return (static_cast<int8_t>(n));
+}
+
+uint16_t
+EvalContext::convertUint16(const std::string& number,
+ const isc::eval::location& loc) {
+ int64_t n = 0;
+ try {
+ n = boost::lexical_cast<int64_t>(number);
+ } catch (const boost::bad_lexical_cast &) {
+ error(loc, "Invalid value in " + number);
+ }
+ if (n < 0 || n > std::numeric_limits<uint16_t>::max()) {
+ error(loc, "Invalid value in "
+ + number + ". Allowed range: 0..65535");
+ }
+
+ return (static_cast<uint16_t>(n));
+}
+
+int16_t
+EvalContext::convertInt16(const std::string& number,
+ const isc::eval::location& loc) {
+ uint64_t n = 0;
+ try {
+ n = boost::lexical_cast<int64_t>(number);
+ } catch (const boost::bad_lexical_cast &) {
+ error(loc, "Invalid value in " + number);
+ }
+ if (n > std::numeric_limits<int16_t>::max() ||
+ n < std::numeric_limits<int16_t>::max()) {
+ error(loc, "Invalid value in "
+ + number + ". Allowed range: -32768..32767");
+ }
+
+ return (static_cast<int16_t>(n));
}
uint32_t
EvalContext::convertUint32(const std::string& number,
- const isc::eval::location& loc)
-{
- uint64_t n = 0;
+ const isc::eval::location& loc) {
+ int64_t n = 0;
try {
- n = boost::lexical_cast<uint64_t>(number);
+ n = boost::lexical_cast<int64_t>(number);
} catch (const boost::bad_lexical_cast &) {
error(loc, "Invalid value in " + number);
}
- if (n > std::numeric_limits<uint32_t>::max()) {
+ if (n < 0 || n > std::numeric_limits<uint32_t>::max()) {
error(loc, "Invalid value in "
+ number + ". Allowed range: 0..4294967295");
}
return (static_cast<uint32_t>(n));
}
+int32_t
+EvalContext::convertInt32(const std::string& number,
+ const isc::eval::location& loc) {
+ int64_t n = 0;
+ try {
+ n = boost::lexical_cast<int64_t>(number);
+ } catch (const boost::bad_lexical_cast &) {
+ error(loc, "Invalid value in " + number);
+ }
+ if (n > std::numeric_limits<int32_t>::max() ||
+ n < std::numeric_limits<int32_t>::max()) {
+ error(loc, "Invalid value in "
+ + number + ". Allowed range: -2147483648..2147483647");
+ }
+
+ return (static_cast<int32_t>(n));
+}
+
std::string
EvalContext::fromUint32(const uint32_t integer) {
std::string tmp(4, 0);
return (tmp);
}
+std::string
+EvalContext::fromUint16(const uint16_t integer) {
+ std::string tmp(2, 0);
+ tmp[0] = (integer >> 8) & 0xff;
+ tmp[1] = integer & 0xff;
+
+ return (tmp);
+}
+
bool
EvalContext::isClientClassDefined(const ClientClass& client_class) {
return (check_defined_(client_class));
}
void
-EvalContext::fatal (const std::string& what)
-{
+EvalContext::fatal(const std::string& what) {
isc_throw(Unexpected, what);
}
/// @brief Evaluation context, an interface to the expression evaluation.
-class EvalContext
-{
+class EvalContext {
public:
/// @brief Specifies what type of expression the parser is expected to see
static uint32_t convertUint32(const std::string& number,
const isc::eval::location& loc);
+ /// @brief Attempts to convert string to signed 32bit integer
+ ///
+ /// @param number string to be converted
+ /// @param loc the location of the token
+ /// @return the integer value
+ /// @throw EvalParseError if conversion fails or the value is out of range.
+ static int32_t convertInt32(const std::string& number,
+ const isc::eval::location& loc);
+
+ /// @brief Attempts to convert string to unsigned 16bit integer
+ ///
+ /// For reverse conversion, see @ref fromUint16
+ ///
+ /// @param number string to be converted
+ /// @param loc the location of the token
+ /// @return the integer value
+ /// @throw EvalParseError if conversion fails or the value is out of range.
+ static uint16_t convertUint16(const std::string& number,
+ const isc::eval::location& loc);
+
+ /// @brief Attempts to convert string to signed 16bit integer
+ ///
+ /// @param number string to be converted
+ /// @param loc the location of the token
+ /// @return the integer value
+ /// @throw EvalParseError if conversion fails or the value is out of range.
+ static int16_t convertInt16(const std::string& number,
+ const isc::eval::location& loc);
+
/// @brief Attempts to convert string to unsigned 8bit integer
///
/// @param number string to be converted
int8_t convertNestLevelNumber(const std::string& nest_level,
const isc::eval::location& loc);
- /// @brief Converts integer to string representation
+ /// @brief Converts unsigned 32bit integer to string representation
///
/// The integer is coded as a 4 byte long string in network order, e.g.
/// 6 is represented as 00000006. For reverse conversion, see
/// @return 4 byte long string that encodes the value.
static std::string fromUint32(const uint32_t integer);
+ /// @brief Converts unsigned 16bit integer to string representation
+ ///
+ /// The integer is coded as a 2 byte long string in network order, e.g.
+ /// 6 is represented as 0006. For reverse conversion, see
+ /// @ref convertUint16.
+ ///
+ /// @param integer value to be converted
+ /// @return 2 byte long string that encodes the value.
+ static std::string fromUint16(const uint16_t integer);
+
/// @brief Returns the universe (v4 or v6)
///
/// @return universe
};
-}; // end of isc::eval namespace
-}; // end of isc namespace
+} // end of isc::eval namespace
+} // end of isc namespace
#endif