1 //===-- StringExtractor.h ---------------------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef LLDB_UTILITY_STRINGEXTRACTOR_H 10 #define LLDB_UTILITY_STRINGEXTRACTOR_H 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/StringRef.h" 14 15 #include <cstddef> 16 #include <cstdint> 17 #include <string> 18 19 class StringExtractor { 20 public: 21 enum { BigEndian = 0, LittleEndian = 1 }; 22 // Constructors and Destructors 23 StringExtractor(); 24 StringExtractor(llvm::StringRef packet_str); 25 StringExtractor(const char *packet_cstr); 26 virtual ~StringExtractor(); 27 Reset(llvm::StringRef str)28 void Reset(llvm::StringRef str) { 29 m_packet = std::string(str); 30 m_index = 0; 31 } 32 33 // Returns true if the file position is still valid for the data contained in 34 // this string extractor object. IsGood()35 bool IsGood() const { return m_index != UINT64_MAX; } 36 GetFilePos()37 uint64_t GetFilePos() const { return m_index; } 38 SetFilePos(uint32_t idx)39 void SetFilePos(uint32_t idx) { m_index = idx; } 40 Clear()41 void Clear() { 42 m_packet.clear(); 43 m_index = 0; 44 } 45 46 void SkipSpaces(); 47 GetStringRef()48 llvm::StringRef GetStringRef() const { return m_packet; } 49 Empty()50 bool Empty() { return m_packet.empty(); } 51 GetBytesLeft()52 size_t GetBytesLeft() { 53 if (m_index < m_packet.size()) 54 return m_packet.size() - m_index; 55 return 0; 56 } 57 58 char GetChar(char fail_value = '\0'); 59 60 char PeekChar(char fail_value = '\0') { 61 const char *cstr = Peek(); 62 if (cstr) 63 return cstr[0]; 64 return fail_value; 65 } 66 67 int DecodeHexU8(); 68 69 uint8_t GetHexU8(uint8_t fail_value = 0, bool set_eof_on_fail = true); 70 71 bool GetHexU8Ex(uint8_t &ch, bool set_eof_on_fail = true); 72 73 bool GetNameColonValue(llvm::StringRef &name, llvm::StringRef &value); 74 75 int32_t GetS32(int32_t fail_value, int base = 0); 76 77 uint32_t GetU32(uint32_t fail_value, int base = 0); 78 79 int64_t GetS64(int64_t fail_value, int base = 0); 80 81 uint64_t GetU64(uint64_t fail_value, int base = 0); 82 83 uint32_t GetHexMaxU32(bool little_endian, uint32_t fail_value); 84 85 uint64_t GetHexMaxU64(bool little_endian, uint64_t fail_value); 86 87 size_t GetHexBytes(llvm::MutableArrayRef<uint8_t> dest, 88 uint8_t fail_fill_value); 89 90 size_t GetHexBytesAvail(llvm::MutableArrayRef<uint8_t> dest); 91 92 size_t GetHexByteString(std::string &str); 93 94 size_t GetHexByteStringFixedLength(std::string &str, uint32_t nibble_length); 95 96 size_t GetHexByteStringTerminatedBy(std::string &str, char terminator); 97 98 bool ConsumeFront(const llvm::StringRef &str); 99 Peek()100 const char *Peek() { 101 if (m_index < m_packet.size()) 102 return m_packet.c_str() + m_index; 103 return nullptr; 104 } 105 106 protected: fail()107 bool fail() { 108 m_index = UINT64_MAX; 109 return false; 110 } 111 112 /// The string in which to extract data. 113 std::string m_packet; 114 115 /// When extracting data from a packet, this index will march along as things 116 /// get extracted. If set to UINT64_MAX the end of the packet data was 117 /// reached when decoding information. 118 uint64_t m_index = 0; 119 }; 120 121 #endif // LLDB_UTILITY_STRINGEXTRACTOR_H 122