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