1061da546Spatrick //===-- StdStringExtractor.h ------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_STDSTRINGEXTRACTOR_H 10dda28197Spatrick #define LLDB_TOOLS_DEBUGSERVER_SOURCE_STDSTRINGEXTRACTOR_H 11061da546Spatrick 12*be691f3bSpatrick #include <cstdint> 13061da546Spatrick #include <string> 14061da546Spatrick 15061da546Spatrick 16061da546Spatrick // Based on StringExtractor, with the added limitation that this file should not 17061da546Spatrick // take a dependency on LLVM, as it is used from debugserver. 18061da546Spatrick class StdStringExtractor { 19061da546Spatrick public: 20061da546Spatrick enum { BigEndian = 0, LittleEndian = 1 }; 21061da546Spatrick // Constructors and Destructors 22061da546Spatrick StdStringExtractor(); 23061da546Spatrick StdStringExtractor(const char *packet_cstr); 24061da546Spatrick virtual ~StdStringExtractor(); 25061da546Spatrick 26061da546Spatrick // Returns true if the file position is still valid for the data 27061da546Spatrick // contained in this string extractor object. IsGood()28061da546Spatrick bool IsGood() const { return m_index != UINT64_MAX; } 29061da546Spatrick GetFilePos()30061da546Spatrick uint64_t GetFilePos() const { return m_index; } 31061da546Spatrick SetFilePos(uint32_t idx)32061da546Spatrick void SetFilePos(uint32_t idx) { m_index = idx; } 33061da546Spatrick Clear()34061da546Spatrick void Clear() { 35061da546Spatrick m_packet.clear(); 36061da546Spatrick m_index = 0; 37061da546Spatrick } 38061da546Spatrick 39061da546Spatrick void SkipSpaces(); 40061da546Spatrick GetStringRef()41061da546Spatrick const std::string &GetStringRef() const { return m_packet; } 42061da546Spatrick Empty()43061da546Spatrick bool Empty() { return m_packet.empty(); } 44061da546Spatrick GetBytesLeft()45061da546Spatrick size_t GetBytesLeft() { 46061da546Spatrick if (m_index < m_packet.size()) 47061da546Spatrick return m_packet.size() - m_index; 48061da546Spatrick return 0; 49061da546Spatrick } 50061da546Spatrick 51061da546Spatrick char GetChar(char fail_value = '\0'); 52061da546Spatrick 53061da546Spatrick char PeekChar(char fail_value = '\0') { 54061da546Spatrick const char *cstr = Peek(); 55061da546Spatrick if (cstr) 56061da546Spatrick return cstr[0]; 57061da546Spatrick return fail_value; 58061da546Spatrick } 59061da546Spatrick 60061da546Spatrick int DecodeHexU8(); 61061da546Spatrick 62061da546Spatrick uint8_t GetHexU8(uint8_t fail_value = 0, bool set_eof_on_fail = true); 63061da546Spatrick 64061da546Spatrick bool GetHexU8Ex(uint8_t &ch, bool set_eof_on_fail = true); 65061da546Spatrick 66061da546Spatrick bool GetNameColonValue(std::string &name, std::string &value); 67061da546Spatrick 68061da546Spatrick int32_t GetS32(int32_t fail_value, int base = 0); 69061da546Spatrick 70061da546Spatrick uint32_t GetU32(uint32_t fail_value, int base = 0); 71061da546Spatrick 72061da546Spatrick int64_t GetS64(int64_t fail_value, int base = 0); 73061da546Spatrick 74061da546Spatrick uint64_t GetU64(uint64_t fail_value, int base = 0); 75061da546Spatrick 76061da546Spatrick uint32_t GetHexMaxU32(bool little_endian, uint32_t fail_value); 77061da546Spatrick 78061da546Spatrick uint64_t GetHexMaxU64(bool little_endian, uint64_t fail_value); 79061da546Spatrick 80061da546Spatrick size_t GetHexBytes(void *dst, size_t dst_len, uint8_t fail_fill_value); 81061da546Spatrick 82061da546Spatrick size_t GetHexBytesAvail(void *dst, size_t dst_len); 83061da546Spatrick 84061da546Spatrick size_t GetHexByteString(std::string &str); 85061da546Spatrick 86061da546Spatrick size_t GetHexByteStringFixedLength(std::string &str, uint32_t nibble_length); 87061da546Spatrick 88061da546Spatrick size_t GetHexByteStringTerminatedBy(std::string &str, char terminator); 89061da546Spatrick Peek()90061da546Spatrick const char *Peek() { 91061da546Spatrick if (m_index < m_packet.size()) 92061da546Spatrick return m_packet.c_str() + m_index; 93061da546Spatrick return nullptr; 94061da546Spatrick } 95061da546Spatrick 96061da546Spatrick protected: 97061da546Spatrick // For StdStringExtractor only 98061da546Spatrick std::string m_packet; // The string in which to extract data. 99061da546Spatrick uint64_t m_index; // When extracting data from a packet, this index 100061da546Spatrick // will march along as things get extracted. If set 101061da546Spatrick // to UINT64_MAX the end of the packet data was 102061da546Spatrick // reached when decoding information 103061da546Spatrick }; 104061da546Spatrick 105dda28197Spatrick #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_STDSTRINGEXTRACTOR_H 106