in hessian2/basic_codec/string_codec.cc [304:380]
bool decodeStringWithReader(std::string &out, bool &has_surrogate,
Reader &reader) {
size_t delta_length = 0;
auto ret = reader.read<uint8_t>();
if (!ret.first) {
return false;
}
uint8_t code = ret.second;
switch (code) {
// ::= [x00-x1f] <utf8-data> # string of length
case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
case 0x1c:
case 0x1d:
case 0x1e:
case 0x1f: {
return readChunkString(out, has_surrogate, reader, code - 0x00, true);
}
// ::= [x30-x33] <utf8-data> # string of length
case 0x30:
case 0x31:
case 0x32:
case 0x33: {
auto res = reader.read<uint8_t>();
if (!res.first) {
return false;
}
delta_length = (code - 0x30) * 256 + res.second;
return readChunkString(out, has_surrogate, reader, delta_length, true);
}
case 0x53: // 0x53 is 'S', 'S' b1 b0 <utf8-data>
{
auto res = reader.readBE<uint16_t>();
if (!res.first) {
return false;
}
return readChunkString(out, has_surrogate, reader, res.second, true);
}
case 0x52: // 0x52 b1 b0 <utf8-data>
{
auto res = reader.readBE<uint16_t>();
if (!res.first) {
return false;
}
return readChunkString(out, has_surrogate, reader, res.second, false);
}
}
return false;
}