Merge branch 'feature/getline' into develop
This commit is contained in:
commit
100bf3ef2c
3 changed files with 264 additions and 0 deletions
115
src/json.hpp
115
src/json.hpp
|
@ -8815,6 +8815,55 @@ class basic_json
|
||||||
serialization format. MessagePack is a binary serialization format which
|
serialization format. MessagePack is a binary serialization format which
|
||||||
aims to be more compact than JSON itself, yet more efficient to parse.
|
aims to be more compact than JSON itself, yet more efficient to parse.
|
||||||
|
|
||||||
|
The library uses the following mapping from JSON values types to
|
||||||
|
MessagePack types according to the MessagePack specification:
|
||||||
|
|
||||||
|
JSON value type | value/range | MessagePack type | first byte
|
||||||
|
--------------- | --------------------------------- | ---------------- | ----------
|
||||||
|
null | `null` | nil | 0xc0
|
||||||
|
boolean | `true` | true | 0xc3
|
||||||
|
boolean | `false` | false | 0xc2
|
||||||
|
number_integer | -9223372036854775808..-2147483649 | int64 | 0xd3
|
||||||
|
number_integer | -2147483648..-32769 | int32 | 0xd2
|
||||||
|
number_integer | -32768..-129 | int16 | 0xd1
|
||||||
|
number_integer | -128..-33 | int8 | 0xd0
|
||||||
|
number_integer | -32..-1 | negative fixint | 0xe0..0xff
|
||||||
|
number_integer | 0..127 | positive fixint | 0x00..0x7f
|
||||||
|
number_integer | 128..255 | uint 8 | 0xcc
|
||||||
|
number_integer | 256..65535 | uint 16 | 0xcd
|
||||||
|
number_integer | 65536..4294967295 | uint 32 | 0xce
|
||||||
|
number_integer | 4294967296..18446744073709551615 | uint 64 | 0xcf
|
||||||
|
number_unsigned | 0..127 | positive fixint | 0x00..0x7f
|
||||||
|
number_unsigned | 128..255 | uint 8 | 0xcc
|
||||||
|
number_unsigned | 256..65535 | uint 16 | 0xcd
|
||||||
|
number_unsigned | 65536..4294967295 | uint 32 | 0xce
|
||||||
|
number_unsigned | 4294967296..18446744073709551615 | uint 64 | 0xcf
|
||||||
|
number_float | *any value* | float 64 | 0xcb
|
||||||
|
string | *length*: 0..31 | fixstr | 0xa0..0xbf
|
||||||
|
string | *length*: 32..255 | str 8 | 0xd9
|
||||||
|
string | *length*: 256..65535 | str 16 | 0xda
|
||||||
|
string | *length*: 65536..4294967295 | str 32 | 0xdb
|
||||||
|
array | *size*: 0..15 | fixarray | 0x90..0x9f
|
||||||
|
array | *size*: 16..65535 | array 16 | 0xdc
|
||||||
|
array | *size*: 65536..4294967295 | array 32 | 0xdd
|
||||||
|
object | *size*: 0..15 | fix map | 0x80..0x8f
|
||||||
|
object | *size*: 16..65535 | map 16 | 0xde
|
||||||
|
object | *size*: 65536..4294967295 | map 32 | 0xdf
|
||||||
|
|
||||||
|
@note The mapping is **complete** in the sense that any JSON value type
|
||||||
|
can be converted to a MessagePack value.
|
||||||
|
|
||||||
|
@note The following values can **not** be converted to a MessagePack value:
|
||||||
|
- strings with more than 4294967295 bytes
|
||||||
|
- arrays with more than 4294967295 elements
|
||||||
|
- objects with more than 4294967295 elements
|
||||||
|
|
||||||
|
@note The following MessagePack types are not used in the conversion:
|
||||||
|
- bin 8 - bin 32 (0xc4..0xc6)
|
||||||
|
- ext 8 - ext 32 (0xc7..0xc9)
|
||||||
|
- float 32 (0xca)
|
||||||
|
- fixext 1 - fixext 16 (0xd4..0xd8)
|
||||||
|
|
||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@return MessagePack serialization as byte vector
|
@return MessagePack serialization as byte vector
|
||||||
|
|
||||||
|
@ -8878,6 +8927,65 @@ class basic_json
|
||||||
serialization format which aims to be more compact than JSON itself, yet
|
serialization format which aims to be more compact than JSON itself, yet
|
||||||
more efficient to parse.
|
more efficient to parse.
|
||||||
|
|
||||||
|
The library uses the following mapping from JSON values types to
|
||||||
|
CBOR types according to the CBOR specification (RFC 7049):
|
||||||
|
|
||||||
|
JSON value type | value/range | CBOR type | first byte
|
||||||
|
--------------- | ------------------------------------------ | ---------------------------------- | ---------------
|
||||||
|
null | `null` | Null | 0xf6
|
||||||
|
boolean | `true` | True | 0xf5
|
||||||
|
boolean | `false` | False | 0xf4
|
||||||
|
number_integer | -9223372036854775808..-2147483649 | Negative integer (8 bytes follow) | 0x3b
|
||||||
|
number_integer | -2147483648..-32769 | Negative integer (4 bytes follow) | 0x3a
|
||||||
|
number_integer | -32768..-129 | Negative integer (2 bytes follow) | 0x39
|
||||||
|
number_integer | -128..-25 | Negative integer (1 byte follow) | 0x38
|
||||||
|
number_integer | -24..-1 | Negative integer | 0x20..0x37
|
||||||
|
number_integer | 0..23 | Integer | 0x00..0x17
|
||||||
|
number_integer | 24..255 | Unsigned integer (1 byte follow) | 0x18
|
||||||
|
number_integer | 256..65535 | Unsigned integer (2 bytes follow) | 0x19
|
||||||
|
number_integer | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1a
|
||||||
|
number_integer | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1b
|
||||||
|
number_unsigned | 0..23 | Integer | 0x00..0x17
|
||||||
|
number_unsigned | 24..255 | Unsigned integer (1 byte follow) | 0x18
|
||||||
|
number_unsigned | 256..65535 | Unsigned integer (2 bytes follow) | 0x19
|
||||||
|
number_unsigned | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1a
|
||||||
|
number_unsigned | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1b
|
||||||
|
number_float | *any value* | Double-Precision Float | 0xfb
|
||||||
|
string | *length*: 0..23 | UTF-8 string | 0x60..0x77
|
||||||
|
string | *length*: 23..255 | UTF-8 string (1 byte follow) | 0x78
|
||||||
|
string | *length*: 256..65535 | UTF-8 string (2 bytes follow) | 0x79
|
||||||
|
string | *length*: 65536..4294967295 | UTF-8 string (4 bytes follow) | 0x7a
|
||||||
|
string | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow) | 0x7b
|
||||||
|
array | *size*: 0..23 | array | 0x80..0x97
|
||||||
|
array | *size*: 23..255 | array (1 byte follow) | 0x98
|
||||||
|
array | *size*: 256..65535 | array (2 bytes follow) | 0x99
|
||||||
|
array | *size*: 65536..4294967295 | array (4 bytes follow) | 0x9a
|
||||||
|
array | *size*: 4294967296..18446744073709551615 | array (8 bytes follow) | 0x9b
|
||||||
|
object | *size*: 0..23 | map | 0xa0..0xb7
|
||||||
|
object | *size*: 23..255 | map (1 byte follow) | 0xb8
|
||||||
|
object | *size*: 256..65535 | map (2 bytes follow) | 0xb9
|
||||||
|
object | *size*: 65536..4294967295 | map (4 bytes follow) | 0xba
|
||||||
|
object | *size*: 4294967296..18446744073709551615 | map (8 bytes follow) | 0xbb
|
||||||
|
|
||||||
|
@note The mapping is **complete** in the sense that any JSON value type
|
||||||
|
can be converted to a CBOR value.
|
||||||
|
|
||||||
|
@note The following CBOR types are not used in the conversion:
|
||||||
|
- byte strings (0x40..0x5f)
|
||||||
|
- UTF-8 strings terminated by "break" (0x7f)
|
||||||
|
- arrays terminated by "break" (0x9f)
|
||||||
|
- maps terminated by "break" (0xbf)
|
||||||
|
- date/time (0xc0..0xc1)
|
||||||
|
- bignum (0xc2..0xc3)
|
||||||
|
- decimal fraction (0xc4)
|
||||||
|
- bigfloat (0xc5)
|
||||||
|
- tagged items (0xc6..0xd4, 0xd8..0xdb)
|
||||||
|
- expected conversions (0xd5..0xd7)
|
||||||
|
- simple values (0xe0..0xf3, 0xf8)
|
||||||
|
- undefined (0xf7)
|
||||||
|
- half and single-precision floats (0xf9-0xfa)
|
||||||
|
- break (0xff)
|
||||||
|
|
||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@return MessagePack serialization as byte vector
|
@return MessagePack serialization as byte vector
|
||||||
|
|
||||||
|
@ -11330,6 +11438,13 @@ basic_json_parser_74:
|
||||||
m_line_buffer.erase(0, num_processed_chars);
|
m_line_buffer.erase(0, num_processed_chars);
|
||||||
// read next line from input stream
|
// read next line from input stream
|
||||||
m_line_buffer_tmp.clear();
|
m_line_buffer_tmp.clear();
|
||||||
|
|
||||||
|
// check if stream is still good
|
||||||
|
if (m_stream->fail())
|
||||||
|
{
|
||||||
|
JSON_THROW(parse_error(111, 0, "bad input stream"));
|
||||||
|
}
|
||||||
|
|
||||||
std::getline(*m_stream, m_line_buffer_tmp, '\n');
|
std::getline(*m_stream, m_line_buffer_tmp, '\n');
|
||||||
|
|
||||||
// add line with newline symbol to the line buffer
|
// add line with newline symbol to the line buffer
|
||||||
|
|
|
@ -8815,6 +8815,55 @@ class basic_json
|
||||||
serialization format. MessagePack is a binary serialization format which
|
serialization format. MessagePack is a binary serialization format which
|
||||||
aims to be more compact than JSON itself, yet more efficient to parse.
|
aims to be more compact than JSON itself, yet more efficient to parse.
|
||||||
|
|
||||||
|
The library uses the following mapping from JSON values types to
|
||||||
|
MessagePack types according to the MessagePack specification:
|
||||||
|
|
||||||
|
JSON value type | value/range | MessagePack type | first byte
|
||||||
|
--------------- | --------------------------------- | ---------------- | ----------
|
||||||
|
null | `null` | nil | 0xc0
|
||||||
|
boolean | `true` | true | 0xc3
|
||||||
|
boolean | `false` | false | 0xc2
|
||||||
|
number_integer | -9223372036854775808..-2147483649 | int64 | 0xd3
|
||||||
|
number_integer | -2147483648..-32769 | int32 | 0xd2
|
||||||
|
number_integer | -32768..-129 | int16 | 0xd1
|
||||||
|
number_integer | -128..-33 | int8 | 0xd0
|
||||||
|
number_integer | -32..-1 | negative fixint | 0xe0..0xff
|
||||||
|
number_integer | 0..127 | positive fixint | 0x00..0x7f
|
||||||
|
number_integer | 128..255 | uint 8 | 0xcc
|
||||||
|
number_integer | 256..65535 | uint 16 | 0xcd
|
||||||
|
number_integer | 65536..4294967295 | uint 32 | 0xce
|
||||||
|
number_integer | 4294967296..18446744073709551615 | uint 64 | 0xcf
|
||||||
|
number_unsigned | 0..127 | positive fixint | 0x00..0x7f
|
||||||
|
number_unsigned | 128..255 | uint 8 | 0xcc
|
||||||
|
number_unsigned | 256..65535 | uint 16 | 0xcd
|
||||||
|
number_unsigned | 65536..4294967295 | uint 32 | 0xce
|
||||||
|
number_unsigned | 4294967296..18446744073709551615 | uint 64 | 0xcf
|
||||||
|
number_float | *any value* | float 64 | 0xcb
|
||||||
|
string | *length*: 0..31 | fixstr | 0xa0..0xbf
|
||||||
|
string | *length*: 32..255 | str 8 | 0xd9
|
||||||
|
string | *length*: 256..65535 | str 16 | 0xda
|
||||||
|
string | *length*: 65536..4294967295 | str 32 | 0xdb
|
||||||
|
array | *size*: 0..15 | fixarray | 0x90..0x9f
|
||||||
|
array | *size*: 16..65535 | array 16 | 0xdc
|
||||||
|
array | *size*: 65536..4294967295 | array 32 | 0xdd
|
||||||
|
object | *size*: 0..15 | fix map | 0x80..0x8f
|
||||||
|
object | *size*: 16..65535 | map 16 | 0xde
|
||||||
|
object | *size*: 65536..4294967295 | map 32 | 0xdf
|
||||||
|
|
||||||
|
@note The mapping is **complete** in the sense that any JSON value type
|
||||||
|
can be converted to a MessagePack value.
|
||||||
|
|
||||||
|
@note The following values can **not** be converted to a MessagePack value:
|
||||||
|
- strings with more than 4294967295 bytes
|
||||||
|
- arrays with more than 4294967295 elements
|
||||||
|
- objects with more than 4294967295 elements
|
||||||
|
|
||||||
|
@note The following MessagePack types are not used in the conversion:
|
||||||
|
- bin 8 - bin 32 (0xc4..0xc6)
|
||||||
|
- ext 8 - ext 32 (0xc7..0xc9)
|
||||||
|
- float 32 (0xca)
|
||||||
|
- fixext 1 - fixext 16 (0xd4..0xd8)
|
||||||
|
|
||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@return MessagePack serialization as byte vector
|
@return MessagePack serialization as byte vector
|
||||||
|
|
||||||
|
@ -8878,6 +8927,65 @@ class basic_json
|
||||||
serialization format which aims to be more compact than JSON itself, yet
|
serialization format which aims to be more compact than JSON itself, yet
|
||||||
more efficient to parse.
|
more efficient to parse.
|
||||||
|
|
||||||
|
The library uses the following mapping from JSON values types to
|
||||||
|
CBOR types according to the CBOR specification (RFC 7049):
|
||||||
|
|
||||||
|
JSON value type | value/range | CBOR type | first byte
|
||||||
|
--------------- | ------------------------------------------ | ---------------------------------- | ---------------
|
||||||
|
null | `null` | Null | 0xf6
|
||||||
|
boolean | `true` | True | 0xf5
|
||||||
|
boolean | `false` | False | 0xf4
|
||||||
|
number_integer | -9223372036854775808..-2147483649 | Negative integer (8 bytes follow) | 0x3b
|
||||||
|
number_integer | -2147483648..-32769 | Negative integer (4 bytes follow) | 0x3a
|
||||||
|
number_integer | -32768..-129 | Negative integer (2 bytes follow) | 0x39
|
||||||
|
number_integer | -128..-25 | Negative integer (1 byte follow) | 0x38
|
||||||
|
number_integer | -24..-1 | Negative integer | 0x20..0x37
|
||||||
|
number_integer | 0..23 | Integer | 0x00..0x17
|
||||||
|
number_integer | 24..255 | Unsigned integer (1 byte follow) | 0x18
|
||||||
|
number_integer | 256..65535 | Unsigned integer (2 bytes follow) | 0x19
|
||||||
|
number_integer | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1a
|
||||||
|
number_integer | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1b
|
||||||
|
number_unsigned | 0..23 | Integer | 0x00..0x17
|
||||||
|
number_unsigned | 24..255 | Unsigned integer (1 byte follow) | 0x18
|
||||||
|
number_unsigned | 256..65535 | Unsigned integer (2 bytes follow) | 0x19
|
||||||
|
number_unsigned | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1a
|
||||||
|
number_unsigned | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1b
|
||||||
|
number_float | *any value* | Double-Precision Float | 0xfb
|
||||||
|
string | *length*: 0..23 | UTF-8 string | 0x60..0x77
|
||||||
|
string | *length*: 23..255 | UTF-8 string (1 byte follow) | 0x78
|
||||||
|
string | *length*: 256..65535 | UTF-8 string (2 bytes follow) | 0x79
|
||||||
|
string | *length*: 65536..4294967295 | UTF-8 string (4 bytes follow) | 0x7a
|
||||||
|
string | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow) | 0x7b
|
||||||
|
array | *size*: 0..23 | array | 0x80..0x97
|
||||||
|
array | *size*: 23..255 | array (1 byte follow) | 0x98
|
||||||
|
array | *size*: 256..65535 | array (2 bytes follow) | 0x99
|
||||||
|
array | *size*: 65536..4294967295 | array (4 bytes follow) | 0x9a
|
||||||
|
array | *size*: 4294967296..18446744073709551615 | array (8 bytes follow) | 0x9b
|
||||||
|
object | *size*: 0..23 | map | 0xa0..0xb7
|
||||||
|
object | *size*: 23..255 | map (1 byte follow) | 0xb8
|
||||||
|
object | *size*: 256..65535 | map (2 bytes follow) | 0xb9
|
||||||
|
object | *size*: 65536..4294967295 | map (4 bytes follow) | 0xba
|
||||||
|
object | *size*: 4294967296..18446744073709551615 | map (8 bytes follow) | 0xbb
|
||||||
|
|
||||||
|
@note The mapping is **complete** in the sense that any JSON value type
|
||||||
|
can be converted to a CBOR value.
|
||||||
|
|
||||||
|
@note The following CBOR types are not used in the conversion:
|
||||||
|
- byte strings (0x40..0x5f)
|
||||||
|
- UTF-8 strings terminated by "break" (0x7f)
|
||||||
|
- arrays terminated by "break" (0x9f)
|
||||||
|
- maps terminated by "break" (0xbf)
|
||||||
|
- date/time (0xc0..0xc1)
|
||||||
|
- bignum (0xc2..0xc3)
|
||||||
|
- decimal fraction (0xc4)
|
||||||
|
- bigfloat (0xc5)
|
||||||
|
- tagged items (0xc6..0xd4, 0xd8..0xdb)
|
||||||
|
- expected conversions (0xd5..0xd7)
|
||||||
|
- simple values (0xe0..0xf3, 0xf8)
|
||||||
|
- undefined (0xf7)
|
||||||
|
- half and single-precision floats (0xf9-0xfa)
|
||||||
|
- break (0xff)
|
||||||
|
|
||||||
@param[in] j JSON value to serialize
|
@param[in] j JSON value to serialize
|
||||||
@return MessagePack serialization as byte vector
|
@return MessagePack serialization as byte vector
|
||||||
|
|
||||||
|
@ -10363,6 +10471,13 @@ class basic_json
|
||||||
m_line_buffer.erase(0, num_processed_chars);
|
m_line_buffer.erase(0, num_processed_chars);
|
||||||
// read next line from input stream
|
// read next line from input stream
|
||||||
m_line_buffer_tmp.clear();
|
m_line_buffer_tmp.clear();
|
||||||
|
|
||||||
|
// check if stream is still good
|
||||||
|
if (m_stream->fail())
|
||||||
|
{
|
||||||
|
JSON_THROW(parse_error(111, 0, "bad input stream"));
|
||||||
|
}
|
||||||
|
|
||||||
std::getline(*m_stream, m_line_buffer_tmp, '\n');
|
std::getline(*m_stream, m_line_buffer_tmp, '\n');
|
||||||
|
|
||||||
// add line with newline symbol to the line buffer
|
// add line with newline symbol to the line buffer
|
||||||
|
|
|
@ -28,6 +28,7 @@ SOFTWARE.
|
||||||
|
|
||||||
#include "catch.hpp"
|
#include "catch.hpp"
|
||||||
|
|
||||||
|
#define private public
|
||||||
#include "json.hpp"
|
#include "json.hpp"
|
||||||
using nlohmann::json;
|
using nlohmann::json;
|
||||||
|
|
||||||
|
@ -910,6 +911,39 @@ TEST_CASE("regression tests")
|
||||||
CHECK(j["bool_vector"].dump() == "[false,true,false,false]");
|
CHECK(j["bool_vector"].dump() == "[false,true,false,false]");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("issue #495 - fill_line_buffer incorrectly tests m_stream for eof but not fail or bad bits")
|
||||||
|
{
|
||||||
|
SECTION("setting failbit")
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "[1,2,3\n,4,5]";
|
||||||
|
|
||||||
|
json::lexer l(ss);
|
||||||
|
|
||||||
|
CHECK(l.m_line_buffer == "[1,2,3\n");
|
||||||
|
|
||||||
|
l.m_stream->setstate(std::ios_base::failbit);
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(l.fill_line_buffer(), json::parse_error);
|
||||||
|
CHECK_THROWS_WITH(l.fill_line_buffer(), "[json.exception.parse_error.111] parse error: bad input stream");
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("setting badbit")
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << "[1,2,3\n,4,5]";
|
||||||
|
|
||||||
|
json::lexer l(ss);
|
||||||
|
|
||||||
|
CHECK(l.m_line_buffer == "[1,2,3\n");
|
||||||
|
|
||||||
|
l.m_stream->setstate(std::ios_base::badbit);
|
||||||
|
|
||||||
|
CHECK_THROWS_AS(l.fill_line_buffer(), json::parse_error);
|
||||||
|
CHECK_THROWS_WITH(l.fill_line_buffer(), "[json.exception.parse_error.111] parse error: bad input stream");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("issue #504 - assertion error (OSS-Fuzz 856)")
|
SECTION("issue #504 - assertion error (OSS-Fuzz 856)")
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> vec1 = {0xf9, 0xff, 0xff, 0x4a, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x37, 0x02, 0x38};
|
std::vector<uint8_t> vec1 = {0xf9, 0xff, 0xff, 0x4a, 0x3a, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x37, 0x02, 0x38};
|
||||||
|
|
Loading…
Reference in a new issue