1 //===-- StringPrinter.h -----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_StringPrinter_h_
11 #define liblldb_StringPrinter_h_
18 // Other libraries and framework includes
20 #include "lldb/lldb-forward.h"
22 #include "lldb/Utility/DataExtractor.h"
24 namespace lldb_private {
25 namespace formatters {
28 enum class StringElementType { ASCII, UTF8, UTF16, UTF32 };
30 enum class GetPrintableElementType { ASCII, UTF8 };
32 class ReadStringAndDumpToStreamOptions {
34 ReadStringAndDumpToStreamOptions()
35 : m_location(0), m_process_sp(), m_stream(nullptr), m_prefix_token(),
36 m_suffix_token(), m_quote('"'), m_source_size(0),
37 m_needs_zero_termination(true), m_escape_non_printables(true),
38 m_ignore_max_length(false), m_zero_is_terminator(true),
39 m_language_type(lldb::eLanguageTypeUnknown) {}
41 ReadStringAndDumpToStreamOptions(ValueObject &valobj);
43 ReadStringAndDumpToStreamOptions &SetLocation(uint64_t l) {
48 uint64_t GetLocation() const { return m_location; }
50 ReadStringAndDumpToStreamOptions &SetProcessSP(lldb::ProcessSP p) {
55 lldb::ProcessSP GetProcessSP() const { return m_process_sp; }
57 ReadStringAndDumpToStreamOptions &SetStream(Stream *s) {
62 Stream *GetStream() const { return m_stream; }
64 ReadStringAndDumpToStreamOptions &SetPrefixToken(const std::string &p) {
69 ReadStringAndDumpToStreamOptions &SetPrefixToken(std::nullptr_t) {
70 m_prefix_token.clear();
74 const char *GetPrefixToken() const { return m_prefix_token.c_str(); }
76 ReadStringAndDumpToStreamOptions &SetSuffixToken(const std::string &p) {
81 ReadStringAndDumpToStreamOptions &SetSuffixToken(std::nullptr_t) {
82 m_suffix_token.clear();
86 const char *GetSuffixToken() const { return m_suffix_token.c_str(); }
88 ReadStringAndDumpToStreamOptions &SetQuote(char q) {
93 char GetQuote() const { return m_quote; }
95 ReadStringAndDumpToStreamOptions &SetSourceSize(uint32_t s) {
100 uint32_t GetSourceSize() const { return m_source_size; }
102 ReadStringAndDumpToStreamOptions &SetNeedsZeroTermination(bool z) {
103 m_needs_zero_termination = z;
107 bool GetNeedsZeroTermination() const { return m_needs_zero_termination; }
109 ReadStringAndDumpToStreamOptions &SetBinaryZeroIsTerminator(bool e) {
110 m_zero_is_terminator = e;
114 bool GetBinaryZeroIsTerminator() const { return m_zero_is_terminator; }
116 ReadStringAndDumpToStreamOptions &SetEscapeNonPrintables(bool e) {
117 m_escape_non_printables = e;
121 bool GetEscapeNonPrintables() const { return m_escape_non_printables; }
123 ReadStringAndDumpToStreamOptions &SetIgnoreMaxLength(bool e) {
124 m_ignore_max_length = e;
128 bool GetIgnoreMaxLength() const { return m_ignore_max_length; }
130 ReadStringAndDumpToStreamOptions &SetLanguage(lldb::LanguageType l) {
135 lldb::LanguageType GetLanguage() const
138 return m_language_type;
143 lldb::ProcessSP m_process_sp;
145 std::string m_prefix_token;
146 std::string m_suffix_token;
148 uint32_t m_source_size;
149 bool m_needs_zero_termination;
150 bool m_escape_non_printables;
151 bool m_ignore_max_length;
152 bool m_zero_is_terminator;
153 lldb::LanguageType m_language_type;
156 class ReadBufferAndDumpToStreamOptions {
158 ReadBufferAndDumpToStreamOptions()
159 : m_data(), m_stream(nullptr), m_prefix_token(), m_suffix_token(),
160 m_quote('"'), m_source_size(0), m_escape_non_printables(true),
161 m_zero_is_terminator(true), m_is_truncated(false),
162 m_language_type(lldb::eLanguageTypeUnknown) {}
164 ReadBufferAndDumpToStreamOptions(ValueObject &valobj);
166 ReadBufferAndDumpToStreamOptions(
167 const ReadStringAndDumpToStreamOptions &options);
169 ReadBufferAndDumpToStreamOptions &SetData(DataExtractor d) {
174 lldb_private::DataExtractor GetData() const { return m_data; }
176 ReadBufferAndDumpToStreamOptions &SetStream(Stream *s) {
181 Stream *GetStream() const { return m_stream; }
183 ReadBufferAndDumpToStreamOptions &SetPrefixToken(const std::string &p) {
188 ReadBufferAndDumpToStreamOptions &SetPrefixToken(std::nullptr_t) {
189 m_prefix_token.clear();
193 const char *GetPrefixToken() const { return m_prefix_token.c_str(); }
195 ReadBufferAndDumpToStreamOptions &SetSuffixToken(const std::string &p) {
200 ReadBufferAndDumpToStreamOptions &SetSuffixToken(std::nullptr_t) {
201 m_suffix_token.clear();
205 const char *GetSuffixToken() const { return m_suffix_token.c_str(); }
207 ReadBufferAndDumpToStreamOptions &SetQuote(char q) {
212 char GetQuote() const { return m_quote; }
214 ReadBufferAndDumpToStreamOptions &SetSourceSize(uint32_t s) {
219 uint32_t GetSourceSize() const { return m_source_size; }
221 ReadBufferAndDumpToStreamOptions &SetEscapeNonPrintables(bool e) {
222 m_escape_non_printables = e;
226 bool GetEscapeNonPrintables() const { return m_escape_non_printables; }
228 ReadBufferAndDumpToStreamOptions &SetBinaryZeroIsTerminator(bool e) {
229 m_zero_is_terminator = e;
233 bool GetBinaryZeroIsTerminator() const { return m_zero_is_terminator; }
235 ReadBufferAndDumpToStreamOptions &SetIsTruncated(bool t) {
240 bool GetIsTruncated() const { return m_is_truncated; }
242 ReadBufferAndDumpToStreamOptions &SetLanguage(lldb::LanguageType l) {
247 lldb::LanguageType GetLanguage() const
250 return m_language_type;
254 DataExtractor m_data;
256 std::string m_prefix_token;
257 std::string m_suffix_token;
259 uint32_t m_source_size;
260 bool m_escape_non_printables;
261 bool m_zero_is_terminator;
263 lldb::LanguageType m_language_type;
266 // I can't use a std::unique_ptr for this because the Deleter is a template
268 // and I want the same type to represent both pointers I want to free and
269 // pointers I don't need
270 // to free - which is what this class essentially is
271 // It's very specialized to the needs of this file, and not suggested for
273 template <typename T = uint8_t, typename U = char, typename S = size_t>
274 struct StringPrinterBufferPointer {
276 typedef std::function<void(const T *)> Deleter;
278 StringPrinterBufferPointer(std::nullptr_t ptr)
279 : m_data(nullptr), m_size(0), m_deleter() {}
281 StringPrinterBufferPointer(const T *bytes, S size,
282 Deleter deleter = nullptr)
283 : m_data(bytes), m_size(size), m_deleter(deleter) {}
285 StringPrinterBufferPointer(const U *bytes, S size,
286 Deleter deleter = nullptr)
287 : m_data(reinterpret_cast<const T *>(bytes)), m_size(size),
288 m_deleter(deleter) {}
290 StringPrinterBufferPointer(StringPrinterBufferPointer &&rhs)
291 : m_data(rhs.m_data), m_size(rhs.m_size), m_deleter(rhs.m_deleter) {
292 rhs.m_data = nullptr;
295 StringPrinterBufferPointer(const StringPrinterBufferPointer &rhs)
296 : m_data(rhs.m_data), m_size(rhs.m_size), m_deleter(rhs.m_deleter) {
297 rhs.m_data = nullptr; // this is why m_data has to be mutable
300 ~StringPrinterBufferPointer() {
301 if (m_data && m_deleter)
306 const T *GetBytes() const { return m_data; }
308 const S GetSize() const { return m_size; }
310 StringPrinterBufferPointer &
311 operator=(const StringPrinterBufferPointer &rhs) {
312 if (m_data && m_deleter)
316 m_deleter = rhs.m_deleter;
317 rhs.m_data = nullptr;
322 mutable const T *m_data;
327 typedef std::function<StringPrinter::StringPrinterBufferPointer<
328 uint8_t, char, size_t>(uint8_t *, uint8_t *, uint8_t *&)>
330 typedef std::function<EscapingHelper(GetPrintableElementType)>
331 EscapingHelperGenerator;
333 static EscapingHelper
334 GetDefaultEscapingHelper(GetPrintableElementType elem_type);
336 template <StringElementType element_type>
338 ReadStringAndDumpToStream(const ReadStringAndDumpToStreamOptions &options);
340 template <StringElementType element_type>
342 ReadBufferAndDumpToStream(const ReadBufferAndDumpToStreamOptions &options);
345 } // namespace formatters
346 } // namespace lldb_private
348 #endif // liblldb_StringPrinter_h_