Skip to content

Commit 7425a45

Browse files
committed
hex_reader complete, fixes and tests.
1 parent 9d2bc1b commit 7425a45

3 files changed

Lines changed: 53 additions & 6 deletions

File tree

include/bitcoin/system/impl/stream/streamers/hex_reader.ipp

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,13 @@ hex_reader<IStream>::hex_reader(IStream& source,
5252

5353
// protected
5454
// ----------------------------------------------------------------------------
55-
// Overide all seek/read operations.
55+
// Overide all seek/read/limit operations.
5656

5757
template <typename IStream>
5858
void hex_reader<IStream>::do_read_bytes(uint8_t* buffer,
5959
size_t size) NOEXCEPT
6060
{
6161
BC_ASSERT(!is_null(buffer));
62-
if (!is_even(size))
63-
{
64-
this->invalidate();
65-
return;
66-
}
6762

6863
// Scale for hex pairs and check limit.
6964
if (is_multiply_overflow(size, octet_width) ||
@@ -127,9 +122,22 @@ void hex_reader<IStream>::do_rewind_bytes(size_t size) NOEXCEPT
127122
template <typename IStream>
128123
size_t hex_reader<IStream>::get_read_position() NOEXCEPT
129124
{
125+
// Position continues to represent logical bytes, so can be differenced.
130126
return base::get_read_position() / octet_width;
131127
}
132128

129+
template <typename IStream>
130+
void hex_reader<IStream>::set_limit(size_t size) NOEXCEPT
131+
{
132+
if (is_multiply_overflow(size, octet_width))
133+
{
134+
this->invalidate();
135+
return;
136+
}
137+
138+
base::set_limit(size * octet_width);
139+
}
140+
133141
} // namespace system
134142
} // namespace libbitcoin
135143

include/bitcoin/system/stream/streamers/hex_reader.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class hex_reader
5050
uint8_t do_peek_byte() NOEXCEPT override;
5151

5252
/// Overide all seek operations.
53+
void set_limit(size_t size) NOEXCEPT override;
5354
void do_skip_bytes(size_t size) NOEXCEPT override;
5455
void do_rewind_bytes(size_t size) NOEXCEPT override;
5556
size_t get_read_position() NOEXCEPT override;

test/stream/streamers/hex_reader.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,4 +72,42 @@ BOOST_AUTO_TEST_CASE(hex_reader__copy__genesis_header__expected)
7272
BOOST_REQUIRE(header == genesis().header());
7373
}
7474

75+
// verify seek using full tx parse (scripts use position/skip/rewind/peek).
76+
77+
static const data_slice hex
78+
{
79+
"0100000000000000000000000000000000000000000000000000000000000000"
80+
"000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa"
81+
"4b1e5e4a29ab5f49ffff001d1dac2b7c01010000000100000000000000000000"
82+
"00000000000000000000000000000000000000000000ffffffff4d04ffff001d"
83+
"0104455468652054696d65732030332f4a616e2f32303039204368616e63656c"
84+
"6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f75742066"
85+
"6f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe554827"
86+
"1967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4"
87+
"f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000"
88+
};
89+
90+
BOOST_AUTO_TEST_CASE(hex_reader__fast_stream__genesis_block__expected)
91+
{
92+
stream::in::fast source{ hex };
93+
read::base16::fast hexer{ source };
94+
const chain::block block{ hexer, true };
95+
BOOST_REQUIRE(block == genesis());
96+
}
97+
98+
BOOST_AUTO_TEST_CASE(hex_reader__copy_stream__genesis_block__expected)
99+
{
100+
read::base16::copy hexer{ hex };
101+
const chain::block block{ hexer, true };
102+
BOOST_REQUIRE(block == genesis());
103+
}
104+
105+
BOOST_AUTO_TEST_CASE(hex_reader__istream_stream__genesis_block__expected)
106+
{
107+
std::istringstream stream{ hex.to_string() };
108+
read::base16::istream hexer{ stream };
109+
const chain::block block{ hexer, true };
110+
BOOST_REQUIRE(block == genesis());
111+
}
112+
75113
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)