Commit 0202fc5a authored by Kazunori Fujiwara's avatar Kazunori Fujiwara

[3015] Rewrote to use boost::lexical cast to convert string to values

parent 5d8b4032
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include <climits> #include <climits>
#include <boost/algorithm/string.hpp> // for iequals #include <boost/algorithm/string.hpp> // for iequals
#include <boost/lexical_cast.hpp>
#include <cmath> #include <cmath>
...@@ -90,7 +91,7 @@ Element::getValue(std::map<std::string, ConstElementPtr>&) const { ...@@ -90,7 +91,7 @@ Element::getValue(std::map<std::string, ConstElementPtr>&) const {
} }
bool bool
Element::setValue(const int64_t) { Element::setValue(const long long int) {
return (false); return (false);
} }
...@@ -399,38 +400,21 @@ numberFromStringstream(std::istream& in, int& pos) { ...@@ -399,38 +400,21 @@ numberFromStringstream(std::istream& in, int& pos) {
// //
ElementPtr ElementPtr
fromStringstreamNumber(std::istream& in, int& pos) { fromStringstreamNumber(std::istream& in, int& pos) {
long long int i;
double d = 0.0;
bool is_double = false;
char* endptr;
std::string number = numberFromStringstream(in, pos); std::string number = numberFromStringstream(in, pos);
errno = 0; if (number.find_first_of(".eE") < number.size()) {
i = strtoll(number.c_str(), &endptr, 10); try {
if (*endptr != '\0') { return (Element::create(boost::lexical_cast<double>(number)));
const char* ptr; } catch (const boost::bad_lexical_cast&) {
errno = 0; isc_throw(JSONError, std::string("Number overflow: ") + number);
d = strtod(ptr = number.c_str(), &endptr);
is_double = true;
if (*endptr != '\0' || ptr == endptr) {
isc_throw(JSONError, std::string("Bad number: ") + number);
} else {
if (errno != 0) {
isc_throw(JSONError, std::string("Number overflow: ") + number);
}
} }
} else { } else {
if ((i == LLONG_MAX || i == LLONG_MIN) && errno != 0) { try {
return (Element::create(boost::lexical_cast<int64_t>(number)));
} catch (const boost::bad_lexical_cast&) {
isc_throw(JSONError, std::string("Number overflow: ") + number); isc_throw(JSONError, std::string("Number overflow: ") + number);
} }
} }
if (is_double) {
return (Element::create(d));
} else {
return (Element::create(i));
}
} }
ElementPtr ElementPtr
......
...@@ -167,7 +167,9 @@ public: ...@@ -167,7 +167,9 @@ public:
/// is of the correct type /// is of the correct type
/// ///
//@{ //@{
virtual bool setValue(const int64_t v); virtual bool setValue(const long long int v);
bool setValue(const long int i) { return (setValue(static_cast<long long int>(i))); };
bool setValue(const int i) { return (setValue(static_cast<long long int>(i))); };
virtual bool setValue(const double v); virtual bool setValue(const double v);
virtual bool setValue(const bool t); virtual bool setValue(const bool t);
virtual bool setValue(const std::string& v); virtual bool setValue(const std::string& v);
...@@ -381,7 +383,7 @@ public: ...@@ -381,7 +383,7 @@ public:
using Element::getValue; using Element::getValue;
bool getValue(int64_t& t) const { t = i; return (true); } bool getValue(int64_t& t) const { t = i; return (true); }
using Element::setValue; using Element::setValue;
bool setValue(int64_t v) { i = v; return (true); } bool setValue(long long int v) { i = v; return (true); }
void toJSON(std::ostream& ss) const; void toJSON(std::ostream& ss) const;
bool equals(const Element& other) const; bool equals(const Element& other) const;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment