uint64_t StringExtractor::GetHexWithFixedSize (uint32_t byte_size, bool little_endian, uint64_t fail_value) { if (byte_size <= 8 && GetBytesLeft() >= byte_size * 2) { uint64_t result = 0; uint32_t i; if (little_endian) { // Little Endian uint32_t shift_amount; for (i = 0, shift_amount = 0; i < byte_size && m_index != UINT32_MAX; ++i, shift_amount += 8) { result |= ((uint64_t)GetHexU8() << shift_amount); } } else { // Big Endian for (i = 0; i < byte_size && m_index != UINT32_MAX; ++i) { result <<= 8; result |= GetHexU8(); } } } m_index = UINT32_MAX; return fail_value; }
size_t StringExtractor::GetHexByteString(std::string &str) { str.clear(); str.reserve(GetBytesLeft() / 2); char ch; while ((ch = GetHexU8()) != '\0') str.append(1, ch); return str.size(); }
uint8_t StringExtractorGDBRemote::GetError () { if (GetResponseType() == eError) { SetFilePos(1); return GetHexU8(255); } return 0; }
size_t StringExtractor::GetHexByteStringTerminatedBy(std::string &str, char terminator) { str.clear(); char ch; while ((ch = GetHexU8(0, false)) != '\0') str.append(1, ch); if (Peek() && *Peek() == terminator) return str.size(); str.clear(); return str.size(); }
size_t StringExtractor::GetHexByteStringFixedLength(std::string &str, uint32_t nibble_length) { str.clear(); uint32_t nibble_count = 0; for (const char *pch = Peek(); (nibble_count < nibble_length) && (pch != nullptr); str.append(1, GetHexU8(0, false)), pch = Peek(), nibble_count += 2) { } return str.size(); }
size_t StringExtractor::GetHexBytes(llvm::MutableArrayRef<uint8_t> dest, uint8_t fail_fill_value) { size_t bytes_extracted = 0; while (!dest.empty() && GetBytesLeft() > 0) { dest[0] = GetHexU8(fail_fill_value); if (!IsGood()) break; ++bytes_extracted; dest = dest.drop_front(); } if (!dest.empty()) ::memset(dest.data(), fail_fill_value, dest.size()); return bytes_extracted; }
size_t StringExtractor::GetHexBytes (void *dst_void, size_t dst_len, uint8_t fail_fill_value) { uint8_t *dst = (uint8_t*)dst_void; size_t bytes_extracted = 0; while (bytes_extracted < dst_len && GetBytesLeft ()) { dst[bytes_extracted] = GetHexU8 (fail_fill_value); if (IsGood()) ++bytes_extracted; else break; } for (size_t i = bytes_extracted; i < dst_len; ++i) dst[i] = fail_fill_value; return bytes_extracted; }