130fdc8d8SChris Lattner //===-- Debugger.cpp --------------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/lldb-private.h"
1130fdc8d8SChris Lattner #include "lldb/Core/ConnectionFileDescriptor.h"
1230fdc8d8SChris Lattner #include "lldb/Core/Debugger.h"
1330fdc8d8SChris Lattner #include "lldb/Core/InputReader.h"
1430fdc8d8SChris Lattner #include "lldb/Core/State.h"
1530fdc8d8SChris Lattner #include "lldb/Core/Timer.h"
166611103cSGreg Clayton #include "lldb/Interpreter/CommandInterpreter.h"
1730fdc8d8SChris Lattner #include "lldb/Target/TargetList.h"
1830fdc8d8SChris Lattner #include "lldb/Target/Process.h"
1930fdc8d8SChris Lattner #include "lldb/Target/Thread.h"
2030fdc8d8SChris Lattner 
2130fdc8d8SChris Lattner 
2230fdc8d8SChris Lattner using namespace lldb;
2330fdc8d8SChris Lattner using namespace lldb_private;
2430fdc8d8SChris Lattner 
256611103cSGreg Clayton static uint32_t g_shared_debugger_refcount = 0;
2630fdc8d8SChris Lattner 
27ebc1bb27SCaroline Tice static lldb::user_id_t g_unique_id = 1;
28ebc1bb27SCaroline Tice 
2930fdc8d8SChris Lattner void
3030fdc8d8SChris Lattner Debugger::Initialize ()
3130fdc8d8SChris Lattner {
326611103cSGreg Clayton     if (g_shared_debugger_refcount == 0)
3330fdc8d8SChris Lattner         lldb_private::Initialize();
346611103cSGreg Clayton     g_shared_debugger_refcount++;
3530fdc8d8SChris Lattner }
3630fdc8d8SChris Lattner 
3730fdc8d8SChris Lattner void
3830fdc8d8SChris Lattner Debugger::Terminate ()
3930fdc8d8SChris Lattner {
406611103cSGreg Clayton     if (g_shared_debugger_refcount > 0)
416611103cSGreg Clayton     {
4230fdc8d8SChris Lattner         g_shared_debugger_refcount--;
4330fdc8d8SChris Lattner         if (g_shared_debugger_refcount == 0)
4430fdc8d8SChris Lattner         {
4530fdc8d8SChris Lattner             lldb_private::WillTerminate();
466611103cSGreg Clayton             lldb_private::Terminate();
476611103cSGreg Clayton         }
4830fdc8d8SChris Lattner     }
4930fdc8d8SChris Lattner }
5030fdc8d8SChris Lattner 
516611103cSGreg Clayton typedef std::vector<DebuggerSP> DebuggerList;
526611103cSGreg Clayton 
536611103cSGreg Clayton static Mutex &
546611103cSGreg Clayton GetDebuggerListMutex ()
5530fdc8d8SChris Lattner {
566611103cSGreg Clayton     static Mutex g_mutex(Mutex::eMutexTypeRecursive);
576611103cSGreg Clayton     return g_mutex;
5830fdc8d8SChris Lattner }
5930fdc8d8SChris Lattner 
606611103cSGreg Clayton static DebuggerList &
616611103cSGreg Clayton GetDebuggerList()
626611103cSGreg Clayton {
636611103cSGreg Clayton     // hide the static debugger list inside a singleton accessor to avoid
646611103cSGreg Clayton     // global init contructors
656611103cSGreg Clayton     static DebuggerList g_list;
666611103cSGreg Clayton     return g_list;
676611103cSGreg Clayton }
686611103cSGreg Clayton 
696611103cSGreg Clayton 
706611103cSGreg Clayton DebuggerSP
716611103cSGreg Clayton Debugger::CreateInstance ()
726611103cSGreg Clayton {
736611103cSGreg Clayton     DebuggerSP debugger_sp (new Debugger);
746611103cSGreg Clayton     // Scope for locker
756611103cSGreg Clayton     {
766611103cSGreg Clayton         Mutex::Locker locker (GetDebuggerListMutex ());
776611103cSGreg Clayton         GetDebuggerList().push_back(debugger_sp);
786611103cSGreg Clayton     }
796611103cSGreg Clayton     return debugger_sp;
806611103cSGreg Clayton }
816611103cSGreg Clayton 
826611103cSGreg Clayton lldb::DebuggerSP
836611103cSGreg Clayton Debugger::GetSP ()
846611103cSGreg Clayton {
856611103cSGreg Clayton     lldb::DebuggerSP debugger_sp;
866611103cSGreg Clayton 
876611103cSGreg Clayton     Mutex::Locker locker (GetDebuggerListMutex ());
886611103cSGreg Clayton     DebuggerList &debugger_list = GetDebuggerList();
896611103cSGreg Clayton     DebuggerList::iterator pos, end = debugger_list.end();
906611103cSGreg Clayton     for (pos = debugger_list.begin(); pos != end; ++pos)
916611103cSGreg Clayton     {
926611103cSGreg Clayton         if ((*pos).get() == this)
936611103cSGreg Clayton         {
946611103cSGreg Clayton             debugger_sp = *pos;
956611103cSGreg Clayton             break;
966611103cSGreg Clayton         }
976611103cSGreg Clayton     }
986611103cSGreg Clayton     return debugger_sp;
996611103cSGreg Clayton }
1006611103cSGreg Clayton 
1013df9a8dfSCaroline Tice lldb::DebuggerSP
1023df9a8dfSCaroline Tice Debugger::FindDebuggerWithInstanceName (const ConstString &instance_name)
1033df9a8dfSCaroline Tice {
1043df9a8dfSCaroline Tice     lldb::DebuggerSP debugger_sp;
1053df9a8dfSCaroline Tice 
1063df9a8dfSCaroline Tice     Mutex::Locker locker (GetDebuggerListMutex ());
1073df9a8dfSCaroline Tice     DebuggerList &debugger_list = GetDebuggerList();
1083df9a8dfSCaroline Tice     DebuggerList::iterator pos, end = debugger_list.end();
1093df9a8dfSCaroline Tice 
1103df9a8dfSCaroline Tice     for (pos = debugger_list.begin(); pos != end; ++pos)
1113df9a8dfSCaroline Tice     {
1123df9a8dfSCaroline Tice         if ((*pos).get()->m_instance_name == instance_name)
1133df9a8dfSCaroline Tice         {
1143df9a8dfSCaroline Tice             debugger_sp = *pos;
1153df9a8dfSCaroline Tice             break;
1163df9a8dfSCaroline Tice         }
1173df9a8dfSCaroline Tice     }
1183df9a8dfSCaroline Tice     return debugger_sp;
1193df9a8dfSCaroline Tice }
1206611103cSGreg Clayton 
1216611103cSGreg Clayton TargetSP
1226611103cSGreg Clayton Debugger::FindTargetWithProcessID (lldb::pid_t pid)
1236611103cSGreg Clayton {
1246611103cSGreg Clayton     lldb::TargetSP target_sp;
1256611103cSGreg Clayton     Mutex::Locker locker (GetDebuggerListMutex ());
1266611103cSGreg Clayton     DebuggerList &debugger_list = GetDebuggerList();
1276611103cSGreg Clayton     DebuggerList::iterator pos, end = debugger_list.end();
1286611103cSGreg Clayton     for (pos = debugger_list.begin(); pos != end; ++pos)
1296611103cSGreg Clayton     {
1306611103cSGreg Clayton         target_sp = (*pos)->GetTargetList().FindTargetWithProcessID (pid);
1316611103cSGreg Clayton         if (target_sp)
1326611103cSGreg Clayton             break;
1336611103cSGreg Clayton     }
1346611103cSGreg Clayton     return target_sp;
1356611103cSGreg Clayton }
1366611103cSGreg Clayton 
1376611103cSGreg Clayton 
13830fdc8d8SChris Lattner Debugger::Debugger () :
139ebc1bb27SCaroline Tice     UserID (g_unique_id++),
1403df9a8dfSCaroline Tice     DebuggerInstanceSettings (*(Debugger::GetSettingsController().get())),
14130fdc8d8SChris Lattner     m_input_comm("debugger.input"),
14230fdc8d8SChris Lattner     m_input_file (),
14330fdc8d8SChris Lattner     m_output_file (),
14430fdc8d8SChris Lattner     m_error_file (),
14530fdc8d8SChris Lattner     m_target_list (),
14630fdc8d8SChris Lattner     m_listener ("lldb.Debugger"),
14730fdc8d8SChris Lattner     m_source_manager (),
1486611103cSGreg Clayton     m_command_interpreter_ap (new CommandInterpreter (*this, eScriptLanguageDefault, false)),
1496611103cSGreg Clayton     m_exe_ctx (),
15030fdc8d8SChris Lattner     m_input_readers (),
151e40e4218SJim Ingham     m_input_reader_data (),
152e40e4218SJim Ingham     m_use_external_editor(false)
15330fdc8d8SChris Lattner {
1546611103cSGreg Clayton     m_command_interpreter_ap->Initialize ();
15530fdc8d8SChris Lattner }
15630fdc8d8SChris Lattner 
15730fdc8d8SChris Lattner Debugger::~Debugger ()
15830fdc8d8SChris Lattner {
1596611103cSGreg Clayton     int num_targets = m_target_list.GetNumTargets();
1606611103cSGreg Clayton     for (int i = 0; i < num_targets; i++)
1616611103cSGreg Clayton     {
1626611103cSGreg Clayton         ProcessSP process_sp (m_target_list.GetTargetAtIndex (i)->GetProcessSP());
1636611103cSGreg Clayton         if (process_sp)
1646611103cSGreg Clayton             process_sp->Destroy();
1656611103cSGreg Clayton     }
1666611103cSGreg Clayton     DisconnectInput();
16730fdc8d8SChris Lattner }
16830fdc8d8SChris Lattner 
16930fdc8d8SChris Lattner 
17030fdc8d8SChris Lattner bool
17130fdc8d8SChris Lattner Debugger::GetAsyncExecution ()
17230fdc8d8SChris Lattner {
1736611103cSGreg Clayton     return !m_command_interpreter_ap->GetSynchronous();
17430fdc8d8SChris Lattner }
17530fdc8d8SChris Lattner 
17630fdc8d8SChris Lattner void
17730fdc8d8SChris Lattner Debugger::SetAsyncExecution (bool async_execution)
17830fdc8d8SChris Lattner {
1796611103cSGreg Clayton     m_command_interpreter_ap->SetSynchronous (!async_execution);
18030fdc8d8SChris Lattner }
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner void
18330fdc8d8SChris Lattner Debugger::DisconnectInput()
18430fdc8d8SChris Lattner {
18530fdc8d8SChris Lattner     m_input_comm.Clear ();
18630fdc8d8SChris Lattner }
18730fdc8d8SChris Lattner 
18830fdc8d8SChris Lattner void
18930fdc8d8SChris Lattner Debugger::SetInputFileHandle (FILE *fh, bool tranfer_ownership)
19030fdc8d8SChris Lattner {
19130fdc8d8SChris Lattner     m_input_file.SetFileHandle (fh, tranfer_ownership);
19230fdc8d8SChris Lattner     if (m_input_file.GetFileHandle() == NULL)
19330fdc8d8SChris Lattner         m_input_file.SetFileHandle (stdin, false);
19430fdc8d8SChris Lattner 
19530fdc8d8SChris Lattner     // Disconnect from any old connection if we had one
19630fdc8d8SChris Lattner     m_input_comm.Disconnect ();
19730fdc8d8SChris Lattner     m_input_comm.SetConnection (new ConnectionFileDescriptor (::fileno (GetInputFileHandle()), true));
19830fdc8d8SChris Lattner     m_input_comm.SetReadThreadBytesReceivedCallback (Debugger::DispatchInputCallback, this);
19930fdc8d8SChris Lattner 
20030fdc8d8SChris Lattner     Error error;
20130fdc8d8SChris Lattner     if (m_input_comm.StartReadThread (&error) == false)
20230fdc8d8SChris Lattner     {
20330fdc8d8SChris Lattner         FILE *err_fh = GetErrorFileHandle();
20430fdc8d8SChris Lattner         if (err_fh)
20530fdc8d8SChris Lattner         {
20630fdc8d8SChris Lattner             ::fprintf (err_fh, "error: failed to main input read thread: %s", error.AsCString() ? error.AsCString() : "unkown error");
20730fdc8d8SChris Lattner             exit(1);
20830fdc8d8SChris Lattner         }
20930fdc8d8SChris Lattner     }
21030fdc8d8SChris Lattner 
21130fdc8d8SChris Lattner }
21230fdc8d8SChris Lattner 
21330fdc8d8SChris Lattner FILE *
21430fdc8d8SChris Lattner Debugger::GetInputFileHandle ()
21530fdc8d8SChris Lattner {
21630fdc8d8SChris Lattner     return m_input_file.GetFileHandle();
21730fdc8d8SChris Lattner }
21830fdc8d8SChris Lattner 
21930fdc8d8SChris Lattner 
22030fdc8d8SChris Lattner void
22130fdc8d8SChris Lattner Debugger::SetOutputFileHandle (FILE *fh, bool tranfer_ownership)
22230fdc8d8SChris Lattner {
22330fdc8d8SChris Lattner     m_output_file.SetFileHandle (fh, tranfer_ownership);
22430fdc8d8SChris Lattner     if (m_output_file.GetFileHandle() == NULL)
22530fdc8d8SChris Lattner         m_output_file.SetFileHandle (stdin, false);
22630fdc8d8SChris Lattner }
22730fdc8d8SChris Lattner 
22830fdc8d8SChris Lattner FILE *
22930fdc8d8SChris Lattner Debugger::GetOutputFileHandle ()
23030fdc8d8SChris Lattner {
23130fdc8d8SChris Lattner     return m_output_file.GetFileHandle();
23230fdc8d8SChris Lattner }
23330fdc8d8SChris Lattner 
23430fdc8d8SChris Lattner void
23530fdc8d8SChris Lattner Debugger::SetErrorFileHandle (FILE *fh, bool tranfer_ownership)
23630fdc8d8SChris Lattner {
23730fdc8d8SChris Lattner     m_error_file.SetFileHandle (fh, tranfer_ownership);
23830fdc8d8SChris Lattner     if (m_error_file.GetFileHandle() == NULL)
23930fdc8d8SChris Lattner         m_error_file.SetFileHandle (stdin, false);
24030fdc8d8SChris Lattner }
24130fdc8d8SChris Lattner 
24230fdc8d8SChris Lattner 
24330fdc8d8SChris Lattner FILE *
24430fdc8d8SChris Lattner Debugger::GetErrorFileHandle ()
24530fdc8d8SChris Lattner {
24630fdc8d8SChris Lattner     return m_error_file.GetFileHandle();
24730fdc8d8SChris Lattner }
24830fdc8d8SChris Lattner 
24930fdc8d8SChris Lattner CommandInterpreter &
25030fdc8d8SChris Lattner Debugger::GetCommandInterpreter ()
25130fdc8d8SChris Lattner {
2526611103cSGreg Clayton     assert (m_command_interpreter_ap.get());
2536611103cSGreg Clayton     return *m_command_interpreter_ap;
25430fdc8d8SChris Lattner }
25530fdc8d8SChris Lattner 
25630fdc8d8SChris Lattner Listener &
25730fdc8d8SChris Lattner Debugger::GetListener ()
25830fdc8d8SChris Lattner {
25930fdc8d8SChris Lattner     return m_listener;
26030fdc8d8SChris Lattner }
26130fdc8d8SChris Lattner 
26230fdc8d8SChris Lattner 
26330fdc8d8SChris Lattner TargetSP
2642976d00aSJim Ingham Debugger::GetSelectedTarget ()
26530fdc8d8SChris Lattner {
2662976d00aSJim Ingham     return m_target_list.GetSelectedTarget ();
26730fdc8d8SChris Lattner }
26830fdc8d8SChris Lattner 
26930fdc8d8SChris Lattner ExecutionContext
2702976d00aSJim Ingham Debugger::GetSelectedExecutionContext ()
27130fdc8d8SChris Lattner {
27230fdc8d8SChris Lattner     ExecutionContext exe_ctx;
27330fdc8d8SChris Lattner     exe_ctx.Clear();
27430fdc8d8SChris Lattner 
2752976d00aSJim Ingham     lldb::TargetSP target_sp = GetSelectedTarget();
27630fdc8d8SChris Lattner     exe_ctx.target = target_sp.get();
27730fdc8d8SChris Lattner 
27830fdc8d8SChris Lattner     if (target_sp)
27930fdc8d8SChris Lattner     {
28030fdc8d8SChris Lattner         exe_ctx.process = target_sp->GetProcessSP().get();
28130fdc8d8SChris Lattner         if (exe_ctx.process && exe_ctx.process->IsRunning() == false)
28230fdc8d8SChris Lattner         {
2832976d00aSJim Ingham             exe_ctx.thread = exe_ctx.process->GetThreadList().GetSelectedThread().get();
28430fdc8d8SChris Lattner             if (exe_ctx.thread == NULL)
28530fdc8d8SChris Lattner                 exe_ctx.thread = exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get();
28630fdc8d8SChris Lattner             if (exe_ctx.thread)
28730fdc8d8SChris Lattner             {
2882976d00aSJim Ingham                 exe_ctx.frame = exe_ctx.thread->GetSelectedFrame().get();
28930fdc8d8SChris Lattner                 if (exe_ctx.frame == NULL)
29030fdc8d8SChris Lattner                     exe_ctx.frame = exe_ctx.thread->GetStackFrameAtIndex (0).get();
29130fdc8d8SChris Lattner             }
29230fdc8d8SChris Lattner         }
29330fdc8d8SChris Lattner     }
29430fdc8d8SChris Lattner     return exe_ctx;
29530fdc8d8SChris Lattner 
29630fdc8d8SChris Lattner }
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner SourceManager &
29930fdc8d8SChris Lattner Debugger::GetSourceManager ()
30030fdc8d8SChris Lattner {
30130fdc8d8SChris Lattner     return m_source_manager;
30230fdc8d8SChris Lattner }
30330fdc8d8SChris Lattner 
30430fdc8d8SChris Lattner 
30530fdc8d8SChris Lattner TargetList&
30630fdc8d8SChris Lattner Debugger::GetTargetList ()
30730fdc8d8SChris Lattner {
30830fdc8d8SChris Lattner     return m_target_list;
30930fdc8d8SChris Lattner }
31030fdc8d8SChris Lattner 
31130fdc8d8SChris Lattner void
31230fdc8d8SChris Lattner Debugger::DispatchInputCallback (void *baton, const void *bytes, size_t bytes_len)
31330fdc8d8SChris Lattner {
31430fdc8d8SChris Lattner     ((Debugger *)baton)->DispatchInput ((char *)bytes, bytes_len);
31530fdc8d8SChris Lattner }
31630fdc8d8SChris Lattner 
31730fdc8d8SChris Lattner 
31830fdc8d8SChris Lattner void
31930fdc8d8SChris Lattner Debugger::DispatchInput (const char *bytes, size_t bytes_len)
32030fdc8d8SChris Lattner {
32130fdc8d8SChris Lattner     if (bytes == NULL || bytes_len == 0)
32230fdc8d8SChris Lattner         return;
32330fdc8d8SChris Lattner 
32430fdc8d8SChris Lattner     // TODO: implement the STDIO to the process as an input reader...
3252976d00aSJim Ingham     TargetSP target = GetSelectedTarget();
32630fdc8d8SChris Lattner     if (target.get() != NULL)
32730fdc8d8SChris Lattner     {
32830fdc8d8SChris Lattner         ProcessSP process_sp = target->GetProcessSP();
32930fdc8d8SChris Lattner         if (process_sp.get() != NULL
33030fdc8d8SChris Lattner             && StateIsRunningState (process_sp->GetState()))
33130fdc8d8SChris Lattner         {
33230fdc8d8SChris Lattner             Error error;
33330fdc8d8SChris Lattner             if (process_sp->PutSTDIN (bytes, bytes_len, error) == bytes_len)
33430fdc8d8SChris Lattner                 return;
33530fdc8d8SChris Lattner         }
33630fdc8d8SChris Lattner     }
33730fdc8d8SChris Lattner 
33830fdc8d8SChris Lattner     WriteToDefaultReader (bytes, bytes_len);
33930fdc8d8SChris Lattner }
34030fdc8d8SChris Lattner 
34130fdc8d8SChris Lattner void
34230fdc8d8SChris Lattner Debugger::WriteToDefaultReader (const char *bytes, size_t bytes_len)
34330fdc8d8SChris Lattner {
34430fdc8d8SChris Lattner     if (bytes && bytes_len)
34530fdc8d8SChris Lattner         m_input_reader_data.append (bytes, bytes_len);
34630fdc8d8SChris Lattner 
34730fdc8d8SChris Lattner     if (m_input_reader_data.empty())
34830fdc8d8SChris Lattner         return;
34930fdc8d8SChris Lattner 
35030fdc8d8SChris Lattner     while (!m_input_readers.empty() && !m_input_reader_data.empty())
35130fdc8d8SChris Lattner     {
35230fdc8d8SChris Lattner         while (CheckIfTopInputReaderIsDone ())
35330fdc8d8SChris Lattner             /* Do nothing. */;
35430fdc8d8SChris Lattner 
35530fdc8d8SChris Lattner         // Get the input reader from the top of the stack
35630fdc8d8SChris Lattner         InputReaderSP reader_sp(m_input_readers.top());
35730fdc8d8SChris Lattner 
35830fdc8d8SChris Lattner         if (!reader_sp)
35930fdc8d8SChris Lattner             break;
36030fdc8d8SChris Lattner 
361471b31ceSGreg Clayton         size_t bytes_handled = reader_sp->HandleRawBytes (m_input_reader_data.c_str(),
36230fdc8d8SChris Lattner                                                           m_input_reader_data.size());
36330fdc8d8SChris Lattner         if (bytes_handled)
36430fdc8d8SChris Lattner         {
36530fdc8d8SChris Lattner             m_input_reader_data.erase (0, bytes_handled);
36630fdc8d8SChris Lattner         }
36730fdc8d8SChris Lattner         else
36830fdc8d8SChris Lattner         {
36930fdc8d8SChris Lattner             // No bytes were handled, we might not have reached our
37030fdc8d8SChris Lattner             // granularity, just return and wait for more data
37130fdc8d8SChris Lattner             break;
37230fdc8d8SChris Lattner         }
37330fdc8d8SChris Lattner     }
37430fdc8d8SChris Lattner 
37530fdc8d8SChris Lattner     // Flush out any input readers that are donesvn
37630fdc8d8SChris Lattner     while (CheckIfTopInputReaderIsDone ())
37730fdc8d8SChris Lattner         /* Do nothing. */;
37830fdc8d8SChris Lattner 
37930fdc8d8SChris Lattner }
38030fdc8d8SChris Lattner 
38130fdc8d8SChris Lattner void
38230fdc8d8SChris Lattner Debugger::PushInputReader (const InputReaderSP& reader_sp)
38330fdc8d8SChris Lattner {
38430fdc8d8SChris Lattner     if (!reader_sp)
38530fdc8d8SChris Lattner         return;
38630fdc8d8SChris Lattner     if (!m_input_readers.empty())
38730fdc8d8SChris Lattner     {
38830fdc8d8SChris Lattner         // Deactivate the old top reader
38930fdc8d8SChris Lattner         InputReaderSP top_reader_sp (m_input_readers.top());
39030fdc8d8SChris Lattner         if (top_reader_sp)
39130fdc8d8SChris Lattner             top_reader_sp->Notify (eInputReaderDeactivate);
39230fdc8d8SChris Lattner     }
39330fdc8d8SChris Lattner     m_input_readers.push (reader_sp);
39430fdc8d8SChris Lattner     reader_sp->Notify (eInputReaderActivate);
39530fdc8d8SChris Lattner     ActivateInputReader (reader_sp);
39630fdc8d8SChris Lattner }
39730fdc8d8SChris Lattner 
39830fdc8d8SChris Lattner bool
39930fdc8d8SChris Lattner Debugger::PopInputReader (const lldb::InputReaderSP& pop_reader_sp)
40030fdc8d8SChris Lattner {
40130fdc8d8SChris Lattner     bool result = false;
40230fdc8d8SChris Lattner 
40330fdc8d8SChris Lattner     // The reader on the stop of the stack is done, so let the next
40430fdc8d8SChris Lattner     // read on the stack referesh its prompt and if there is one...
40530fdc8d8SChris Lattner     if (!m_input_readers.empty())
40630fdc8d8SChris Lattner     {
40730fdc8d8SChris Lattner         InputReaderSP reader_sp(m_input_readers.top());
40830fdc8d8SChris Lattner 
40930fdc8d8SChris Lattner         if (!pop_reader_sp || pop_reader_sp.get() == reader_sp.get())
41030fdc8d8SChris Lattner         {
41130fdc8d8SChris Lattner             m_input_readers.pop ();
41230fdc8d8SChris Lattner             reader_sp->Notify (eInputReaderDeactivate);
41330fdc8d8SChris Lattner             reader_sp->Notify (eInputReaderDone);
41430fdc8d8SChris Lattner             result = true;
41530fdc8d8SChris Lattner 
41630fdc8d8SChris Lattner             if (!m_input_readers.empty())
41730fdc8d8SChris Lattner             {
41830fdc8d8SChris Lattner                 reader_sp = m_input_readers.top();
41930fdc8d8SChris Lattner                 if (reader_sp)
42030fdc8d8SChris Lattner                 {
42130fdc8d8SChris Lattner                     ActivateInputReader (reader_sp);
42230fdc8d8SChris Lattner                     reader_sp->Notify (eInputReaderReactivate);
42330fdc8d8SChris Lattner                 }
42430fdc8d8SChris Lattner             }
42530fdc8d8SChris Lattner         }
42630fdc8d8SChris Lattner     }
42730fdc8d8SChris Lattner     return result;
42830fdc8d8SChris Lattner }
42930fdc8d8SChris Lattner 
43030fdc8d8SChris Lattner bool
43130fdc8d8SChris Lattner Debugger::CheckIfTopInputReaderIsDone ()
43230fdc8d8SChris Lattner {
43330fdc8d8SChris Lattner     bool result = false;
43430fdc8d8SChris Lattner     if (!m_input_readers.empty())
43530fdc8d8SChris Lattner     {
43630fdc8d8SChris Lattner         InputReaderSP reader_sp(m_input_readers.top());
43730fdc8d8SChris Lattner 
43830fdc8d8SChris Lattner         if (reader_sp && reader_sp->IsDone())
43930fdc8d8SChris Lattner         {
44030fdc8d8SChris Lattner             result = true;
44130fdc8d8SChris Lattner             PopInputReader (reader_sp);
44230fdc8d8SChris Lattner         }
44330fdc8d8SChris Lattner     }
44430fdc8d8SChris Lattner     return result;
44530fdc8d8SChris Lattner }
44630fdc8d8SChris Lattner 
44730fdc8d8SChris Lattner void
44830fdc8d8SChris Lattner Debugger::ActivateInputReader (const InputReaderSP &reader_sp)
44930fdc8d8SChris Lattner {
45030fdc8d8SChris Lattner     FILE *in_fh = GetInputFileHandle();
45130fdc8d8SChris Lattner 
45230fdc8d8SChris Lattner     if (in_fh)
45330fdc8d8SChris Lattner     {
45430fdc8d8SChris Lattner         struct termios in_fh_termios;
45530fdc8d8SChris Lattner         int in_fd = fileno (in_fh);
45630fdc8d8SChris Lattner         if (::tcgetattr(in_fd, &in_fh_termios) == 0)
45730fdc8d8SChris Lattner         {
45830fdc8d8SChris Lattner             if (reader_sp->GetEcho())
45930fdc8d8SChris Lattner                 in_fh_termios.c_lflag |= ECHO;  // Turn on echoing
46030fdc8d8SChris Lattner             else
46130fdc8d8SChris Lattner                 in_fh_termios.c_lflag &= ~ECHO; // Turn off echoing
46230fdc8d8SChris Lattner 
46330fdc8d8SChris Lattner             switch (reader_sp->GetGranularity())
46430fdc8d8SChris Lattner             {
46530fdc8d8SChris Lattner             case eInputReaderGranularityByte:
46630fdc8d8SChris Lattner             case eInputReaderGranularityWord:
46730fdc8d8SChris Lattner                 in_fh_termios.c_lflag &= ~ICANON;   // Get one char at a time
46830fdc8d8SChris Lattner                 break;
46930fdc8d8SChris Lattner 
47030fdc8d8SChris Lattner             case eInputReaderGranularityLine:
47130fdc8d8SChris Lattner             case eInputReaderGranularityAll:
47230fdc8d8SChris Lattner                 in_fh_termios.c_lflag |= ICANON;   // Get lines at a time
47330fdc8d8SChris Lattner                 break;
47430fdc8d8SChris Lattner 
47530fdc8d8SChris Lattner             default:
47630fdc8d8SChris Lattner                 break;
47730fdc8d8SChris Lattner             }
47830fdc8d8SChris Lattner             ::tcsetattr (in_fd, TCSANOW, &in_fh_termios);
47930fdc8d8SChris Lattner         }
48030fdc8d8SChris Lattner     }
48130fdc8d8SChris Lattner }
4826611103cSGreg Clayton 
4836611103cSGreg Clayton void
4846611103cSGreg Clayton Debugger::UpdateExecutionContext (ExecutionContext *override_context)
4856611103cSGreg Clayton {
4866611103cSGreg Clayton     m_exe_ctx.Clear();
4876611103cSGreg Clayton 
4886611103cSGreg Clayton     if (override_context != NULL)
4896611103cSGreg Clayton     {
4906611103cSGreg Clayton         m_exe_ctx.target = override_context->target;
4916611103cSGreg Clayton         m_exe_ctx.process = override_context->process;
4926611103cSGreg Clayton         m_exe_ctx.thread = override_context->thread;
4936611103cSGreg Clayton         m_exe_ctx.frame = override_context->frame;
4946611103cSGreg Clayton     }
4956611103cSGreg Clayton     else
4966611103cSGreg Clayton     {
4972976d00aSJim Ingham         TargetSP target_sp (GetSelectedTarget());
4986611103cSGreg Clayton         if (target_sp)
4996611103cSGreg Clayton         {
5006611103cSGreg Clayton             m_exe_ctx.target = target_sp.get();
5016611103cSGreg Clayton             m_exe_ctx.process = target_sp->GetProcessSP().get();
502725945d5SJohnny Chen             if (m_exe_ctx.process && m_exe_ctx.process->IsAlive() && !m_exe_ctx.process->IsRunning())
5036611103cSGreg Clayton             {
5042976d00aSJim Ingham                 m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetSelectedThread().get();
5056611103cSGreg Clayton                 if (m_exe_ctx.thread == NULL)
5066611103cSGreg Clayton                     m_exe_ctx.thread = m_exe_ctx.process->GetThreadList().GetThreadAtIndex(0).get();
5076611103cSGreg Clayton                 if (m_exe_ctx.thread)
5086611103cSGreg Clayton                 {
5092976d00aSJim Ingham                     m_exe_ctx.frame = m_exe_ctx.thread->GetSelectedFrame().get();
5106611103cSGreg Clayton                     if (m_exe_ctx.frame == NULL)
5116611103cSGreg Clayton                         m_exe_ctx.frame = m_exe_ctx.thread->GetStackFrameAtIndex (0).get();
5126611103cSGreg Clayton                 }
5136611103cSGreg Clayton             }
5146611103cSGreg Clayton         }
5156611103cSGreg Clayton     }
5166611103cSGreg Clayton }
5176611103cSGreg Clayton 
518ebc1bb27SCaroline Tice DebuggerSP
519ebc1bb27SCaroline Tice Debugger::FindDebuggerWithID (lldb::user_id_t id)
520ebc1bb27SCaroline Tice {
521ebc1bb27SCaroline Tice     lldb::DebuggerSP debugger_sp;
522ebc1bb27SCaroline Tice 
523ebc1bb27SCaroline Tice     Mutex::Locker locker (GetDebuggerListMutex ());
524ebc1bb27SCaroline Tice     DebuggerList &debugger_list = GetDebuggerList();
525ebc1bb27SCaroline Tice     DebuggerList::iterator pos, end = debugger_list.end();
526ebc1bb27SCaroline Tice     for (pos = debugger_list.begin(); pos != end; ++pos)
527ebc1bb27SCaroline Tice     {
528ebc1bb27SCaroline Tice         if ((*pos).get()->GetID() == id)
529ebc1bb27SCaroline Tice         {
530ebc1bb27SCaroline Tice             debugger_sp = *pos;
531ebc1bb27SCaroline Tice             break;
532ebc1bb27SCaroline Tice         }
533ebc1bb27SCaroline Tice     }
534ebc1bb27SCaroline Tice     return debugger_sp;
535ebc1bb27SCaroline Tice }
5363df9a8dfSCaroline Tice 
5373df9a8dfSCaroline Tice lldb::UserSettingsControllerSP &
5383df9a8dfSCaroline Tice Debugger::GetSettingsController (bool finish)
5393df9a8dfSCaroline Tice {
5403df9a8dfSCaroline Tice     static lldb::UserSettingsControllerSP g_settings_controller (new DebuggerSettingsController);
5413df9a8dfSCaroline Tice     static bool initialized = false;
5423df9a8dfSCaroline Tice 
5433df9a8dfSCaroline Tice     if (!initialized)
5443df9a8dfSCaroline Tice     {
54595852755SJim Ingham         initialized = UserSettingsController::InitializeSettingsController (g_settings_controller,
54695852755SJim Ingham                                                              Debugger::DebuggerSettingsController::global_settings_table,
54795852755SJim Ingham                                                              Debugger::DebuggerSettingsController::instance_settings_table);
5483df9a8dfSCaroline Tice     }
5493df9a8dfSCaroline Tice 
5503df9a8dfSCaroline Tice     if (finish)
5513df9a8dfSCaroline Tice     {
5523df9a8dfSCaroline Tice         UserSettingsControllerSP parent = g_settings_controller->GetParent();
5533df9a8dfSCaroline Tice         if (parent)
5543df9a8dfSCaroline Tice             parent->RemoveChild (g_settings_controller);
5553df9a8dfSCaroline Tice         g_settings_controller.reset();
5563df9a8dfSCaroline Tice     }
5573df9a8dfSCaroline Tice     return g_settings_controller;
5583df9a8dfSCaroline Tice }
5593df9a8dfSCaroline Tice 
5603df9a8dfSCaroline Tice //--------------------------------------------------
5613df9a8dfSCaroline Tice // class Debugger::DebuggerSettingsController
5623df9a8dfSCaroline Tice //--------------------------------------------------
5633df9a8dfSCaroline Tice 
5643df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::DebuggerSettingsController () :
5653df9a8dfSCaroline Tice     UserSettingsController ("", lldb::UserSettingsControllerSP()),
5663df9a8dfSCaroline Tice     m_term_width (80)
5673df9a8dfSCaroline Tice {
568*91123da2SCaroline Tice     m_default_settings.reset (new DebuggerInstanceSettings (*this, false,
569*91123da2SCaroline Tice                                                             InstanceSettings::GetDefaultName().AsCString()));
5703df9a8dfSCaroline Tice }
5713df9a8dfSCaroline Tice 
5723df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::~DebuggerSettingsController ()
5733df9a8dfSCaroline Tice {
5743df9a8dfSCaroline Tice }
5753df9a8dfSCaroline Tice 
5763df9a8dfSCaroline Tice 
5773df9a8dfSCaroline Tice lldb::InstanceSettingsSP
578*91123da2SCaroline Tice Debugger::DebuggerSettingsController::CreateNewInstanceSettings (const char *instance_name)
5793df9a8dfSCaroline Tice {
580*91123da2SCaroline Tice     DebuggerInstanceSettings *new_settings = new DebuggerInstanceSettings (*(Debugger::GetSettingsController().get()),
581*91123da2SCaroline Tice                                                                            false, instance_name);
5823df9a8dfSCaroline Tice     lldb::InstanceSettingsSP new_settings_sp (new_settings);
5833df9a8dfSCaroline Tice     return new_settings_sp;
5843df9a8dfSCaroline Tice }
5853df9a8dfSCaroline Tice 
5863df9a8dfSCaroline Tice bool
5873df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::ValidTermWidthValue (const char *value, Error err)
5883df9a8dfSCaroline Tice {
5893df9a8dfSCaroline Tice     bool valid = true;
5903df9a8dfSCaroline Tice 
5913df9a8dfSCaroline Tice     // Verify we have a value string.
5923df9a8dfSCaroline Tice     if (value == NULL
5933df9a8dfSCaroline Tice         || strlen (value) == 0)
5943df9a8dfSCaroline Tice     {
5953df9a8dfSCaroline Tice         valid = false;
5963df9a8dfSCaroline Tice         err.SetErrorString ("Missing value.  Can't set terminal width without a value.\n");
5973df9a8dfSCaroline Tice     }
5983df9a8dfSCaroline Tice 
5993df9a8dfSCaroline Tice     // Verify the string consists entirely of digits.
6003df9a8dfSCaroline Tice     if (valid)
6013df9a8dfSCaroline Tice     {
6023df9a8dfSCaroline Tice         int len = strlen (value);
6033df9a8dfSCaroline Tice         for (int i = 0; i < len; ++i)
6043df9a8dfSCaroline Tice             if (! isdigit (value[i]))
6053df9a8dfSCaroline Tice             {
6063df9a8dfSCaroline Tice                 valid = false;
6073df9a8dfSCaroline Tice                 err.SetErrorStringWithFormat ("'%s' is not a valid representation of an integer.\n", value);
6083df9a8dfSCaroline Tice             }
6093df9a8dfSCaroline Tice     }
6103df9a8dfSCaroline Tice 
6113df9a8dfSCaroline Tice     // Verify the term-width is 'reasonable' (e.g. 10 <= width <= 250).
6123df9a8dfSCaroline Tice     if (valid)
6133df9a8dfSCaroline Tice     {
6143df9a8dfSCaroline Tice         int width = atoi (value);
6153df9a8dfSCaroline Tice         if (width < 10
6163df9a8dfSCaroline Tice             || width > 250)
6173df9a8dfSCaroline Tice         {
6183df9a8dfSCaroline Tice             valid = false;
6193df9a8dfSCaroline Tice             err.SetErrorString ("Invalid term-width value; value must be between 10 and 250.\n");
6203df9a8dfSCaroline Tice         }
6213df9a8dfSCaroline Tice     }
6223df9a8dfSCaroline Tice 
6233df9a8dfSCaroline Tice     return valid;
6243df9a8dfSCaroline Tice }
6253df9a8dfSCaroline Tice 
6263df9a8dfSCaroline Tice 
6273df9a8dfSCaroline Tice //--------------------------------------------------
6283df9a8dfSCaroline Tice //  class DebuggerInstanceSettings
6293df9a8dfSCaroline Tice //--------------------------------------------------
6303df9a8dfSCaroline Tice 
631*91123da2SCaroline Tice DebuggerInstanceSettings::DebuggerInstanceSettings (UserSettingsController &owner, bool live_instance,
632*91123da2SCaroline Tice                                                     const char *name) :
633*91123da2SCaroline Tice     InstanceSettings (owner, (name == NULL ? CreateInstanceName ().AsCString() : name), live_instance),
6343df9a8dfSCaroline Tice     m_prompt (),
6353df9a8dfSCaroline Tice     m_script_lang ()
6363df9a8dfSCaroline Tice {
637*91123da2SCaroline Tice     if (name == NULL && live_instance)
6383df9a8dfSCaroline Tice     {
6393df9a8dfSCaroline Tice         const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
6403df9a8dfSCaroline Tice         CopyInstanceSettings (pending_settings, false);
6413df9a8dfSCaroline Tice         m_owner.RemovePendingSettings (m_instance_name);
6423df9a8dfSCaroline Tice     }
6433df9a8dfSCaroline Tice }
6443df9a8dfSCaroline Tice 
6453df9a8dfSCaroline Tice DebuggerInstanceSettings::DebuggerInstanceSettings (const DebuggerInstanceSettings &rhs) :
6463df9a8dfSCaroline Tice     InstanceSettings (*(Debugger::GetSettingsController().get()), CreateInstanceName ().AsCString()),
6473df9a8dfSCaroline Tice     m_prompt (rhs.m_prompt),
6483df9a8dfSCaroline Tice     m_script_lang (rhs.m_script_lang)
6493df9a8dfSCaroline Tice {
6503df9a8dfSCaroline Tice     const lldb::InstanceSettingsSP &pending_settings = m_owner.FindPendingSettings (m_instance_name);
6513df9a8dfSCaroline Tice     CopyInstanceSettings (pending_settings, false);
6523df9a8dfSCaroline Tice     m_owner.RemovePendingSettings (m_instance_name);
6533df9a8dfSCaroline Tice }
6543df9a8dfSCaroline Tice 
6553df9a8dfSCaroline Tice DebuggerInstanceSettings::~DebuggerInstanceSettings ()
6563df9a8dfSCaroline Tice {
6573df9a8dfSCaroline Tice }
6583df9a8dfSCaroline Tice 
6593df9a8dfSCaroline Tice DebuggerInstanceSettings&
6603df9a8dfSCaroline Tice DebuggerInstanceSettings::operator= (const DebuggerInstanceSettings &rhs)
6613df9a8dfSCaroline Tice {
6623df9a8dfSCaroline Tice     if (this != &rhs)
6633df9a8dfSCaroline Tice     {
6643df9a8dfSCaroline Tice         m_prompt = rhs.m_prompt;
6653df9a8dfSCaroline Tice         m_script_lang = rhs.m_script_lang;
6663df9a8dfSCaroline Tice     }
6673df9a8dfSCaroline Tice 
6683df9a8dfSCaroline Tice     return *this;
6693df9a8dfSCaroline Tice }
6703df9a8dfSCaroline Tice 
6713df9a8dfSCaroline Tice void
6723df9a8dfSCaroline Tice DebuggerInstanceSettings::UpdateInstanceSettingsVariable (const ConstString &var_name,
6733df9a8dfSCaroline Tice                                                           const char *index_value,
6743df9a8dfSCaroline Tice                                                           const char *value,
6753df9a8dfSCaroline Tice                                                           const ConstString &instance_name,
6763df9a8dfSCaroline Tice                                                           const SettingEntry &entry,
6773df9a8dfSCaroline Tice                                                           lldb::VarSetOperationType op,
6783df9a8dfSCaroline Tice                                                           Error &err,
6793df9a8dfSCaroline Tice                                                           bool pending)
6803df9a8dfSCaroline Tice {
6813df9a8dfSCaroline Tice     if (var_name == PromptVarName())
6823df9a8dfSCaroline Tice     {
6833df9a8dfSCaroline Tice       UserSettingsController::UpdateStringVariable (op, m_prompt, value, err);
6843df9a8dfSCaroline Tice         if (!pending)
6853df9a8dfSCaroline Tice         {
68649e2737eSCaroline Tice             // 'instance_name' is actually (probably) in the form '[<instance_name>]';  if so, we need to
68749e2737eSCaroline Tice             // strip off the brackets before passing it to BroadcastPromptChange.
68849e2737eSCaroline Tice 
68949e2737eSCaroline Tice             std::string tmp_instance_name (instance_name.AsCString());
69049e2737eSCaroline Tice             if ((tmp_instance_name[0] == '[')
69149e2737eSCaroline Tice                 && (tmp_instance_name[instance_name.GetLength() - 1] == ']'))
69249e2737eSCaroline Tice                 tmp_instance_name = tmp_instance_name.substr (1, instance_name.GetLength() - 2);
69349e2737eSCaroline Tice             ConstString new_name (tmp_instance_name.c_str());
69449e2737eSCaroline Tice 
69549e2737eSCaroline Tice             BroadcastPromptChange (new_name, m_prompt.c_str());
6963df9a8dfSCaroline Tice         }
6973df9a8dfSCaroline Tice     }
6983df9a8dfSCaroline Tice     else if (var_name == ScriptLangVarName())
6993df9a8dfSCaroline Tice     {
7003df9a8dfSCaroline Tice         bool success;
7013df9a8dfSCaroline Tice         m_script_lang = Args::StringToScriptLanguage (value, eScriptLanguageDefault,
7023df9a8dfSCaroline Tice                                                       &success);
7033df9a8dfSCaroline Tice     }
7043df9a8dfSCaroline Tice }
7053df9a8dfSCaroline Tice 
7063df9a8dfSCaroline Tice void
7073df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::UpdateGlobalVariable (const ConstString &var_name,
7083df9a8dfSCaroline Tice                                                             const char *index_value,
7093df9a8dfSCaroline Tice                                                             const char *value,
7103df9a8dfSCaroline Tice                                                             const SettingEntry &entry,
7113df9a8dfSCaroline Tice                                                             lldb::VarSetOperationType op,
7123df9a8dfSCaroline Tice                                                             Error &err)
7133df9a8dfSCaroline Tice {
7143df9a8dfSCaroline Tice     static ConstString term_width_name ("term-width");
7153df9a8dfSCaroline Tice 
7163df9a8dfSCaroline Tice     if (var_name == term_width_name)
7173df9a8dfSCaroline Tice     {
7183df9a8dfSCaroline Tice         if (ValidTermWidthValue (value, err))
7193df9a8dfSCaroline Tice         {
7203df9a8dfSCaroline Tice             m_term_width = atoi (value);
7213df9a8dfSCaroline Tice         }
7223df9a8dfSCaroline Tice     }
7233df9a8dfSCaroline Tice }
7243df9a8dfSCaroline Tice 
7253df9a8dfSCaroline Tice void
7263df9a8dfSCaroline Tice DebuggerInstanceSettings::GetInstanceSettingsValue (const SettingEntry &entry,
7273df9a8dfSCaroline Tice                                                     const ConstString &var_name,
7283df9a8dfSCaroline Tice                                                     StringList &value)
7293df9a8dfSCaroline Tice {
7303df9a8dfSCaroline Tice     if (var_name == PromptVarName())
7313df9a8dfSCaroline Tice     {
7323df9a8dfSCaroline Tice         value.AppendString (m_prompt.c_str());
7333df9a8dfSCaroline Tice 
7343df9a8dfSCaroline Tice     }
7353df9a8dfSCaroline Tice     else if (var_name == ScriptLangVarName())
7363df9a8dfSCaroline Tice     {
7373df9a8dfSCaroline Tice         value.AppendString (ScriptInterpreter::LanguageToString (m_script_lang).c_str());
7383df9a8dfSCaroline Tice     }
7393df9a8dfSCaroline Tice }
7403df9a8dfSCaroline Tice 
7413df9a8dfSCaroline Tice void
7423df9a8dfSCaroline Tice DebuggerInstanceSettings::CopyInstanceSettings (const lldb::InstanceSettingsSP &new_settings,
7433df9a8dfSCaroline Tice                                                 bool pending)
7443df9a8dfSCaroline Tice {
7453df9a8dfSCaroline Tice     if (new_settings.get() == NULL)
7463df9a8dfSCaroline Tice         return;
7473df9a8dfSCaroline Tice 
7483df9a8dfSCaroline Tice     DebuggerInstanceSettings *new_debugger_settings = (DebuggerInstanceSettings *) new_settings.get();
7493df9a8dfSCaroline Tice 
7503df9a8dfSCaroline Tice     m_prompt = new_debugger_settings->m_prompt;
7513df9a8dfSCaroline Tice     if (!pending)
75249e2737eSCaroline Tice     {
75349e2737eSCaroline Tice         // 'instance_name' is actually (probably) in the form '[<instance_name>]';  if so, we need to
75449e2737eSCaroline Tice         // strip off the brackets before passing it to BroadcastPromptChange.
75549e2737eSCaroline Tice 
75649e2737eSCaroline Tice         std::string tmp_instance_name (m_instance_name.AsCString());
75749e2737eSCaroline Tice         if ((tmp_instance_name[0] == '[')
75849e2737eSCaroline Tice             && (tmp_instance_name[m_instance_name.GetLength() - 1] == ']'))
75949e2737eSCaroline Tice             tmp_instance_name = tmp_instance_name.substr (1, m_instance_name.GetLength() - 2);
76049e2737eSCaroline Tice         ConstString new_name (tmp_instance_name.c_str());
76149e2737eSCaroline Tice 
76249e2737eSCaroline Tice         BroadcastPromptChange (new_name, m_prompt.c_str());
76349e2737eSCaroline Tice     }
7643df9a8dfSCaroline Tice 
7653df9a8dfSCaroline Tice     m_script_lang = new_debugger_settings->m_script_lang;
7663df9a8dfSCaroline Tice }
7673df9a8dfSCaroline Tice 
7683df9a8dfSCaroline Tice void
7693df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::GetGlobalSettingsValue (const ConstString &var_name,
7703df9a8dfSCaroline Tice                                                               StringList &value)
7713df9a8dfSCaroline Tice {
7723df9a8dfSCaroline Tice     static ConstString term_width_name ("term-width");
7733df9a8dfSCaroline Tice 
7743df9a8dfSCaroline Tice     if (var_name == term_width_name)
7753df9a8dfSCaroline Tice     {
7763df9a8dfSCaroline Tice         StreamString width_str;
7773df9a8dfSCaroline Tice         width_str.Printf ("%d", m_term_width);
7783df9a8dfSCaroline Tice         value.AppendString (width_str.GetData());
7793df9a8dfSCaroline Tice     }
7803df9a8dfSCaroline Tice }
7813df9a8dfSCaroline Tice 
7823df9a8dfSCaroline Tice bool
7833df9a8dfSCaroline Tice DebuggerInstanceSettings::BroadcastPromptChange (const ConstString &instance_name, const char *new_prompt)
7843df9a8dfSCaroline Tice {
7853df9a8dfSCaroline Tice     std::string tmp_prompt;
7863df9a8dfSCaroline Tice 
7873df9a8dfSCaroline Tice     if (new_prompt != NULL)
7883df9a8dfSCaroline Tice     {
7893df9a8dfSCaroline Tice         tmp_prompt = new_prompt ;
7903df9a8dfSCaroline Tice         int len = tmp_prompt.size();
7913df9a8dfSCaroline Tice         if (len > 1
7923df9a8dfSCaroline Tice             && (tmp_prompt[0] == '\'' || tmp_prompt[0] == '"')
7933df9a8dfSCaroline Tice             && (tmp_prompt[len-1] == tmp_prompt[0]))
7943df9a8dfSCaroline Tice         {
7953df9a8dfSCaroline Tice             tmp_prompt = tmp_prompt.substr(1,len-2);
7963df9a8dfSCaroline Tice         }
7973df9a8dfSCaroline Tice         len = tmp_prompt.size();
7983df9a8dfSCaroline Tice         if (tmp_prompt[len-1] != ' ')
7993df9a8dfSCaroline Tice             tmp_prompt.append(" ");
8003df9a8dfSCaroline Tice     }
8013df9a8dfSCaroline Tice     EventSP new_event_sp;
8023df9a8dfSCaroline Tice     new_event_sp.reset (new Event(CommandInterpreter::eBroadcastBitResetPrompt,
8033df9a8dfSCaroline Tice                                   new EventDataBytes (tmp_prompt.c_str())));
8043df9a8dfSCaroline Tice 
8053df9a8dfSCaroline Tice     if (instance_name.GetLength() != 0)
8063df9a8dfSCaroline Tice     {
8073df9a8dfSCaroline Tice         // Set prompt for a particular instance.
8083df9a8dfSCaroline Tice         Debugger *dbg = Debugger::FindDebuggerWithInstanceName (instance_name).get();
8093df9a8dfSCaroline Tice         if (dbg != NULL)
8103df9a8dfSCaroline Tice         {
8113df9a8dfSCaroline Tice             dbg->GetCommandInterpreter().BroadcastEvent (new_event_sp);
8123df9a8dfSCaroline Tice         }
8133df9a8dfSCaroline Tice     }
8143df9a8dfSCaroline Tice 
8153df9a8dfSCaroline Tice     return true;
8163df9a8dfSCaroline Tice }
8173df9a8dfSCaroline Tice 
8183df9a8dfSCaroline Tice const ConstString
8193df9a8dfSCaroline Tice DebuggerInstanceSettings::CreateInstanceName ()
8203df9a8dfSCaroline Tice {
8213df9a8dfSCaroline Tice     static int instance_count = 1;
8223df9a8dfSCaroline Tice     StreamString sstr;
8233df9a8dfSCaroline Tice 
8243df9a8dfSCaroline Tice     sstr.Printf ("debugger_%d", instance_count);
8253df9a8dfSCaroline Tice     ++instance_count;
8263df9a8dfSCaroline Tice 
8273df9a8dfSCaroline Tice     const ConstString ret_val (sstr.GetData());
8283df9a8dfSCaroline Tice 
8293df9a8dfSCaroline Tice     return ret_val;
8303df9a8dfSCaroline Tice }
8313df9a8dfSCaroline Tice 
8323df9a8dfSCaroline Tice const ConstString &
8333df9a8dfSCaroline Tice DebuggerInstanceSettings::PromptVarName ()
8343df9a8dfSCaroline Tice {
8353df9a8dfSCaroline Tice     static ConstString prompt_var_name ("prompt");
8363df9a8dfSCaroline Tice 
8373df9a8dfSCaroline Tice     return prompt_var_name;
8383df9a8dfSCaroline Tice }
8393df9a8dfSCaroline Tice 
8403df9a8dfSCaroline Tice const ConstString &
8413df9a8dfSCaroline Tice DebuggerInstanceSettings::ScriptLangVarName ()
8423df9a8dfSCaroline Tice {
8433df9a8dfSCaroline Tice     static ConstString script_lang_var_name ("script-lang");
8443df9a8dfSCaroline Tice 
8453df9a8dfSCaroline Tice     return script_lang_var_name;
8463df9a8dfSCaroline Tice }
8473df9a8dfSCaroline Tice 
8483df9a8dfSCaroline Tice //--------------------------------------------------
8493df9a8dfSCaroline Tice // DebuggerSettingsController Variable Tables
8503df9a8dfSCaroline Tice //--------------------------------------------------
8513df9a8dfSCaroline Tice 
8523df9a8dfSCaroline Tice 
8533df9a8dfSCaroline Tice SettingEntry
8543df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::global_settings_table[] =
8553df9a8dfSCaroline Tice {
8563df9a8dfSCaroline Tice   //{ "var-name",    var-type,      "default", enum-table, init'd, hidden, "help-text"},
8573df9a8dfSCaroline Tice     { "term-width" , eSetVarTypeInt, "80"    , NULL,       false , false , "The maximum number of columns to use for displaying text." },
8583df9a8dfSCaroline Tice     {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
8593df9a8dfSCaroline Tice };
8603df9a8dfSCaroline Tice 
8613df9a8dfSCaroline Tice 
8623df9a8dfSCaroline Tice 
8633df9a8dfSCaroline Tice SettingEntry
8643df9a8dfSCaroline Tice Debugger::DebuggerSettingsController::instance_settings_table[] =
8653df9a8dfSCaroline Tice {
8663df9a8dfSCaroline Tice   //{ "var-name",     var-type ,        "default", enum-table, init'd, hidden, "help-text"},
8673df9a8dfSCaroline Tice     { "script-lang" , eSetVarTypeString, "python", NULL,       false,  false,  "The script language to be used for evaluating user-written scripts." },
8683df9a8dfSCaroline Tice     { "prompt"      , eSetVarTypeString, "(lldb)", NULL,       false,  false,  "The debugger command line prompt displayed for the user." },
8693df9a8dfSCaroline Tice     {  NULL, eSetVarTypeNone, NULL, NULL, 0, 0, NULL }
8703df9a8dfSCaroline Tice };
871