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