1 //===-- StringPrinter.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_DATAFORMATTERS_STRINGPRINTER_H 10 #define LLDB_DATAFORMATTERS_STRINGPRINTER_H 11 12 #include <functional> 13 #include <string> 14 15 #include "lldb/Core/Address.h" 16 #include "lldb/Utility/DataExtractor.h" 17 #include "lldb/lldb-forward.h" 18 19 namespace lldb_private { 20 namespace formatters { 21 class StringPrinter { 22 public: 23 enum class StringElementType { ASCII, UTF8, UTF16, UTF32 }; 24 25 enum class GetPrintableElementType { ASCII, UTF8 }; 26 27 enum class EscapeStyle { CXX, Swift }; 28 29 class DumpToStreamOptions { 30 public: 31 DumpToStreamOptions() = default; 32 SetStream(Stream * s)33 void SetStream(Stream *s) { m_stream = s; } 34 GetStream()35 Stream *GetStream() const { return m_stream; } 36 SetPrefixToken(const std::string & p)37 void SetPrefixToken(const std::string &p) { m_prefix_token = p; } 38 SetPrefixToken(std::nullptr_t)39 void SetPrefixToken(std::nullptr_t) { m_prefix_token.clear(); } 40 GetPrefixToken()41 const char *GetPrefixToken() const { return m_prefix_token.c_str(); } 42 SetSuffixToken(const std::string & p)43 void SetSuffixToken(const std::string &p) { m_suffix_token = p; } 44 SetSuffixToken(std::nullptr_t)45 void SetSuffixToken(std::nullptr_t) { m_suffix_token.clear(); } 46 GetSuffixToken()47 const char *GetSuffixToken() const { return m_suffix_token.c_str(); } 48 SetQuote(char q)49 void SetQuote(char q) { m_quote = q; } 50 GetQuote()51 char GetQuote() const { return m_quote; } 52 SetSourceSize(uint32_t s)53 void SetSourceSize(uint32_t s) { m_source_size = s; } 54 GetSourceSize()55 uint32_t GetSourceSize() const { return m_source_size; } 56 SetNeedsZeroTermination(bool z)57 void SetNeedsZeroTermination(bool z) { m_needs_zero_termination = z; } 58 GetNeedsZeroTermination()59 bool GetNeedsZeroTermination() const { return m_needs_zero_termination; } 60 SetBinaryZeroIsTerminator(bool e)61 void SetBinaryZeroIsTerminator(bool e) { m_zero_is_terminator = e; } 62 GetBinaryZeroIsTerminator()63 bool GetBinaryZeroIsTerminator() const { return m_zero_is_terminator; } 64 SetEscapeNonPrintables(bool e)65 void SetEscapeNonPrintables(bool e) { m_escape_non_printables = e; } 66 GetEscapeNonPrintables()67 bool GetEscapeNonPrintables() const { return m_escape_non_printables; } 68 SetIgnoreMaxLength(bool e)69 void SetIgnoreMaxLength(bool e) { m_ignore_max_length = e; } 70 GetIgnoreMaxLength()71 bool GetIgnoreMaxLength() const { return m_ignore_max_length; } 72 SetEscapeStyle(EscapeStyle style)73 void SetEscapeStyle(EscapeStyle style) { m_escape_style = style; } 74 GetEscapeStyle()75 EscapeStyle GetEscapeStyle() const { return m_escape_style; } 76 77 private: 78 /// The used output stream. 79 Stream *m_stream = nullptr; 80 /// String that should be printed before the heading quote character. 81 std::string m_prefix_token; 82 /// String that should be printed after the trailing quote character. 83 std::string m_suffix_token; 84 /// The quote character that should surround the string. 85 char m_quote = '"'; 86 /// The length of the memory region that should be dumped in bytes. 87 uint32_t m_source_size = 0; 88 bool m_needs_zero_termination = true; 89 /// True iff non-printable characters should be escaped when dumping 90 /// them to the stream. 91 bool m_escape_non_printables = true; 92 /// True iff the max-string-summary-length setting of the target should 93 /// be ignored. 94 bool m_ignore_max_length = false; 95 /// True iff a zero bytes ('\0') should terminate the memory region that 96 /// is being dumped. 97 bool m_zero_is_terminator = true; 98 /// The language-specific style for escaping special characters. 99 EscapeStyle m_escape_style = EscapeStyle::CXX; 100 }; 101 102 class ReadStringAndDumpToStreamOptions : public DumpToStreamOptions { 103 public: 104 ReadStringAndDumpToStreamOptions() = default; 105 106 ReadStringAndDumpToStreamOptions(ValueObject &valobj); 107 SetLocation(Address l)108 void SetLocation(Address l) { m_location = std::move(l); } 109 GetLocation()110 const Address &GetLocation() const { return m_location; } 111 SetTargetSP(lldb::TargetSP t)112 void SetTargetSP(lldb::TargetSP t) { m_target_sp = std::move(t); } 113 GetTargetSP()114 lldb::TargetSP GetTargetSP() const { return m_target_sp; } 115 SetHasSourceSize(bool e)116 void SetHasSourceSize(bool e) { m_has_source_size = e; } 117 HasSourceSize()118 bool HasSourceSize() const { return m_has_source_size; } 119 120 private: 121 Address m_location; 122 lldb::TargetSP m_target_sp; 123 /// True iff we know the source size of the string. 124 bool m_has_source_size = false; 125 }; 126 127 class ReadBufferAndDumpToStreamOptions : public DumpToStreamOptions { 128 public: 129 ReadBufferAndDumpToStreamOptions() = default; 130 131 ReadBufferAndDumpToStreamOptions(ValueObject &valobj); 132 133 ReadBufferAndDumpToStreamOptions( 134 const ReadStringAndDumpToStreamOptions &options); 135 SetData(DataExtractor && d)136 void SetData(DataExtractor &&d) { m_data = std::move(d); } 137 GetData()138 const lldb_private::DataExtractor &GetData() const { return m_data; } 139 SetIsTruncated(bool t)140 void SetIsTruncated(bool t) { m_is_truncated = t; } 141 GetIsTruncated()142 bool GetIsTruncated() const { return m_is_truncated; } 143 private: 144 DataExtractor m_data; 145 bool m_is_truncated = false; 146 }; 147 148 template <StringElementType element_type> 149 static bool 150 ReadStringAndDumpToStream(const ReadStringAndDumpToStreamOptions &options); 151 152 template <StringElementType element_type> 153 static bool 154 ReadBufferAndDumpToStream(const ReadBufferAndDumpToStreamOptions &options); 155 }; 156 157 } // namespace formatters 158 } // namespace lldb_private 159 160 #endif // LLDB_DATAFORMATTERS_STRINGPRINTER_H 161