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