/Users/buildslave/jenkins/workspace/coverage/llvm-project/lldb/include/lldb/Utility/StringExtractor.h
Line | Count | Source (jump to first uncovered line) |
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 | | |
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. |
35 | 51.4M | bool IsGood() const { return m_index != UINT64_MAX; } |
36 | | |
37 | 24 | uint64_t GetFilePos() const { return m_index; } |
38 | | |
39 | 510k | void SetFilePos(uint32_t idx) { m_index = idx; } |
40 | | |
41 | 1.09M | void Clear() { |
42 | 1.09M | m_packet.clear(); |
43 | 1.09M | m_index = 0; |
44 | 1.09M | } |
45 | | |
46 | | void SkipSpaces(); |
47 | | |
48 | 730k | llvm::StringRef GetStringRef() const { return m_packet; } |
49 | | |
50 | 32.2k | bool Empty() { return m_packet.empty(); } |
51 | | |
52 | 103M | size_t GetBytesLeft() { |
53 | 103M | if (m_index < m_packet.size()) |
54 | 103M | return m_packet.size() - m_index; |
55 | 5.59k | return 0; |
56 | 103M | } |
57 | | |
58 | | char GetChar(char fail_value = '\0'); |
59 | | |
60 | 5 | char PeekChar(char fail_value = '\0') { |
61 | 5 | const char *cstr = Peek(); |
62 | 5 | if (cstr) |
63 | 5 | return cstr[0]; |
64 | 0 | return fail_value; |
65 | 5 | } |
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 | | |
100 | 668 | const char *Peek() { |
101 | 668 | if (m_index < m_packet.size()) |
102 | 534 | return m_packet.c_str() + m_index; |
103 | 134 | return nullptr; |
104 | 668 | } |
105 | | |
106 | | protected: |
107 | 67.2k | bool fail() { |
108 | 67.2k | m_index = UINT64_MAX; |
109 | 67.2k | return false; |
110 | 67.2k | } |
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 |