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 utility_StringExtractor_h_ 10 #define utility_StringExtractor_h_ 11 12 #include "llvm/ADT/ArrayRef.h" 13 #include "llvm/ADT/StringRef.h" 14 15 #include <stddef.h> 16 #include <stdint.h> 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 28 void Reset(llvm::StringRef str) { 29 m_packet = 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. 35 bool IsGood() const { return m_index != UINT64_MAX; } 36 37 uint64_t GetFilePos() const { return m_index; } 38 39 void SetFilePos(uint32_t idx) { m_index = idx; } 40 41 void Clear() { 42 m_packet.clear(); 43 m_index = 0; 44 } 45 46 void SkipSpaces(); 47 48 std::string &GetStringRef() { return m_packet; } 49 50 const std::string &GetStringRef() const { return m_packet; } 51 52 bool Empty() { return m_packet.empty(); } 53 54 size_t GetBytesLeft() { 55 if (m_index < m_packet.size()) 56 return m_packet.size() - m_index; 57 return 0; 58 } 59 60 char GetChar(char fail_value = '\0'); 61 62 char PeekChar(char fail_value = '\0') { 63 const char *cstr = Peek(); 64 if (cstr) 65 return cstr[0]; 66 return fail_value; 67 } 68 69 int DecodeHexU8(); 70 71 uint8_t GetHexU8(uint8_t fail_value = 0, bool set_eof_on_fail = true); 72 73 bool GetHexU8Ex(uint8_t &ch, bool set_eof_on_fail = true); 74 75 bool GetNameColonValue(llvm::StringRef &name, llvm::StringRef &value); 76 77 int32_t GetS32(int32_t fail_value, int base = 0); 78 79 uint32_t GetU32(uint32_t fail_value, int base = 0); 80 81 int64_t GetS64(int64_t fail_value, int base = 0); 82 83 uint64_t GetU64(uint64_t fail_value, int base = 0); 84 85 uint32_t GetHexMaxU32(bool little_endian, uint32_t fail_value); 86 87 uint64_t GetHexMaxU64(bool little_endian, uint64_t fail_value); 88 89 size_t GetHexBytes(llvm::MutableArrayRef<uint8_t> dest, 90 uint8_t fail_fill_value); 91 92 size_t GetHexBytesAvail(llvm::MutableArrayRef<uint8_t> dest); 93 94 uint64_t GetHexWithFixedSize(uint32_t byte_size, bool little_endian, 95 uint64_t fail_value); 96 97 size_t GetHexByteString(std::string &str); 98 99 size_t GetHexByteStringFixedLength(std::string &str, uint32_t nibble_length); 100 101 size_t GetHexByteStringTerminatedBy(std::string &str, char terminator); 102 103 bool ConsumeFront(const llvm::StringRef &str); 104 105 const char *Peek() { 106 if (m_index < m_packet.size()) 107 return m_packet.c_str() + m_index; 108 return nullptr; 109 } 110 111 protected: 112 bool fail() { 113 m_index = UINT64_MAX; 114 return false; 115 } 116 // For StringExtractor only 117 std::string m_packet; // The string in which to extract data. 118 uint64_t m_index; // When extracting data from a packet, this index 119 // will march along as things get extracted. If set to 120 // UINT64_MAX the end of the packet data was reached 121 // when decoding information 122 }; 123 124 #endif // utility_StringExtractor_h_ 125