🚧 add object and string parser for BON8
This commit is contained in:
parent
e27c127068
commit
b932217c15
@ -2434,11 +2434,17 @@ class binary_reader
|
|||||||
case 0xFD:
|
case 0xFD:
|
||||||
return sax->number_float(1.0, "");
|
return sax->number_float(1.0, "");
|
||||||
|
|
||||||
default: // anything else
|
case 0xFE:
|
||||||
{
|
{
|
||||||
auto last_token = get_token_string();
|
auto last_token = get_token_string();
|
||||||
return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bon8, "invalid byte: 0x" + last_token, "value"), BasicJsonType()));
|
return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bon8, "invalid byte: 0x" + last_token, "value"), BasicJsonType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
string_t s;
|
||||||
|
return get_bon8_string(s) && sax->string(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2475,7 +2481,97 @@ class binary_reader
|
|||||||
|
|
||||||
bool get_bon8_object(const std::size_t len)
|
bool get_bon8_object(const std::size_t len)
|
||||||
{
|
{
|
||||||
return false;
|
if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len != 0)
|
||||||
|
{
|
||||||
|
string_t key;
|
||||||
|
if (len != std::size_t(-1))
|
||||||
|
{
|
||||||
|
for (std::size_t i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
get();
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!get_bon8_string(key) || !sax->key(key)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!parse_bon8_internal(false)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
key.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (get() != 0xFE)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!get_bon8_string(key) || !sax->key(key)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!parse_bon8_internal(false)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
key.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sax->end_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get_bon8_string(string_t& result)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((current & 0x80) == 0x00)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if ((current & 0xE0) == 0xC0)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if ((current & 0xF0) == 0xE0)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if ((current & 0xF8) == 0xF0)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if (current == 0xFF)
|
||||||
|
{
|
||||||
|
get();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////
|
///////////////////////
|
||||||
|
|||||||
@ -10728,11 +10728,17 @@ class binary_reader
|
|||||||
case 0xFD:
|
case 0xFD:
|
||||||
return sax->number_float(1.0, "");
|
return sax->number_float(1.0, "");
|
||||||
|
|
||||||
default: // anything else
|
case 0xFE:
|
||||||
{
|
{
|
||||||
auto last_token = get_token_string();
|
auto last_token = get_token_string();
|
||||||
return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bon8, "invalid byte: 0x" + last_token, "value"), BasicJsonType()));
|
return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bon8, "invalid byte: 0x" + last_token, "value"), BasicJsonType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
string_t s;
|
||||||
|
return get_bon8_string(s) && sax->string(s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -10769,7 +10775,97 @@ class binary_reader
|
|||||||
|
|
||||||
bool get_bon8_object(const std::size_t len)
|
bool get_bon8_object(const std::size_t len)
|
||||||
{
|
{
|
||||||
return false;
|
if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (len != 0)
|
||||||
|
{
|
||||||
|
string_t key;
|
||||||
|
if (len != std::size_t(-1))
|
||||||
|
{
|
||||||
|
for (std::size_t i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
get();
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!get_bon8_string(key) || !sax->key(key)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!parse_bon8_internal(false)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
key.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (get() != 0xFE)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!get_bon8_string(key) || !sax->key(key)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!parse_bon8_internal(false)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
key.clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sax->end_object();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool get_bon8_string(string_t& result)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bon8, "string")))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((current & 0x80) == 0x00)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if ((current & 0xE0) == 0xC0)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if ((current & 0xF0) == 0xE0)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if ((current & 0xF8) == 0xF0)
|
||||||
|
{
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(current));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
result.push_back(static_cast<typename string_t::value_type>(get()));
|
||||||
|
get();
|
||||||
|
}
|
||||||
|
else if (current == 0xFF)
|
||||||
|
{
|
||||||
|
get();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
///////////////////////
|
///////////////////////
|
||||||
|
|||||||
@ -552,6 +552,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {0xFF};
|
std::vector<uint8_t> expected = {0xFF};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("other strings")
|
SECTION("other strings")
|
||||||
@ -560,6 +561,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', '.', 0xFF};
|
std::vector<uint8_t> expected = {'T', 'h', 'i', 's', ' ', 'i', 's', ' ', 'a', ' ', 's', 't', 'r', 'i', 'n', 'g', '.', 0xFF};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -634,6 +636,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {0x81, 0x81, 0x81, 'f', 'o', 'o', 0xFF};
|
std::vector<uint8_t> expected = {0x81, 0x81, 0x81, 'f', 'o', 'o', 0xFF};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("[[[1]]]")
|
SECTION("[[[1]]]")
|
||||||
@ -651,6 +654,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {0x81, 0x81, 0x81, 0xFF};
|
std::vector<uint8_t> expected = {0x81, 0x81, 0x81, 0xFF};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -677,6 +681,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {0x86};
|
std::vector<uint8_t> expected = {0x86};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("{\"foo\": null}")
|
SECTION("{\"foo\": null}")
|
||||||
@ -685,6 +690,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {0x87, 'f', 'o', 'o', 0xFA};
|
std::vector<uint8_t> expected = {0x87, 'f', 'o', 'o', 0xFA};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("{\"\": true, \"foo\": null}")
|
SECTION("{\"\": true, \"foo\": null}")
|
||||||
@ -693,6 +699,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {0x88, 0xFF, 0xF9, 'f', 'o', 'o', 0xFA};
|
std::vector<uint8_t> expected = {0x88, 0xFF, 0xF9, 'f', 'o', 'o', 0xFA};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
|
|
||||||
SECTION("{\"a\": \"\", \"c\": \"d\"}")
|
SECTION("{\"a\": \"\", \"c\": \"d\"}")
|
||||||
@ -720,6 +727,7 @@ TEST_CASE("BON8")
|
|||||||
std::vector<uint8_t> expected = {0x8b, 'f', 'i', 'v', 'e', 0x95, 'f', 'o', 'u', 'r', 0x94, 'o', 'n', 'e', 0x91, 't', 'h', 'r', 'e', 'e', 0x93, 't', 'w', 'o', 0x92, 0xFE};
|
std::vector<uint8_t> expected = {0x8b, 'f', 'i', 'v', 'e', 0x95, 'f', 'o', 'u', 'r', 0x94, 'o', 'n', 'e', 0x91, 't', 'h', 'r', 'e', 'e', 0x93, 't', 'w', 'o', 0x92, 0xFE};
|
||||||
const auto result = json::to_bon8(j);
|
const auto result = json::to_bon8(j);
|
||||||
CHECK(result == expected);
|
CHECK(result == expected);
|
||||||
|
CHECK(json::from_bon8(result) == j);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user