27 errinfo_comment constructRLPSizeErrorInfo(
size_t _actualSize,
size_t _dataSize)
30 s <<
"Actual size: " << _actualSize <<
", data size: " << _dataSize;
42 BOOST_THROW_EXCEPTION(OversizeRLP() << constructRLPSizeErrorInfo(
actualSize(), _d.
size()));
49 BOOST_THROW_EXCEPTION(UndersizeRLP() << constructRLPSizeErrorInfo(
actualSize(), _d.
size()));
60 m_currentItem = m_currentItem.
cropped(0, sizeAsEncoded(m_currentItem));
61 m_remaining -= std::min<size_t>(m_remaining, m_currentItem.
size());
68 RLP::iterator::iterator(
RLP const& _parent,
bool _begin)
70 if (_begin && _parent.
isList())
73 m_currentItem = pl.
cropped(0, sizeAsEncoded(pl));
74 m_remaining = pl.
size() - m_currentItem.size();
87 m_lastEnd = sizeAsEncoded(
payload());
91 for (; m_lastIndex < _i && m_lastItem.
size(); ++m_lastIndex)
94 m_lastItem = m_lastItem.
cropped(0, sizeAsEncoded(m_lastItem));
95 m_lastEnd += m_lastItem.
size();
107 return payloadOffset() + length();
111 void RLP::requireGood()
const
114 BOOST_THROW_EXCEPTION(BadRLP());
116 if (n != c_rlpDataImmLenStart + 1)
118 if (m_data.
size() < 2)
119 BOOST_THROW_EXCEPTION(BadRLP());
120 if (m_data[1] < c_rlpDataImmLenStart)
121 BOOST_THROW_EXCEPTION(BadRLP());
130 if (n < c_rlpDataImmLenStart)
132 else if (n == c_rlpDataImmLenStart)
134 else if (n <= c_rlpDataIndLenZero)
136 if (m_data.
size() <= 1)
137 BOOST_THROW_EXCEPTION(BadRLP());
138 return m_data[1] != 0;
140 else if (n < c_rlpListStart)
142 if (m_data.
size() <=
size_t(1 + n - c_rlpDataIndLenZero))
143 BOOST_THROW_EXCEPTION(BadRLP());
144 return m_data[1 + n - c_rlpDataIndLenZero] != 0;
151 size_t RLP::length()
const
157 byte const n = m_data[0];
158 if (n < c_rlpDataImmLenStart)
160 else if (n <= c_rlpDataIndLenZero)
161 return n - c_rlpDataImmLenStart;
162 else if (n < c_rlpListStart)
164 if (m_data.
size() <=
size_t(n - c_rlpDataIndLenZero))
165 BOOST_THROW_EXCEPTION(BadRLP());
166 if (m_data.
size() > 1)
168 BOOST_THROW_EXCEPTION(BadRLP());
169 unsigned lengthSize = n - c_rlpDataIndLenZero;
170 if (lengthSize >
sizeof(ret))
172 BOOST_THROW_EXCEPTION(UndersizeRLP());
175 BOOST_THROW_EXCEPTION(BadRLP());
176 for (
unsigned i = 0; i < lengthSize; ++i)
177 ret = (ret << 8) | m_data[i + 1];
179 if (ret < c_rlpListStart - c_rlpDataImmLenStart - c_rlpMaxLengthBytes)
180 BOOST_THROW_EXCEPTION(BadRLP());
182 else if (n <= c_rlpListIndLenZero)
183 return n - c_rlpListStart;
186 unsigned lengthSize = n - c_rlpListIndLenZero;
187 if (m_data.
size() <= lengthSize)
188 BOOST_THROW_EXCEPTION(BadRLP());
189 if (m_data.
size() > 1)
191 BOOST_THROW_EXCEPTION(BadRLP());
192 if (lengthSize >
sizeof(ret))
194 BOOST_THROW_EXCEPTION(UndersizeRLP());
196 BOOST_THROW_EXCEPTION(BadRLP());
197 for (
unsigned i = 0; i < lengthSize; ++i)
198 ret = (ret << 8) | m_data[i + 1];
199 if (ret < 0x100 - c_rlpListStart - c_rlpMaxLengthBytes)
200 BOOST_THROW_EXCEPTION(BadRLP());
204 if (ret >= std::numeric_limits<size_t>::max() - 0x100)
205 BOOST_THROW_EXCEPTION(UndersizeRLP());
209 size_t RLP::items()
const
215 for (; d.
size(); ++i)
216 d = d.
cropped(sizeAsEncoded(d));
224 m_out.insert(m_out.end(), _s.
begin(), _s.
end());
225 noteAppended(_itemCount);
229 void RLPStream::noteAppended(
size_t _itemCount)
234 while (m_listStack.size())
236 if (m_listStack.back().first < _itemCount)
238 m_listStack.back().first -= _itemCount;
239 if (m_listStack.back().first)
243 auto p = m_listStack.back().second;
244 m_listStack.pop_back();
245 size_t s = m_out.size() - p;
247 unsigned encodeSize = s < c_rlpListImmLenCount ? 1 : (1 + brs);
249 auto os = m_out.size();
250 m_out.resize(os + encodeSize);
251 memmove(m_out.data() + p + encodeSize, m_out.data() + p, os - p);
252 if (s < c_rlpListImmLenCount)
253 m_out[p] = (
byte)(c_rlpListStart + s);
254 else if (c_rlpListIndLenZero + brs <= 0xff)
256 m_out[p] = (
byte)(c_rlpListIndLenZero + brs);
257 byte* b = &(m_out[p + brs]);
272 m_listStack.push_back(std::make_pair(_items, m_out.size()));
280 if (_rlp.
size() < c_rlpListImmLenCount)
281 m_out.push_back((
byte)(_rlp.
size() + c_rlpListStart));
283 pushCount(_rlp.
size(), c_rlpListIndLenZero);
290 size_t s = _s.
size();
291 byte const* d = _s.
data();
293 for (
size_t i = 0; i < _s.
size() && !*d; ++i, --s, ++d) {}
295 if (s == 1 && *d < c_rlpDataImmLenStart)
299 if (s < c_rlpDataImmLenCount)
300 m_out.push_back((
byte)(s + c_rlpDataImmLenStart));
302 pushCount(s, c_rlpDataIndLenZero);
312 m_out.push_back(c_rlpDataImmLenStart);
313 else if (_i < c_rlpDataImmLenStart)
314 m_out.push_back((
byte)_i);
318 if (br < c_rlpDataImmLenCount)
319 m_out.push_back((
byte)(br + c_rlpDataImmLenStart));
323 if (c_rlpDataIndLenZero + brbr > 0xff)
325 m_out.push_back((
byte)(c_rlpDataIndLenZero + brbr));
334 void RLPStream::pushCount(
size_t _count,
byte _base)
337 if (
int(br) + _base > 0xff)
339 m_out.push_back((
byte)(br + _base));
343 static void streamOut(std::ostream& _out,
dev::RLP const& _d,
unsigned _depth = 0)
346 _out <<
"<max-depth-reached>";
359 _out << (j++ ?
", " :
" ");
360 streamOut(_out, i, _depth + 1);