AK: Add parsing of JSON double values
This patch adds the parsing of double values to the JSON parser. There is another char buffer that get's filled when a "." is present in the number parsing. When number finished, a divider is calculated to transform the number behind the "." to the actual fraction value.
This commit is contained in:
parent
45921328e4
commit
bca5762542
Notes:
sideshowbarker
2024-07-19 08:08:43 +09:00
Author: https://github.com/lnzero1dev Commit: https://github.com/SerenityOS/serenity/commit/bca57625429 Pull-request: https://github.com/SerenityOS/serenity/pull/1510
1 changed files with 36 additions and 5 deletions
|
@ -191,10 +191,21 @@ JsonValue JsonParser::parse_string()
|
||||||
JsonValue JsonParser::parse_number()
|
JsonValue JsonParser::parse_number()
|
||||||
{
|
{
|
||||||
Vector<char, 128> number_buffer;
|
Vector<char, 128> number_buffer;
|
||||||
|
Vector<char, 128> fraction_buffer;
|
||||||
|
|
||||||
|
bool is_double = false;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
char ch = peek();
|
char ch = peek();
|
||||||
|
if (ch == '.') {
|
||||||
|
is_double = true;
|
||||||
|
++m_index;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (ch == '-' || (ch >= '0' && ch <= '9')) {
|
if (ch == '-' || (ch >= '0' && ch <= '9')) {
|
||||||
number_buffer.append(ch);
|
if (is_double)
|
||||||
|
fraction_buffer.append(ch);
|
||||||
|
else
|
||||||
|
number_buffer.append(ch);
|
||||||
++m_index;
|
++m_index;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -202,11 +213,31 @@ JsonValue JsonParser::parse_number()
|
||||||
}
|
}
|
||||||
|
|
||||||
StringView number_string(number_buffer.data(), number_buffer.size());
|
StringView number_string(number_buffer.data(), number_buffer.size());
|
||||||
|
StringView fraction_string(fraction_buffer.data(), fraction_buffer.size());
|
||||||
bool ok;
|
bool ok;
|
||||||
auto value = JsonValue(number_string.to_uint(ok));
|
JsonValue value;
|
||||||
if (!ok)
|
|
||||||
value = JsonValue(number_string.to_int(ok));
|
if (is_double) {
|
||||||
ASSERT(ok);
|
int whole = number_string.to_uint(ok);
|
||||||
|
if (!ok)
|
||||||
|
whole = number_string.to_int(ok);
|
||||||
|
ASSERT(ok);
|
||||||
|
|
||||||
|
int fraction = fraction_string.to_uint(ok);
|
||||||
|
ASSERT(ok);
|
||||||
|
|
||||||
|
auto divider = 1;
|
||||||
|
for (size_t i = 0; i < fraction_buffer.size(); ++i) {
|
||||||
|
divider *= 10;
|
||||||
|
}
|
||||||
|
value = JsonValue((double)whole + ((double)fraction / divider));
|
||||||
|
} else {
|
||||||
|
value = JsonValue(number_string.to_uint(ok));
|
||||||
|
if (!ok)
|
||||||
|
value = JsonValue(number_string.to_int(ok));
|
||||||
|
ASSERT(ok);
|
||||||
|
}
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue