blob: 8d748570a5d946a8644a15146a41976e9161a2d4 [file] [log] [blame]
Chris Lattner24943d22010-06-08 16:52:24 +00001//===-- SBCommandInterpreter.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/lldb-types.h"
Jim Ingham84cdc152010-06-15 19:49:27 +000011#include "lldb/Interpreter/Args.h"
Chris Lattner24943d22010-06-08 16:52:24 +000012#include "lldb/Core/SourceManager.h"
13#include "lldb/Core/Listener.h"
14#include "lldb/Interpreter/CommandInterpreter.h"
15#include "lldb/Interpreter/CommandReturnObject.h"
16#include "lldb/Target/Target.h"
17
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000018#include "lldb/API/SBBroadcaster.h"
19#include "lldb/API/SBDebugger.h"
20#include "lldb/API/SBCommandReturnObject.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000021#include "lldb/API/SBSourceManager.h"
22#include "lldb/API/SBCommandInterpreter.h"
23#include "lldb/API/SBProcess.h"
24#include "lldb/API/SBTarget.h"
25#include "lldb/API/SBListener.h"
Caroline Tice7826c882010-10-26 03:11:13 +000026#include "lldb/API/SBStream.h"
Eli Friedmand6ec8aa2010-06-09 07:37:52 +000027#include "lldb/API/SBStringList.h"
Chris Lattner24943d22010-06-08 16:52:24 +000028
29using namespace lldb;
30using namespace lldb_private;
31
32
Greg Clayton63094e02010-06-23 01:19:29 +000033SBCommandInterpreter::SBCommandInterpreter (CommandInterpreter *interpreter) :
34 m_opaque_ptr (interpreter)
Chris Lattner24943d22010-06-08 16:52:24 +000035{
Greg Claytone005f2c2010-11-06 01:53:30 +000036 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000037
38 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +000039 log->Printf ("SBCommandInterpreter::SBCommandInterpreter (interpreter=%p)"
40 " => SBCommandInterpreter(%p)", interpreter, m_opaque_ptr);
Chris Lattner24943d22010-06-08 16:52:24 +000041}
42
Greg Clayton538eb822010-11-05 23:17:00 +000043SBCommandInterpreter::SBCommandInterpreter(const SBCommandInterpreter &rhs) :
44 m_opaque_ptr (rhs.m_opaque_ptr)
45{
46}
47
48const SBCommandInterpreter &
49SBCommandInterpreter::operator = (const SBCommandInterpreter &rhs)
50{
51 m_opaque_ptr = rhs.m_opaque_ptr;
52 return *this;
53}
54
Chris Lattner24943d22010-06-08 16:52:24 +000055SBCommandInterpreter::~SBCommandInterpreter ()
56{
57}
58
59bool
Greg Clayton63094e02010-06-23 01:19:29 +000060SBCommandInterpreter::IsValid() const
61{
62 return m_opaque_ptr != NULL;
63}
64
65
66bool
Chris Lattner24943d22010-06-08 16:52:24 +000067SBCommandInterpreter::CommandExists (const char *cmd)
68{
Greg Clayton63094e02010-06-23 01:19:29 +000069 if (m_opaque_ptr)
70 return m_opaque_ptr->CommandExists (cmd);
71 return false;
Chris Lattner24943d22010-06-08 16:52:24 +000072}
73
74bool
75SBCommandInterpreter::AliasExists (const char *cmd)
76{
Greg Clayton63094e02010-06-23 01:19:29 +000077 if (m_opaque_ptr)
78 return m_opaque_ptr->AliasExists (cmd);
79 return false;
Chris Lattner24943d22010-06-08 16:52:24 +000080}
81
Chris Lattner24943d22010-06-08 16:52:24 +000082lldb::ReturnStatus
83SBCommandInterpreter::HandleCommand (const char *command_line, SBCommandReturnObject &result, bool add_to_history)
84{
Greg Claytone005f2c2010-11-06 01:53:30 +000085 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +000086
87 if (log)
Greg Clayton49ce6822010-10-31 03:01:06 +000088 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p), add_to_history=%i)",
89 m_opaque_ptr, command_line, result.get(), add_to_history);
Caroline Tice7826c882010-10-26 03:11:13 +000090
Chris Lattner24943d22010-06-08 16:52:24 +000091 result.Clear();
Greg Clayton63094e02010-06-23 01:19:29 +000092 if (m_opaque_ptr)
93 {
94 m_opaque_ptr->HandleCommand (command_line, add_to_history, result.ref());
95 }
96 else
97 {
98 result->AppendError ("SBCommandInterpreter is not valid");
99 result->SetStatus (eReturnStatusFailed);
100 }
Caroline Tice7826c882010-10-26 03:11:13 +0000101
Caroline Tice7de24cc2010-10-27 21:23:37 +0000102 // We need to get the value again, in case the command disabled the log!
103 log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API);
Caroline Tice7826c882010-10-26 03:11:13 +0000104 if (log)
105 {
106 SBStream sstr;
107 result.GetDescription (sstr);
Greg Clayton49ce6822010-10-31 03:01:06 +0000108 log->Printf ("SBCommandInterpreter(%p)::HandleCommand (command=\"%s\", SBCommandReturnObject(%p): %s, add_to_history=%i) => %i",
109 m_opaque_ptr, command_line, result.get(), sstr.GetData(), add_to_history, result.GetStatus());
Caroline Tice7826c882010-10-26 03:11:13 +0000110 }
111
Chris Lattner24943d22010-06-08 16:52:24 +0000112 return result.GetStatus();
113}
114
115int
116SBCommandInterpreter::HandleCompletion (const char *current_line,
117 const char *cursor,
118 const char *last_char,
119 int match_start_point,
120 int max_return_elements,
121 SBStringList &matches)
122{
Greg Clayton63094e02010-06-23 01:19:29 +0000123 int num_completions = 0;
124 if (m_opaque_ptr)
125 {
126 lldb_private::StringList lldb_matches;
127 num_completions = m_opaque_ptr->HandleCompletion (current_line, cursor, last_char, match_start_point,
128 max_return_elements, lldb_matches);
Chris Lattner24943d22010-06-08 16:52:24 +0000129
Greg Clayton63094e02010-06-23 01:19:29 +0000130 SBStringList temp_list (&lldb_matches);
131 matches.AppendList (temp_list);
132 }
Chris Lattner24943d22010-06-08 16:52:24 +0000133 return num_completions;
134}
135
Chris Lattner24943d22010-06-08 16:52:24 +0000136bool
137SBCommandInterpreter::HasCommands ()
138{
Greg Clayton63094e02010-06-23 01:19:29 +0000139 if (m_opaque_ptr)
140 return m_opaque_ptr->HasCommands();
141 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000142}
143
144bool
145SBCommandInterpreter::HasAliases ()
146{
Greg Clayton63094e02010-06-23 01:19:29 +0000147 if (m_opaque_ptr)
148 return m_opaque_ptr->HasAliases();
149 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000150}
151
152bool
Chris Lattner24943d22010-06-08 16:52:24 +0000153SBCommandInterpreter::HasAliasOptions ()
154{
Greg Clayton63094e02010-06-23 01:19:29 +0000155 if (m_opaque_ptr)
156 return m_opaque_ptr->HasAliasOptions ();
157 return false;
Chris Lattner24943d22010-06-08 16:52:24 +0000158}
159
Chris Lattner24943d22010-06-08 16:52:24 +0000160SBProcess
161SBCommandInterpreter::GetProcess ()
162{
163 SBProcess process;
Greg Clayton63094e02010-06-23 01:19:29 +0000164 if (m_opaque_ptr)
Chris Lattner24943d22010-06-08 16:52:24 +0000165 {
Greg Clayton63094e02010-06-23 01:19:29 +0000166 Debugger &debugger = m_opaque_ptr->GetDebugger();
Jim Inghamc8332952010-08-26 21:32:51 +0000167 Target *target = debugger.GetSelectedTarget().get();
Chris Lattner24943d22010-06-08 16:52:24 +0000168 if (target)
169 process.SetProcess(target->GetProcessSP());
170 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000171 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000172
173 if (log)
174 log->Printf ("SBCommandInterpreter(%p)::GetProcess () => SBProcess(%p)",
175 m_opaque_ptr, process.get());
176
177
Chris Lattner24943d22010-06-08 16:52:24 +0000178 return process;
179}
180
181ssize_t
182SBCommandInterpreter::WriteToScriptInterpreter (const char *src)
183{
Greg Claytona66ba462010-10-30 04:51:46 +0000184 return WriteToScriptInterpreter (src, strlen(src));
Chris Lattner24943d22010-06-08 16:52:24 +0000185}
186
187ssize_t
188SBCommandInterpreter::WriteToScriptInterpreter (const char *src, size_t src_len)
189{
Greg Claytone005f2c2010-11-06 01:53:30 +0000190 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000191
192 ssize_t bytes_written = 0;
Greg Clayton63094e02010-06-23 01:19:29 +0000193 if (m_opaque_ptr && src && src[0])
Chris Lattner24943d22010-06-08 16:52:24 +0000194 {
Greg Clayton63094e02010-06-23 01:19:29 +0000195 ScriptInterpreter *script_interpreter = m_opaque_ptr->GetScriptInterpreter();
Chris Lattner24943d22010-06-08 16:52:24 +0000196 if (script_interpreter)
Greg Claytona66ba462010-10-30 04:51:46 +0000197 bytes_written = ::write (script_interpreter->GetMasterFileDescriptor(), src, src_len);
Chris Lattner24943d22010-06-08 16:52:24 +0000198 }
Greg Claytona66ba462010-10-30 04:51:46 +0000199 if (log)
200 log->Printf ("SBCommandInterpreter(%p)::WriteToScriptInterpreter (src=\"%s\", src_len=%zu) => %zi",
201 m_opaque_ptr, src, src_len, bytes_written);
202
203 return bytes_written;
Chris Lattner24943d22010-06-08 16:52:24 +0000204}
205
206
207CommandInterpreter *
Greg Clayton63094e02010-06-23 01:19:29 +0000208SBCommandInterpreter::get ()
Chris Lattner24943d22010-06-08 16:52:24 +0000209{
Greg Clayton63094e02010-06-23 01:19:29 +0000210 return m_opaque_ptr;
Chris Lattner24943d22010-06-08 16:52:24 +0000211}
212
213CommandInterpreter &
Greg Clayton63094e02010-06-23 01:19:29 +0000214SBCommandInterpreter::ref ()
Chris Lattner24943d22010-06-08 16:52:24 +0000215{
Greg Clayton63094e02010-06-23 01:19:29 +0000216 assert (m_opaque_ptr);
217 return *m_opaque_ptr;
218}
219
220void
221SBCommandInterpreter::reset (lldb_private::CommandInterpreter *interpreter)
222{
223 m_opaque_ptr = interpreter;
Chris Lattner24943d22010-06-08 16:52:24 +0000224}
225
226void
227SBCommandInterpreter::SourceInitFileInHomeDirectory (SBCommandReturnObject &result)
228{
229 result.Clear();
Greg Clayton63094e02010-06-23 01:19:29 +0000230 if (m_opaque_ptr)
231 {
232 m_opaque_ptr->SourceInitFile (false, result.ref());
233 }
234 else
235 {
236 result->AppendError ("SBCommandInterpreter is not valid");
237 result->SetStatus (eReturnStatusFailed);
238 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000239 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000240
241 if (log)
242 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInHomeDirectory (&SBCommandReturnObject(%p))",
243 m_opaque_ptr, result.get());
244
Chris Lattner24943d22010-06-08 16:52:24 +0000245}
246
247void
248SBCommandInterpreter::SourceInitFileInCurrentWorkingDirectory (SBCommandReturnObject &result)
249{
250 result.Clear();
Greg Clayton63094e02010-06-23 01:19:29 +0000251 if (m_opaque_ptr)
252 {
253 m_opaque_ptr->SourceInitFile (true, result.ref());
254 }
255 else
256 {
257 result->AppendError ("SBCommandInterpreter is not valid");
258 result->SetStatus (eReturnStatusFailed);
259 }
Greg Claytone005f2c2010-11-06 01:53:30 +0000260 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Greg Claytona66ba462010-10-30 04:51:46 +0000261
262 if (log)
263 log->Printf ("SBCommandInterpreter(%p)::SourceInitFileInCurrentWorkingDirectory (&SBCommandReturnObject(%p))",
264 m_opaque_ptr, result.get());
Chris Lattner24943d22010-06-08 16:52:24 +0000265}
266
267SBBroadcaster
268SBCommandInterpreter::GetBroadcaster ()
269{
Greg Claytone005f2c2010-11-06 01:53:30 +0000270 LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
Caroline Tice7826c882010-10-26 03:11:13 +0000271
Greg Clayton63094e02010-06-23 01:19:29 +0000272 SBBroadcaster broadcaster (m_opaque_ptr, false);
Caroline Tice7826c882010-10-26 03:11:13 +0000273
274 if (log)
Greg Claytona66ba462010-10-30 04:51:46 +0000275 log->Printf ("SBCommandInterpreter(%p)::GetBroadcaster() => SBBroadcaster(%p)",
Caroline Tice61ba7ec2010-10-26 23:49:36 +0000276 m_opaque_ptr, broadcaster.get());
Caroline Tice7826c882010-10-26 03:11:13 +0000277
Chris Lattner24943d22010-06-08 16:52:24 +0000278 return broadcaster;
279}
280