blob: e58eae1970710b4fc2b1d0edc02573c20d846c35 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- StringExtractor.h ---------------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef utility_StringExtractor_h_
11#define utility_StringExtractor_h_
12
13// C Includes
14// C++ Includes
15#include <string>
Eli Friedmanf553b512010-06-09 09:38:08 +000016#include <stdint.h>
Chris Lattner24943d22010-06-08 16:52:24 +000017
18// Other libraries and framework includes
19// Project includes
20
21class StringExtractor
22{
23public:
24
25 enum {
26 BigEndian = 0,
27 LittleEndian = 1
28 };
29 //------------------------------------------------------------------
30 // Constructors and Destructors
31 //------------------------------------------------------------------
32 StringExtractor();
33 StringExtractor(const char *packet_cstr);
34 StringExtractor(const StringExtractor& rhs);
35 virtual ~StringExtractor();
36
37 //------------------------------------------------------------------
38 // Operators
39 //------------------------------------------------------------------
40 const StringExtractor&
41 operator=(const StringExtractor& rhs);
42
43 // Returns true if the file position is still valid for the data
44 // contained in this string extractor object.
45 bool
46 IsGood() const
47 {
48 return m_index != UINT32_MAX;
49 }
50
51 uint32_t
52 GetFilePos () const
53 {
54 return m_index;
55 }
56
57 void
58 SetFilePos (uint32_t idx)
59 {
60 m_index = idx;
61 }
62
63 void
64 Clear ()
65 {
66 m_packet.clear();
67 m_index = 0;
68 }
69
70 std::string &
71 GetStringRef ()
72 {
73 return m_packet;
74 }
75
76 bool
77 Empty()
78 {
79 return m_packet.empty();
80 }
81
82 uint32_t
83 GetBytesLeft ()
84 {
85 if (m_index < m_packet.size())
86 return m_packet.size() - m_index;
87 return 0;
88 }
89 char
90 GetChar (char fail_value = '\0');
91
92 int8_t
93 GetHexS8 (int8_t fail_value = 0);
94
95 uint8_t
96 GetHexU8 (uint8_t fail_value = 0);
97
98 bool
99 GetNameColonValue (std::string &name, std::string &value);
100
101 uint32_t
Greg Clayton24bc5d92011-03-30 18:16:51 +0000102 GetU32 (uint32_t fail_value, int base = 0);
103
104 uint32_t
Chris Lattner24943d22010-06-08 16:52:24 +0000105 GetHexMaxU32 (bool little_endian, uint32_t fail_value);
106
107 uint64_t
108 GetHexMaxU64 (bool little_endian, uint64_t fail_value);
109
110 size_t
111 GetHexBytes (void *dst, size_t dst_len, uint8_t fail_fill_value);
112
113 uint64_t
114 GetHexWithFixedSize (uint32_t byte_size, bool little_endian, uint64_t fail_value);
115
Greg Clayton4862fa22011-01-08 03:17:57 +0000116 size_t
117 GetHexByteString (std::string &str);
118
Greg Claytonc71899e2011-01-18 19:36:39 +0000119 const char *
120 Peek ()
121 {
122 if (m_index < m_packet.size())
123 return m_packet.c_str() + m_index;
124 return NULL;
125 }
126
Chris Lattner24943d22010-06-08 16:52:24 +0000127protected:
128 //------------------------------------------------------------------
129 // For StringExtractor only
130 //------------------------------------------------------------------
131 std::string m_packet; // The string in which to extract data.
132 uint32_t m_index; // When extracting data from a packet, this index
133 // will march along as things get extracted. If set
134 // to UINT32_MAX the end of the packet data was
135 // reached when decoding information
136
137 uint32_t
138 GetNumHexASCIICharsAtFilePos (uint32_t max = UINT32_MAX) const;
139};
140
141#endif // utility_StringExtractor_h_