This commit is contained in:
Niels 2015-01-03 17:18:17 +01:00
parent 18364aac85
commit 764ed26c41
2 changed files with 49 additions and 43 deletions

View file

@ -242,6 +242,7 @@ JSON::JSON(JSON&& o) noexcept
: _type(std::move(o._type)), _value(std::move(o._value)) : _type(std::move(o._type)), _value(std::move(o._value))
{ {
// invalidate payload // invalidate payload
o._type = value_type::null;
o._value = {}; o._value = {};
} }
@ -1806,13 +1807,14 @@ JSON JSON::Parser::parse()
do do
{ {
// key // key
const auto key = parseString(); auto key = parseString();
// colon // colon
expect(':'); expect(':');
// value // value
result[std::move(key)] = parse(); result[std::move(key)] = parse();
key.clear();
} }
while (_current == ',' and next()); while (_current == ',' and next());
} }
@ -1870,23 +1872,28 @@ JSON JSON::Parser::parse()
return JSON(); return JSON();
} }
default: case ('-'):
case ('0'):
case ('1'):
case ('2'):
case ('3'):
case ('4'):
case ('5'):
case ('6'):
case ('7'):
case ('8'):
case ('9'):
{ {
if (std::isdigit(_current) || _current == '-') // remember position of number's first character
{ const auto _first_pos = _pos - 1;
// collect number in tmp string
std::string tmp;
do
{
tmp += _current;
}
while (next() and (std::isdigit(_current) || _current == '.' while (next() and (std::isdigit(_current) || _current == '.'
|| _current == 'e' || _current == 'E' || _current == 'e' || _current == 'E'
|| _current == '+' || _current == '-')); || _current == '+' || _current == '-'));
try try
{ {
const auto float_val = std::stod(tmp); const auto float_val = std::stod(_buffer.substr(_first_pos, _pos - _first_pos));
const auto int_val = static_cast<int>(float_val); const auto int_val = static_cast<int>(float_val);
// check if conversion loses precision // check if conversion loses precision
@ -1903,18 +1910,17 @@ JSON JSON::Parser::parse()
} }
catch (...) catch (...)
{ {
error("error while translating " + tmp + " to number"); error("error translating " +
_buffer.substr(_first_pos, _pos - _first_pos) + " to number");
}
} }
break; default:
}
else
{ {
error("unexpected character"); error("unexpected character");
} }
} }
} }
}
/*! /*!
This function reads the next character from the buffer while ignoring all This function reads the next character from the buffer while ignoring all

View file

@ -415,7 +415,7 @@ class JSON
/// raise an exception with an error message /// raise an exception with an error message
inline void error(const std::string&) __attribute__((noreturn)); inline void error(const std::string&) __attribute__((noreturn));
/// parse a quoted string /// parse a quoted string
std::string parseString(); inline std::string parseString();
/// parse a Boolean "true" /// parse a Boolean "true"
inline void parseTrue(); inline void parseTrue();
/// parse a Boolean "false" /// parse a Boolean "false"
@ -423,7 +423,7 @@ class JSON
/// parse a null object /// parse a null object
inline void parseNull(); inline void parseNull();
/// a helper function to expect a certain character /// a helper function to expect a certain character
void expect(const char); inline void expect(const char);
private: private:
/// a buffer of the input /// a buffer of the input