1 //===-- CommandReturnObject.cpp ---------------------------------*- 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 #include "lldb/Interpreter/CommandReturnObject.h" 11 12 // C Includes 13 // C++ Includes 14 // Other libraries and framework includes 15 // Project includes 16 #include "lldb/Core/StreamString.h" 17 18 using namespace lldb; 19 using namespace lldb_private; 20 21 static void 22 DumpStringToStreamWithNewline (Stream &strm, const std::string &s, bool add_newline_if_empty) 23 { 24 bool add_newline = false; 25 if (s.empty()) 26 { 27 add_newline = add_newline_if_empty; 28 } 29 else 30 { 31 // We already checked for empty above, now make sure there is a newline 32 // in the error, and if there isn't one, add one. 33 strm.Write(s.c_str(), s.size()); 34 35 const char last_char = *s.rbegin(); 36 add_newline = last_char != '\n' && last_char != '\r'; 37 38 } 39 if (add_newline) 40 strm.EOL(); 41 } 42 43 44 CommandReturnObject::CommandReturnObject () : 45 m_out_stream (), 46 m_err_stream (), 47 m_status (eReturnStatusStarted), 48 m_did_change_process_state (false) 49 { 50 } 51 52 CommandReturnObject::~CommandReturnObject () 53 { 54 } 55 56 void 57 CommandReturnObject::AppendErrorWithFormat (const char *format, ...) 58 { 59 va_list args; 60 va_start (args, format); 61 StreamString sstrm; 62 sstrm.PrintfVarArg(format, args); 63 va_end (args); 64 65 66 const std::string &s = sstrm.GetString(); 67 if (!s.empty()) 68 { 69 Stream &error_strm = GetErrorStream(); 70 error_strm.PutCString ("error: "); 71 DumpStringToStreamWithNewline (error_strm, s, false); 72 } 73 } 74 75 void 76 CommandReturnObject::AppendMessageWithFormat (const char *format, ...) 77 { 78 va_list args; 79 va_start (args, format); 80 StreamString sstrm; 81 sstrm.PrintfVarArg(format, args); 82 va_end (args); 83 84 GetOutputStream().Printf("%s", sstrm.GetData()); 85 } 86 87 void 88 CommandReturnObject::AppendWarningWithFormat (const char *format, ...) 89 { 90 va_list args; 91 va_start (args, format); 92 StreamString sstrm; 93 sstrm.PrintfVarArg(format, args); 94 va_end (args); 95 96 GetErrorStream().Printf("warning: %s", sstrm.GetData()); 97 } 98 99 void 100 CommandReturnObject::AppendMessage (const char *in_string, int len) 101 { 102 if (len < 0) 103 len = ::strlen (in_string); 104 GetOutputStream().Printf("%*.*s\n", len, len, in_string); 105 } 106 107 void 108 CommandReturnObject::AppendWarning (const char *in_string, int len) 109 { 110 if (len < 0) 111 len = ::strlen (in_string); 112 GetErrorStream().Printf("warning: %*.*s\n", len, len, in_string); 113 } 114 115 // Similar to AppendWarning, but do not prepend 'warning: ' to message, and 116 // don't append "\n" to the end of it. 117 118 void 119 CommandReturnObject::AppendRawWarning (const char *in_string, int len) 120 { 121 if (len < 0) 122 len = ::strlen (in_string); 123 GetErrorStream().Printf("%*.*s", len, len, in_string); 124 } 125 126 void 127 CommandReturnObject::AppendError (const char *in_string, int len) 128 { 129 if (!in_string) 130 return; 131 132 if (len < 0) 133 len = ::strlen (in_string); 134 GetErrorStream().Printf ("error: %*.*s\n", len, len, in_string); 135 } 136 137 // Similar to AppendError, but do not prepend 'Error: ' to message, and 138 // don't append "\n" to the end of it. 139 140 void 141 CommandReturnObject::AppendRawError (const char *in_string, int len) 142 { 143 if (len < 0) 144 len = ::strlen (in_string); 145 GetErrorStream().Printf ("%*.*s", len, len, in_string); 146 } 147 148 void 149 CommandReturnObject::SetStatus (ReturnStatus status) 150 { 151 m_status = status; 152 } 153 154 ReturnStatus 155 CommandReturnObject::GetStatus () 156 { 157 return m_status; 158 } 159 160 bool 161 CommandReturnObject::Succeeded () 162 { 163 return m_status <= eReturnStatusSuccessContinuingResult; 164 } 165 166 bool 167 CommandReturnObject::HasResult () 168 { 169 return (m_status == eReturnStatusSuccessFinishResult || 170 m_status == eReturnStatusSuccessContinuingResult); 171 } 172 173 void 174 CommandReturnObject::Clear() 175 { 176 lldb::StreamSP stream_sp; 177 stream_sp = m_out_stream.GetStreamAtIndex (eStreamStringIndex); 178 if (stream_sp) 179 static_cast<StreamString *>(stream_sp.get())->Clear(); 180 stream_sp = m_err_stream.GetStreamAtIndex (eStreamStringIndex); 181 if (stream_sp) 182 static_cast<StreamString *>(stream_sp.get())->Clear(); 183 m_status = eReturnStatusStarted; 184 m_did_change_process_state = false; 185 } 186 187 bool 188 CommandReturnObject::GetDidChangeProcessState () 189 { 190 return m_did_change_process_state; 191 } 192 193 void 194 CommandReturnObject::SetDidChangeProcessState (bool b) 195 { 196 m_did_change_process_state = b; 197 } 198 199