Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion include/jsoncons/source.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,7 @@ namespace jsoncons {
std::streamsize count = sbuf_->sgetn(reinterpret_cast<char_type*>(buffer_ + length_), buffer_size_ - length_);
std::size_t len = static_cast<std::size_t>(count);
length_ += len;
if (len == 0 || length_ < length)
if (len == 0)
{
stream_ptr_->clear(stream_ptr_->rdstate() | std::ios::eofbit);
}
Expand Down Expand Up @@ -692,6 +692,10 @@ namespace jsoncons {

span<const value_type> read_span(std::size_t length)
{
if (length > default_max_buffer_size)
{
return span<const value_type>();
}
if (length > buffer_.size())
{
buffer_.resize(length);
Expand Down Expand Up @@ -924,6 +928,10 @@ namespace jsoncons {

span<const value_type> read_span(std::size_t length)
{
if (length > default_max_buffer_size)
{
return span<const value_type>();
}
if (length > buffer_.size())
{
buffer_.resize(length);
Expand Down
226 changes: 20 additions & 206 deletions include/jsoncons_ext/cbor/cbor_encoder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -284,39 +284,7 @@ class basic_cbor_encoder final : public basic_json_visitor<char>
}
stack_.emplace_back(cbor_container_type::object, length);

if (length <= 0x17)
{
binary::native_to_big(static_cast<uint8_t>(0xa0 + length),
std::back_inserter(sink_));
}
else if (length <= 0xff)
{
binary::native_to_big(static_cast<uint8_t>(0xb8),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint8_t>(length),
std::back_inserter(sink_));
}
else if (length <= 0xffff)
{
binary::native_to_big(static_cast<uint8_t>(0xb9),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint16_t>(length),
std::back_inserter(sink_));
}
else if (length <= 0xffffffff)
{
binary::native_to_big(static_cast<uint8_t>(0xba),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint32_t>(length),
std::back_inserter(sink_));
}
else if (uint64_t(length) <= (std::numeric_limits<std::uint64_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0xbb),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint64_t>(length),
std::back_inserter(sink_));
}
write_type_and_length(0xa0, length);

JSONCONS_VISITOR_RETURN;
}
Expand Down Expand Up @@ -370,39 +338,7 @@ class basic_cbor_encoder final : public basic_json_visitor<char>
JSONCONS_VISITOR_RETURN;
}
stack_.emplace_back(cbor_container_type::array, length);
if (length <= 0x17)
{
binary::native_to_big(static_cast<uint8_t>(0x80 + length),
std::back_inserter(sink_));
}
else if (length <= 0xff)
{
binary::native_to_big(static_cast<uint8_t>(0x98),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint8_t>(length),
std::back_inserter(sink_));
}
else if (length <= 0xffff)
{
binary::native_to_big(static_cast<uint8_t>(0x99),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint16_t>(length),
std::back_inserter(sink_));
}
else if (length <= 0xffffffff)
{
binary::native_to_big(static_cast<uint8_t>(0x9a),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint32_t>(length),
std::back_inserter(sink_));
}
else if (uint64_t(length) <= (std::numeric_limits<std::uint64_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x9b),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint64_t>(length),
std::back_inserter(sink_));
}
write_type_and_length(0x80, length);
JSONCONS_VISITOR_RETURN;
}

Expand Down Expand Up @@ -485,39 +421,33 @@ class basic_cbor_encoder final : public basic_json_visitor<char>
}
}

void write_type_and_length(uint8_t major_type, std::size_t length)
void write_type_and_length(uint8_t major_type, uint64_t length)
{
if (length <= 0x17)
{
binary::native_to_big(static_cast<uint8_t>(major_type + length),
std::back_inserter(sink_));
sink_.push_back(static_cast<uint8_t>(major_type + length));
}
else if (length <= 0xff)
{
binary::native_to_big(static_cast<uint8_t>(major_type + 0x18),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint8_t>(length),
std::back_inserter(sink_));
sink_.push_back(static_cast<uint8_t>(major_type + 0x18));
sink_.push_back(static_cast<uint8_t>(length));
}
else if (length <= 0xffff)
{
binary::native_to_big(static_cast<uint8_t>(major_type + 0x19),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint16_t>(length),
sink_.push_back(static_cast<uint8_t>(major_type + 0x19));
binary::native_to_big(static_cast<uint16_t>(length),
std::back_inserter(sink_));
}
else if (length <= 0xffffffff)
{
binary::native_to_big(static_cast<uint8_t>(major_type + 0x1a),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint32_t>(length),
sink_.push_back(static_cast<uint8_t>(major_type + 0x1a));
binary::native_to_big(static_cast<uint32_t>(length),
std::back_inserter(sink_));
}
else if (uint64_t(length) <= (std::numeric_limits<std::uint64_t>::max)())
else
{
binary::native_to_big(static_cast<uint8_t>(major_type + 0x1b),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint64_t>(length),
sink_.push_back(static_cast<uint8_t>(major_type + 0x1b));
binary::native_to_big(static_cast<uint64_t>(length),
std::back_inserter(sink_));
}
}
Expand Down Expand Up @@ -1166,139 +1096,23 @@ class basic_cbor_encoder final : public basic_json_visitor<char>

void write_tag(uint64_t value)
{
if (value <= 0x17)
{
sink_.push_back(0xc0 | static_cast<uint8_t>(value));
}
else if (value <=(std::numeric_limits<uint8_t>::max)())
{
sink_.push_back(0xd8);
sink_.push_back(static_cast<uint8_t>(value));
}
else if (value <=(std::numeric_limits<uint16_t>::max)())
{
sink_.push_back(0xd9);
binary::native_to_big(static_cast<uint16_t>(value),
std::back_inserter(sink_));
}
else if (value <=(std::numeric_limits<uint32_t>::max)())
{
sink_.push_back(0xda);
binary::native_to_big(static_cast<uint32_t>(value),
std::back_inserter(sink_));
}
else
{
sink_.push_back(0xdb);
binary::native_to_big(static_cast<uint64_t>(value),
std::back_inserter(sink_));
}
write_type_and_length(0xc0, value);
}

void write_uint64_value(uint64_t value)
void write_uint64_value(uint64_t value)
{
if (value <= 0x17)
{
sink_.push_back(static_cast<uint8_t>(value));
}
else if (value <=(std::numeric_limits<uint8_t>::max)())
{
sink_.push_back(static_cast<uint8_t>(0x18));
sink_.push_back(static_cast<uint8_t>(value));
}
else if (value <=(std::numeric_limits<uint16_t>::max)())
{
sink_.push_back(static_cast<uint8_t>(0x19));
binary::native_to_big(static_cast<uint16_t>(value),
std::back_inserter(sink_));
}
else if (value <=(std::numeric_limits<uint32_t>::max)())
{
sink_.push_back(static_cast<uint8_t>(0x1a));
binary::native_to_big(static_cast<uint32_t>(value),
std::back_inserter(sink_));
}
else if (value <=(std::numeric_limits<uint64_t>::max)())
{
sink_.push_back(static_cast<uint8_t>(0x1b));
binary::native_to_big(static_cast<uint64_t>(value),
std::back_inserter(sink_));
}
write_type_and_length(0x00, value);
}

void write_int64_value(int64_t value)
{
if (value >= 0)
{
if (value <= 0x17)
{
binary::native_to_big(static_cast<uint8_t>(value),
std::back_inserter(sink_));
}
else if (value <= (std::numeric_limits<uint8_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x18),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint8_t>(value),
std::back_inserter(sink_));
}
else if (value <= (std::numeric_limits<uint16_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x19),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint16_t>(value),
std::back_inserter(sink_));
}
else if (value <= (std::numeric_limits<uint32_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x1a),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint32_t>(value),
std::back_inserter(sink_));
}
else if (value <= (std::numeric_limits<int64_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x1b),
std::back_inserter(sink_));
binary::native_to_big(static_cast<int64_t>(value),
std::back_inserter(sink_));
}
} else
write_type_and_length(0x00, static_cast<uint64_t>(value));
}
else
{
const auto posnum = -1 - value;
if (value >= -24)
{
binary::native_to_big(static_cast<uint8_t>(0x20 + posnum),
std::back_inserter(sink_));
}
else if (posnum <= (std::numeric_limits<uint8_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x38),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint8_t>(posnum),
std::back_inserter(sink_));
}
else if (posnum <= (std::numeric_limits<uint16_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x39),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint16_t>(posnum),
std::back_inserter(sink_));
}
else if (posnum <= (std::numeric_limits<uint32_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x3a),
std::back_inserter(sink_));
binary::native_to_big(static_cast<uint32_t>(posnum),
std::back_inserter(sink_));
}
else if (posnum <= (std::numeric_limits<int64_t>::max)())
{
binary::native_to_big(static_cast<uint8_t>(0x3b),
std::back_inserter(sink_));
binary::native_to_big(static_cast<int64_t>(posnum),
std::back_inserter(sink_));
}
write_type_and_length(0x20, static_cast<uint64_t>(-1 - value));
}
}

Expand Down
27 changes: 4 additions & 23 deletions include/jsoncons_ext/cbor/cbor_parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2045,29 +2045,7 @@ class basic_cbor_parser : public ser_context
break;
}
case 0x15:
{
auto bytes = read.view(ec);
if (JSONCONS_UNLIKELY(ec))
{
more_ = false;
return;
}
visitor.byte_string_value(bytes, semantic_tag::base64url, *this, ec);
more_ = !cursor_mode_;
break;
}
case 0x16:
{
auto bytes = read.view(ec);
if (JSONCONS_UNLIKELY(ec))
{
more_ = false;
return;
}
visitor.byte_string_value(bytes, semantic_tag::base64, *this, ec);
more_ = !cursor_mode_;
break;
}
case 0x17:
{
auto bytes = read.view(ec);
Expand All @@ -2076,7 +2054,10 @@ class basic_cbor_parser : public ser_context
more_ = false;
return;
}
visitor.byte_string_value(bytes, semantic_tag::base16, *this, ec);
const semantic_tag tag = raw_tag_ == 0x15 ? semantic_tag::base64url
: raw_tag_ == 0x16 ? semantic_tag::base64
: semantic_tag::base16;
visitor.byte_string_value(bytes, tag, *this, ec);
more_ = !cursor_mode_;
break;
}
Expand Down
Loading
Loading