mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-25 00:50:22 +00:00
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()
|
||||
{
|
||||
Vector<char, 128> number_buffer;
|
||||
Vector<char, 128> fraction_buffer;
|
||||
|
||||
bool is_double = false;
|
||||
for (;;) {
|
||||
char ch = peek();
|
||||
if (ch == '.') {
|
||||
is_double = true;
|
||||
++m_index;
|
||||
continue;
|
||||
}
|
||||
if (ch == '-' || (ch >= '0' && ch <= '9')) {
|
||||
number_buffer.append(ch);
|
||||
if (is_double)
|
||||
fraction_buffer.append(ch);
|
||||
else
|
||||
number_buffer.append(ch);
|
||||
++m_index;
|
||||
continue;
|
||||
}
|
||||
|
@ -202,11 +213,31 @@ JsonValue JsonParser::parse_number()
|
|||
}
|
||||
|
||||
StringView number_string(number_buffer.data(), number_buffer.size());
|
||||
StringView fraction_string(fraction_buffer.data(), fraction_buffer.size());
|
||||
bool ok;
|
||||
auto value = JsonValue(number_string.to_uint(ok));
|
||||
if (!ok)
|
||||
value = JsonValue(number_string.to_int(ok));
|
||||
ASSERT(ok);
|
||||
JsonValue value;
|
||||
|
||||
if (is_double) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue