CommandInterpreter.cpp revision 9d1acc179e28cf2625e66c411fb164303b6e4e4e
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandInterpreter.cpp ----------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
11bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice#include <vector>
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <getopt.h>
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
165c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "CommandObjectScript.h"
17921fac021ef9f7e5d32de359e67d5ad28fcccc65Peter Collingbourne#include "lldb/Interpreter/CommandObjectRegexCommand.h"
185c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton
19ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectApropos.h"
20ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectArgs.h"
21ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectBreakpoint.h"
22ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectDisassemble.h"
23ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectExpression.h"
24ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectFrame.h"
25ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectHelp.h"
26ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectLog.h"
27ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectMemory.h"
28b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "../Commands/CommandObjectPlatform.h"
29ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectProcess.h"
30ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectQuit.h"
31ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectRegister.h"
32ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectSettings.h"
33ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectSource.h"
34767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "../Commands/CommandObjectCommands.h"
35ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectSyntax.h"
36ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectTarget.h"
37ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectThread.h"
385c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "../Commands/CommandObjectType.h"
39902e018b7b7b16609099c656c97ec2c0cb115c00Johnny Chen#include "../Commands/CommandObjectVersion.h"
4001acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen#include "../Commands/CommandObjectWatchpoint.h"
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4284cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
435ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice#include "lldb/Interpreter/Options.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
455e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham#include "lldb/Core/InputReader.h"
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
48cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Host.h"
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Thread.h"
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/TargetList.h"
52e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton#include "lldb/Utility/CleanUp.h"
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
560aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice#include "lldb/Interpreter/ScriptInterpreterNone.h"
570aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice#include "lldb/Interpreter/ScriptInterpreterPython.h"
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::CommandInterpreter
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
6463094e0bb161580564954dee512955c1c79d3476Greg Clayton    Debugger &debugger,
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ScriptLanguage script_language,
6663094e0bb161580564954dee512955c1c79d3476Greg Clayton    bool synchronous_execution
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
6849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    Broadcaster ("lldb.command-interpreter"),
6963094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_debugger (debugger),
70887aa2898314218406275a34cbec30c11cd00acdGreg Clayton    m_synchronous_execution (synchronous_execution),
710aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    m_skip_lldbinit_files (false),
72574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    m_skip_app_init_files (false),
73949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    m_script_interpreter_ap (),
74892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice    m_comment_char ('#'),
756247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    m_repeat_char ('!'),
76293a7b335833a009fc8bdcf3ee20e0ed4ae17406Enrico Granata    m_batch_command_mode (false),
77293a7b335833a009fc8bdcf3ee20e0ed4ae17406Enrico Granata    m_truncation_warning(eNoTruncation)
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
796e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    const char *dbg_name = debugger.GetInstanceName().AsCString();
806e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    std::string lang_name = ScriptInterpreter::LanguageToString (script_language);
816e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    StreamString var_name;
826e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    var_name.Printf ("[%s].script-lang", dbg_name);
831d2aefd474c9893407ef4deacefd08dd2ca2e806Caroline Tice    debugger.GetSettingsController()->SetVariable (var_name.GetData(), lang_name.c_str(),
84b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton                                                   eVarSetOperationAssign, false,
8549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton                                                   m_debugger.GetInstanceName().AsCString());
8649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitThreadShouldExit, "thread-should-exit");
8749ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitResetPrompt, "reset-prompt");
8849ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitQuitCommandReceived, "quit");
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::Initialize ()
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject result;
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LoadCommandDictionary ();
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set up some initial aliases.
1015ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    CommandObjectSP cmd_obj_sp = GetCommandSPExact ("quit", false);
1025ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1035ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1045ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("q", cmd_obj_sp);
1055ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("exit", cmd_obj_sp);
1065ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
1075ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1085ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("process continue", false);
1095ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1105ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1115ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("c", cmd_obj_sp);
1125ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("continue", cmd_obj_sp);
1135ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
1145ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1155ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("_regexp-break",false);
1165ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1175ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("b", cmd_obj_sp);
1185ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1195ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread backtrace", false);
1205ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1215ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("bt", cmd_obj_sp);
1225ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1235ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-inst", false);
1245ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
12547eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    {
12647eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda        AddAlias ("stepi", cmd_obj_sp);
1275ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("si", cmd_obj_sp);
12847eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    }
12947eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda
13047eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    cmd_obj_sp = GetCommandSPExact ("thread step-inst-over", false);
13147eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    if (cmd_obj_sp)
13247eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    {
13347eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda        AddAlias ("nexti", cmd_obj_sp);
13447eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda        AddAlias ("ni", cmd_obj_sp);
13547eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    }
1365ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1375ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-in", false);
1385ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1395ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1405ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("s", cmd_obj_sp);
1415ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("step", cmd_obj_sp);
1425ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
1435ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1445ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-over", false);
1455ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1465ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1475ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("n", cmd_obj_sp);
1485ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("next", cmd_obj_sp);
1495ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
1505ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1515ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-out", false);
1525ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1535ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1545ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("f", cmd_obj_sp);
1555ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("finish", cmd_obj_sp);
1565ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
1575ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1585ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("source list", false);
1595ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1605ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1615ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("l", cmd_obj_sp);
1625ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("list", cmd_obj_sp);
1635ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
1645ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1655ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("memory read", false);
1665ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1675ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("x", cmd_obj_sp);
1685ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1695ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("_regexp-up", false);
1705ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1715ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("up", cmd_obj_sp);
1725ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1735ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("_regexp-down", false);
1745ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1755ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("down", cmd_obj_sp);
1765ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
177730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    cmd_obj_sp = GetCommandSPExact ("_display", false);
178730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (cmd_obj_sp)
179730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        AddAlias ("display", cmd_obj_sp);
1809d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
1819d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    cmd_obj_sp = GetCommandSPExact ("disassemble", false);
1829d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    if (cmd_obj_sp)
1839d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham        AddAlias ("dis", cmd_obj_sp);
1849d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
1859d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    cmd_obj_sp = GetCommandSPExact ("disassemble", false);
1869d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    if (cmd_obj_sp)
1879d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham        AddAlias ("di", cmd_obj_sp);
1889d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
1899d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
190730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
191730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    cmd_obj_sp = GetCommandSPExact ("_undisplay", false);
192730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (cmd_obj_sp)
193730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        AddAlias ("undisplay", cmd_obj_sp);
194730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
1955ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("target create", false);
1965ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1975ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("file", cmd_obj_sp);
1985ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1995ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("target modules", false);
2005ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2015ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("image", cmd_obj_sp);
2025ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2035ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2045ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    OptionArgVectorSP alias_arguments_vector_sp (new OptionArgVector);
205e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham
2065ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("expression", false);
2075ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2085ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
2095ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("expr", cmd_obj_sp);
2105ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2115ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        ProcessAliasOptionsArgs (cmd_obj_sp, "--", alias_arguments_vector_sp);
2125ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("p", cmd_obj_sp);
2135ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("print", cmd_obj_sp);
2145ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("p", alias_arguments_vector_sp);
2155ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("print", alias_arguments_vector_sp);
2165ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2175ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        alias_arguments_vector_sp.reset (new OptionArgVector);
2185ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        ProcessAliasOptionsArgs (cmd_obj_sp, "-o --", alias_arguments_vector_sp);
2195ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("po", cmd_obj_sp);
2205ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("po", alias_arguments_vector_sp);
2215ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
2225ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2235ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("process launch", false);
2245ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2255ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
2265ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        alias_arguments_vector_sp.reset (new OptionArgVector);
2275ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        ProcessAliasOptionsArgs (cmd_obj_sp, "--", alias_arguments_vector_sp);
2285ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("r", cmd_obj_sp);
2295ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("run", cmd_obj_sp);
2305ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("r", alias_arguments_vector_sp);
2315ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("run", alias_arguments_vector_sp);
2325ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::ProcessEmbeddedScriptCommands (const char *arg)
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This function has not yet been implemented.
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Look for any embedded script command
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If found,
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    get interpreter object from the command dictionary,
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    call execute_one_command on it,
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    get the results as a string,
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    substitute that string for current stuff.
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return arg;
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::LoadCommandDictionary ()
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // **** IMPORTANT **** IMPORTANT *** IMPORTANT *** **** IMPORTANT **** IMPORTANT *** IMPORTANT ***
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Command objects that are used as cross reference objects (i.e. they inherit from CommandObjectCrossref)
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // *MUST* be created and put into the command dictionary *BEFORE* any multi-word commands (which may use
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the cross-referencing stuff) are created!!!
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // **** IMPORTANT **** IMPORTANT *** IMPORTANT *** **** IMPORTANT **** IMPORTANT *** IMPORTANT ***
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Command objects that inherit from CommandObjectCrossref must be created before other command objects
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // are created.  This is so that when another command is created that needs to go into a crossref object,
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the crossref object exists and is ready to take the cross reference. Put the cross referencing command
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // objects into the CommandDictionary now, so they are ready for use when the other commands get created.
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Non-CommandObjectCrossref commands can now be created.
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2725bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    lldb::ScriptLanguage script_language = m_debugger.GetScriptLanguage();
2736e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
274238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["apropos"]   = CommandObjectSP (new CommandObjectApropos (*this));
27563094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["breakpoint"]= CommandObjectSP (new CommandObjectMultiwordBreakpoint (*this));
276238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    //m_command_dict["call"]      = CommandObjectSP (new CommandObjectCall (*this));
2779e4c3d7e23766be3d65b6637a2a52e455b5fed0aJohnny Chen    m_command_dict["command"]   = CommandObjectSP (new CommandObjectMultiwordCommands (*this));
278238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["disassemble"] = CommandObjectSP (new CommandObjectDisassemble (*this));
279238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["expression"]= CommandObjectSP (new CommandObjectExpression (*this));
280abe0fed36d83e1c37af9dae90c2d25db742b4515Greg Clayton//    m_command_dict["file"]      = CommandObjectSP (new CommandObjectFile (*this));
28163094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["frame"]     = CommandObjectSP (new CommandObjectMultiwordFrame (*this));
282238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["help"]      = CommandObjectSP (new CommandObjectHelp (*this));
283e1f50b9df1299f6b9181b5ac2699ed4a3ad38a59Greg Clayton    ///    m_command_dict["image"]     = CommandObjectSP (new CommandObjectImage (*this));
28463094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["log"]       = CommandObjectSP (new CommandObjectLog (*this));
28563094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["memory"]    = CommandObjectSP (new CommandObjectMemory (*this));
286b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_command_dict["platform"]  = CommandObjectSP (new CommandObjectPlatform (*this));
28763094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["process"]   = CommandObjectSP (new CommandObjectMultiwordProcess (*this));
288238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["quit"]      = CommandObjectSP (new CommandObjectQuit (*this));
28963094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["register"]  = CommandObjectSP (new CommandObjectRegister (*this));
290238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["script"]    = CommandObjectSP (new CommandObjectScript (*this, script_language));
2916e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_command_dict["settings"]  = CommandObjectSP (new CommandObjectMultiwordSettings (*this));
292767af88aa617288e584afcfed055f7755e408542Jim Ingham    m_command_dict["source"]    = CommandObjectSP (new CommandObjectMultiwordSource (*this));
29363094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["target"]    = CommandObjectSP (new CommandObjectMultiwordTarget (*this));
29463094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["thread"]    = CommandObjectSP (new CommandObjectMultiwordThread (*this));
2956b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    m_command_dict["type"]      = CommandObjectSP (new CommandObjectType (*this));
296902e018b7b7b16609099c656c97ec2c0cb115c00Johnny Chen    m_command_dict["version"]   = CommandObjectSP (new CommandObjectVersion (*this));
29701acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen    m_command_dict["watchpoint"]= CommandObjectSP (new CommandObjectMultiwordWatchpoint (*this));
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::auto_ptr<CommandObjectRegexCommand>
300238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    break_regex_cmd_ap(new CommandObjectRegexCommand (*this,
301b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                      "_regexp-break",
302c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                                                      "Set a breakpoint using a regular expression to specify the location.",
303b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                      "_regexp-break [<filename>:<linenum>]\n_regexp-break [<address>]\n_regexp-break <...>", 2));
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (break_regex_cmd_ap.get())
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (break_regex_cmd_ap->AddRegexCommand("^(.*[^[:space:]])[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]]*$", "breakpoint set --file '%1' --line %2") &&
30724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break_regex_cmd_ap->AddRegexCommand("^(0x[[:xdigit:]]+)[[:space:]]*$", "breakpoint set --address %1") &&
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break_regex_cmd_ap->AddRegexCommand("^[\"']?([-+]\\[.*\\])[\"']?[[:space:]]*$", "breakpoint set --name '%1'") &&
309b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            break_regex_cmd_ap->AddRegexCommand("^$", "breakpoint list --full") &&
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break_regex_cmd_ap->AddRegexCommand("^(-.*)$", "breakpoint set %1") &&
311b01000fd063629facd45044f137446fb748ee179Greg Clayton            break_regex_cmd_ap->AddRegexCommand("^(.*[^[:space:]])`(.*[^[:space:]])[[:space:]]*$", "breakpoint set --name '%2' --shlib '%1'") &&
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break_regex_cmd_ap->AddRegexCommand("^(.*[^[:space:]])[[:space:]]*$", "breakpoint set --name '%1'"))
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CommandObjectSP break_regex_cmd_sp(break_regex_cmd_ap.release());
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_command_dict[break_regex_cmd_sp->GetCommandName ()] = break_regex_cmd_sp;
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
318e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham
319e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    std::auto_ptr<CommandObjectRegexCommand>
320e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    down_regex_cmd_ap(new CommandObjectRegexCommand (*this,
321b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                     "_regexp-down",
322b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                     "Go down \"n\" frames in the stack (1 frame by default).",
323b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                     "_regexp-down [n]", 2));
324e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    if (down_regex_cmd_ap.get())
325e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    {
326e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        if (down_regex_cmd_ap->AddRegexCommand("^$", "frame select -r -1") &&
327e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            down_regex_cmd_ap->AddRegexCommand("^([0-9]+)$", "frame select -r -%1"))
328e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        {
329e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            CommandObjectSP down_regex_cmd_sp(down_regex_cmd_ap.release());
330e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            m_command_dict[down_regex_cmd_sp->GetCommandName ()] = down_regex_cmd_sp;
331e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        }
332e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    }
333e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham
334e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    std::auto_ptr<CommandObjectRegexCommand>
335e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    up_regex_cmd_ap(new CommandObjectRegexCommand (*this,
336b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                   "_regexp-up",
337b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                   "Go up \"n\" frames in the stack (1 frame by default).",
338b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                   "_regexp-up [n]", 2));
339e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    if (up_regex_cmd_ap.get())
340e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    {
341e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        if (up_regex_cmd_ap->AddRegexCommand("^$", "frame select -r 1") &&
342e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            up_regex_cmd_ap->AddRegexCommand("^([0-9]+)$", "frame select -r %1"))
343e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        {
344e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            CommandObjectSP up_regex_cmd_sp(up_regex_cmd_ap.release());
345e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            m_command_dict[up_regex_cmd_sp->GetCommandName ()] = up_regex_cmd_sp;
346e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        }
347e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    }
348730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
349730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    std::auto_ptr<CommandObjectRegexCommand>
350730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    display_regex_cmd_ap(new CommandObjectRegexCommand (*this,
351730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda                                                   "_display",
352730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda                                                   "Add an expression evaluation stop-hook.",
353730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda                                                   "_display expression", 2));
354730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (display_regex_cmd_ap.get())
355730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    {
356730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        if (display_regex_cmd_ap->AddRegexCommand("^(.+)$", "target stop-hook add -o \"expr -- %1\""))
357730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        {
358730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            CommandObjectSP display_regex_cmd_sp(display_regex_cmd_ap.release());
359730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            m_command_dict[display_regex_cmd_sp->GetCommandName ()] = display_regex_cmd_sp;
360730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        }
361730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    }
362730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
363730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    std::auto_ptr<CommandObjectRegexCommand>
364730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    undisplay_regex_cmd_ap(new CommandObjectRegexCommand (*this,
365730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda                                                   "_undisplay",
366730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda                                                   "Remove an expression evaluation stop-hook.",
367730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda                                                   "_undisplay stop-hook-number", 2));
368730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (undisplay_regex_cmd_ap.get())
369730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    {
370730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        if (undisplay_regex_cmd_ap->AddRegexCommand("^([0-9]+)$", "target stop-hook delete %1"))
371730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        {
372730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            CommandObjectSP undisplay_regex_cmd_sp(undisplay_regex_cmd_ap.release());
373730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            m_command_dict[undisplay_regex_cmd_sp->GetCommandName ()] = undisplay_regex_cmd_sp;
374730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        }
375730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    }
376730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetCommandNamesMatchingPartialString (const char *cmd_str, bool include_aliases,
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          StringList &matches)
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::AddNamesMatchingPartialString (m_command_dict, cmd_str, matches);
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (include_aliases)
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject::AddNamesMatchingPartialString (m_alias_dict, cmd_str, matches);
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return matches.GetSize();
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectSP
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetCommandSP (const char *cmd_cstr, bool include_aliases, bool exact, StringList *matches)
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator pos;
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObjectSP ret_val;
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string cmd(cmd_cstr);
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (HasCommands())
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_command_dict.find(cmd);
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_command_dict.end())
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ret_val = pos->second;
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (include_aliases && HasAliases())
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_alias_dict.find(cmd);
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_alias_dict.end())
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ret_val = pos->second;
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (HasUserCommands())
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_user_dict.find(cmd);
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_user_dict.end())
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            ret_val = pos->second;
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!exact && ret_val == NULL)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
424d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // We will only get into here if we didn't find any exact matches.
425d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
426d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        CommandObjectSP user_match_sp, alias_match_sp, real_match_sp;
427d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StringList local_matches;
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (matches == NULL)
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            matches = &local_matches;
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
432d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        unsigned int num_cmd_matches = 0;
433d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        unsigned int num_alias_matches = 0;
434d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        unsigned int num_user_matches = 0;
435d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
436d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // Look through the command dictionaries one by one, and if we get only one match from any of
437d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // them in toto, then return that, otherwise return an empty CommandObjectSP and the list of matches.
438d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (HasCommands())
44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_cmd_matches = CommandObject::AddNamesMatchingPartialString (m_command_dict, cmd_cstr, *matches);
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_cmd_matches == 1)
44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cmd.assign(matches->GetStringAtIndex(0));
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos = m_command_dict.find(cmd);
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pos != m_command_dict.end())
449d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                real_match_sp = pos->second;
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4529a57417fd3e1a4a9fe5044fc431f9836bade906dJim Ingham        if (include_aliases && HasAliases())
45324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_alias_matches = CommandObject::AddNamesMatchingPartialString (m_alias_dict, cmd_cstr, *matches);
45524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
458d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        if (num_alias_matches == 1)
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cmd.assign(matches->GetStringAtIndex (num_cmd_matches));
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos = m_alias_dict.find(cmd);
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pos != m_alias_dict.end())
463d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                alias_match_sp = pos->second;
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4669a57417fd3e1a4a9fe5044fc431f9836bade906dJim Ingham        if (HasUserCommands())
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_user_matches = CommandObject::AddNamesMatchingPartialString (m_user_dict, cmd_cstr, *matches);
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
47024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
471d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        if (num_user_matches == 1)
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cmd.assign (matches->GetStringAtIndex (num_cmd_matches + num_alias_matches));
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos = m_user_dict.find (cmd);
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pos != m_user_dict.end())
477d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                user_match_sp = pos->second;
478d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        }
479d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
480d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // If we got exactly one match, return that, otherwise return the match list.
481d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
482d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        if (num_user_matches + num_cmd_matches + num_alias_matches == 1)
483d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        {
484d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham            if (num_cmd_matches)
485d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                return real_match_sp;
486d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham            else if (num_alias_matches)
487d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                return alias_match_sp;
488d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham            else
489d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                return user_match_sp;
49024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
49124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
492d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    else if (matches && ret_val != NULL)
493d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    {
494d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        matches->AppendString (cmd_cstr);
49524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
49624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
49824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ret_val;
49924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
501d12aeab33bab559e138307f599077da3918a3238Greg Claytonbool
502d12aeab33bab559e138307f599077da3918a3238Greg ClaytonCommandInterpreter::AddCommand (const char *name, const lldb::CommandObjectSP &cmd_sp, bool can_replace)
503d12aeab33bab559e138307f599077da3918a3238Greg Clayton{
504d12aeab33bab559e138307f599077da3918a3238Greg Clayton    if (name && name[0])
505d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
506d12aeab33bab559e138307f599077da3918a3238Greg Clayton        std::string name_sstr(name);
507d12aeab33bab559e138307f599077da3918a3238Greg Clayton        if (!can_replace)
508d12aeab33bab559e138307f599077da3918a3238Greg Clayton        {
509d12aeab33bab559e138307f599077da3918a3238Greg Clayton            if (m_command_dict.find (name_sstr) != m_command_dict.end())
510d12aeab33bab559e138307f599077da3918a3238Greg Clayton                return false;
511d12aeab33bab559e138307f599077da3918a3238Greg Clayton        }
512d12aeab33bab559e138307f599077da3918a3238Greg Clayton        m_command_dict[name_sstr] = cmd_sp;
513d12aeab33bab559e138307f599077da3918a3238Greg Clayton        return true;
514d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
515d12aeab33bab559e138307f599077da3918a3238Greg Clayton    return false;
516d12aeab33bab559e138307f599077da3918a3238Greg Clayton}
517d12aeab33bab559e138307f599077da3918a3238Greg Clayton
5186b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granatabool
5196b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico GranataCommandInterpreter::AddUserCommand (const char *name,
5206b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                    const lldb::CommandObjectSP &cmd_sp,
5216b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                    bool can_replace)
5226b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata{
5236b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    if (name && name[0])
5246b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    {
5256b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        std::string name_sstr(name);
5266b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        if (!can_replace)
5276b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        {
5286b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata            if (m_user_dict.find (name_sstr) != m_user_dict.end())
5296b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                return false;
5306b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        }
5316b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        m_user_dict[name_sstr] = cmd_sp;
5326b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        return true;
5336b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    }
5346b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    return false;
5356b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata}
536d12aeab33bab559e138307f599077da3918a3238Greg Clayton
537d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandObjectSP
538d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandInterpreter::GetCommandSPExact (const char *cmd_cstr, bool include_aliases)
539d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham{
54056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    Args cmd_words (cmd_cstr); // Break up the command string into words, in case it's a multi-word command.
54156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    CommandObjectSP ret_val;   // Possibly empty return value.
54256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice
54356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    if (cmd_cstr == NULL)
54456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        return ret_val;
54556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice
54656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    if (cmd_words.GetArgumentCount() == 1)
54756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        return GetCommandSP(cmd_cstr, include_aliases, true, NULL);
54856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    else
54956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    {
55056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        // We have a multi-word command (seemingly), so we need to do more work.
55156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        // First, get the cmd_obj_sp for the first word in the command.
55256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        CommandObjectSP cmd_obj_sp = GetCommandSP (cmd_words.GetArgumentAtIndex (0), include_aliases, true, NULL);
55356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        if (cmd_obj_sp.get() != NULL)
55456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        {
55556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // Loop through the rest of the words in the command (everything passed in was supposed to be part of a
55656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // command name), and find the appropriate sub-command SP for each command word....
55756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            size_t end = cmd_words.GetArgumentCount();
55856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            for (size_t j= 1; j < end; ++j)
55956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            {
56056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                if (cmd_obj_sp->IsMultiwordObject())
56156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                {
56256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    cmd_obj_sp = ((CommandObjectMultiword *) cmd_obj_sp.get())->GetSubcommandSP
56356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    (cmd_words.GetArgumentAtIndex (j));
56456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    if (cmd_obj_sp.get() == NULL)
56556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                        // The sub-command name was invalid.  Fail and return the empty 'ret_val'.
56656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                        return ret_val;
56756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                }
56856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                else
56956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    // We have more words in the command name, but we don't have a multiword object. Fail and return
57056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    // empty 'ret_val'.
57156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    return ret_val;
57256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            }
57356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // We successfully looped through all the command words and got valid command objects for them.  Assign the
57456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // last object retrieved to 'ret_val'.
57556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            ret_val = cmd_obj_sp;
57656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        }
57756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    }
57856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    return ret_val;
579d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham}
580d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
58124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject *
582d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandInterpreter::GetCommandObjectExact (const char *cmd_cstr, bool include_aliases)
58324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
584d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    return GetCommandSPExact (cmd_cstr, include_aliases).get();
585d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham}
586d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
587d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandObject *
588d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandInterpreter::GetCommandObject (const char *cmd_cstr, StringList *matches)
589d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham{
590d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    CommandObject *command_obj = GetCommandSP (cmd_cstr, false, true, matches).get();
591d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
592d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    // If we didn't find an exact match to the command string in the commands, look in
593d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    // the aliases.
594d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
595d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    if (command_obj == NULL)
596d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    {
597d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        command_obj = GetCommandSP (cmd_cstr, true, true, matches).get();
598d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    }
599d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
600d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    // Finally, if there wasn't an exact match among the aliases, look for an inexact match
601d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    // in both the commands and the aliases.
602d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
603d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    if (command_obj == NULL)
604d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        command_obj = GetCommandSP(cmd_cstr, true, false, matches).get();
605d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
606d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    return command_obj;
60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
60824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
60924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
61024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::CommandExists (const char *cmd)
61124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
61224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_command_dict.find(cmd) != m_command_dict.end();
61324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
61424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
61524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
6165ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline TiceCommandInterpreter::ProcessAliasOptionsArgs (lldb::CommandObjectSP &cmd_obj_sp,
6175ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                            const char *options_args,
6185ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                            OptionArgVectorSP &option_arg_vector_sp)
6195ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice{
6205ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    bool success = true;
6215ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
6225ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
6235ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (!options_args || (strlen (options_args) < 1))
6245ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        return true;
6255ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
6265ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    std::string options_string (options_args);
6275ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    Args args (options_args);
6285ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    CommandReturnObject result;
6295ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    // Check to see if the command being aliased can take any command options.
6305ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    Options *options = cmd_obj_sp->GetOptions ();
6315ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (options)
6325ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
6335ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        // See if any options were specified as part of the alias;  if so, handle them appropriately.
6345ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        options->NotifyOptionParsingStarting ();
6355ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        args.Unshift ("dummy_arg");
6365ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        args.ParseAliasOptions (*options, result, option_arg_vector, options_string);
6375ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        args.Shift ();
6385ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        if (result.Succeeded())
6395ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            options->VerifyPartialOptions (result);
6405ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted)
6415ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        {
6425ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            result.AppendError ("Unable to create requested alias.\n");
6435ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            return false;
6445ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        }
6455ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
6465ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
6475ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (options_string.size() > 0)
6485ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
6495ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        if (cmd_obj_sp->WantsRawCommandString ())
6505ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            option_arg_vector->push_back (OptionArgPair ("<argument>",
6515ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                          OptionArgValue (-1,
6525ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                                          options_string)));
6535ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        else
6545ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        {
6555ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            int argc = args.GetArgumentCount();
6565ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            for (size_t i = 0; i < argc; ++i)
6575ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                if (strcmp (args.GetArgumentAtIndex (i), "") != 0)
6585ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                    option_arg_vector->push_back
6595ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                (OptionArgPair ("<argument>",
6605ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                OptionArgValue (-1,
6615ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                                std::string (args.GetArgumentAtIndex (i)))));
6625ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        }
6635ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
6645ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
6655ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    return success;
6665ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice}
6675ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
6685ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Ticebool
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::AliasExists (const char *cmd)
67024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_alias_dict.find(cmd) != m_alias_dict.end();
67224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::UserCommandExists (const char *cmd)
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_user_dict.find(cmd) != m_user_dict.end();
67824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
67924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
68124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::AddAlias (const char *alias_name, CommandObjectSP& command_obj_sp)
68224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
683d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    command_obj_sp->SetIsAlias (true);
68424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_alias_dict[alias_name] = command_obj_sp;
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::RemoveAlias (const char *alias_name)
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator pos = m_alias_dict.find(alias_name);
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_alias_dict.end())
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_alias_dict.erase(pos);
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
69524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
69824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::RemoveUser (const char *alias_name)
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator pos = m_user_dict.find(alias_name);
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_user_dict.end())
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
70424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_user_dict.erase(pos);
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
70924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetAliasHelp (const char *alias_name, const char *command_name, StreamString &help_string)
71224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    help_string.Printf ("'%s", command_name);
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgVectorSP option_arg_vector_sp = GetAliasOptions (alias_name);
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (option_arg_vector_sp != NULL)
71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionArgVector *options = option_arg_vector_sp.get();
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (int i = 0; i < options->size(); ++i)
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            OptionArgPair cur_option = (*options)[i];
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string opt = cur_option.first;
72344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            OptionArgValue value_pair = cur_option.second;
72444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            std::string value = value_pair.second;
72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (opt.compare("<argument>") == 0)
72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
72724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                help_string.Printf (" %s", value.c_str());
72824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
73024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
73124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                help_string.Printf (" %s", opt.c_str());
73224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if ((value.compare ("<no-argument>") != 0)
73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    && (value.compare ("<need-argument") != 0))
73424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
73524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    help_string.Printf (" %s", value.c_str());
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
73824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
73924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
74024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    help_string.Printf ("'");
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74465124eac53b7a214906e8931be314e429bbbeb30Greg Claytonsize_t
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::FindLongestCommandWord (CommandObject::CommandMap &dict)
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
74724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::const_iterator pos;
74865124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    CommandObject::CommandMap::const_iterator end = dict.end();
74965124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    size_t max_len = 0;
75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
75165124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    for (pos = dict.begin(); pos != end; ++pos)
75265124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    {
75365124eac53b7a214906e8931be314e429bbbeb30Greg Clayton        size_t len = pos->first.size();
75465124eac53b7a214906e8931be314e429bbbeb30Greg Clayton        if (max_len < len)
75565124eac53b7a214906e8931be314e429bbbeb30Greg Clayton            max_len = len;
75665124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    }
75765124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    return max_len;
75824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
75924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
76024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
7616b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico GranataCommandInterpreter::GetHelp (CommandReturnObject &result,
7621ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata                             uint32_t cmd_types)
76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
76424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::const_iterator pos;
76565124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    uint32_t max_len = FindLongestCommandWord (m_command_dict);
7666b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
7676b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    if ( (cmd_types & eCommandTypesBuiltin) == eCommandTypesBuiltin )
76824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
7696b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
7706b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        result.AppendMessage("The following is a list of built-in, permanent debugger commands:");
7716b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        result.AppendMessage("");
7726b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
7736b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        for (pos = m_command_dict.begin(); pos != m_command_dict.end(); ++pos)
7746b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        {
7756b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata            OutputFormattedHelpText (result.GetOutputStream(), pos->first.c_str(), "--", pos->second->GetHelp(),
7766b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                     max_len);
7776b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        }
7786b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        result.AppendMessage("");
7796b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
78024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
78124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7826b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    if (m_alias_dict.size() > 0 && ( (cmd_types & eCommandTypesAliases) == eCommandTypesAliases ))
78324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
784e3663e8cd1fce64f73dd3740d65132a76ac97709Jim Ingham        result.AppendMessage("The following is a list of your current command abbreviations "
7859e4c3d7e23766be3d65b6637a2a52e455b5fed0aJohnny Chen                             "(see 'help command alias' for more info):");
78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
78765124eac53b7a214906e8931be314e429bbbeb30Greg Clayton        max_len = FindLongestCommandWord (m_alias_dict);
78865124eac53b7a214906e8931be314e429bbbeb30Greg Clayton
78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (pos = m_alias_dict.begin(); pos != m_alias_dict.end(); ++pos)
79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
79224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString translation_and_help;
79324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string entry_name = pos->first;
79424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string second_entry = pos->second.get()->GetCommandName();
79524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            GetAliasHelp (pos->first.c_str(), pos->second->GetCommandName(), sstr);
79624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            translation_and_help.Printf ("(%s)  %s", sstr.GetData(), pos->second->GetHelp());
79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            OutputFormattedHelpText (result.GetOutputStream(), pos->first.c_str(), "--",
79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     translation_and_help.GetData(), max_len);
80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
80224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
80324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8046b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    if (m_user_dict.size() > 0 && ( (cmd_types & eCommandTypesUserDef) == eCommandTypesUserDef ))
80524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
80624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage ("The following is a list of your current user-defined commands:");
80724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
8086b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        max_len = FindLongestCommandWord (m_user_dict);
80924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (pos = m_user_dict.begin(); pos != m_user_dict.end(); ++pos)
81024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
8116b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata            OutputFormattedHelpText (result.GetOutputStream(), pos->first.c_str(), "--", pos->second->GetHelp(),
8126b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                     max_len);
81324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
81424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
81524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
81624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
81724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    result.AppendMessage("For more information on any particular command, try 'help <command-name>'.");
81824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
81924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
820e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline TiceCommandObject *
821e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline TiceCommandInterpreter::GetCommandObjectForCommand (std::string &command_string)
822e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice{
823e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // This function finds the final, lowest-level, alias-resolved command object whose 'Execute' function will
824e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // eventually be invoked by the given command line.
825e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
826e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    CommandObject *cmd_obj = NULL;
827e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    std::string white_space (" \t\v");
828e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    size_t start = command_string.find_first_not_of (white_space);
829e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    size_t end = 0;
830e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool done = false;
831e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    while (!done)
832e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
833e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (start != std::string::npos)
834e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
835e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Get the next word from command_string.
836e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            end = command_string.find_first_of (white_space, start);
837e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (end == std::string::npos)
838e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                end = command_string.size();
839e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            std::string cmd_word = command_string.substr (start, end - start);
840e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
841e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (cmd_obj == NULL)
842e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // Since cmd_obj is NULL we are on our first time through this loop. Check to see if cmd_word is a valid
843e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // command or alias.
844e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                cmd_obj = GetCommandObject (cmd_word.c_str());
845e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else if (cmd_obj->IsMultiwordObject ())
846e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
847e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // Our current object is a multi-word object; see if the cmd_word is a valid sub-command for our object.
848e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                CommandObject *sub_cmd_obj =
849e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                         ((CommandObjectMultiword *) cmd_obj)->GetSubcommandObject (cmd_word.c_str());
850e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                if (sub_cmd_obj)
851e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    cmd_obj = sub_cmd_obj;
852e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                else // cmd_word was not a valid sub-command word, so we are donee
853e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    done = true;
854e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
855e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
856e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // We have a cmd_obj and it is not a multi-word object, so we are done.
857e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                done = true;
858e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
859e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // If we didn't find a valid command object, or our command object is not a multi-word object, or
860e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // we are at the end of the command_string, then we are done.  Otherwise, find the start of the
861e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // next word.
862e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
863e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (!cmd_obj || !cmd_obj->IsMultiwordObject() || end >= command_string.size())
864e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                done = true;
865e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
866e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                start = command_string.find_first_not_of (white_space, end);
867e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
868e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
869e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Unable to find any more words.
870e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            done = true;
871e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
872e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
873e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (end == command_string.size())
874e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        command_string.clear();
875e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    else
876e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        command_string = command_string.substr(end);
877e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
878e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    return cmd_obj;
879e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice}
880e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
882649116c40a40319fd627f3543cbe7eaf47869f8dCaroline TiceCommandInterpreter::StripFirstWord (std::string &command_string, std::string &word, bool &was_quoted, char &quote_char)
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
884e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    std::string white_space (" \t\v");
885e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    size_t start;
886e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    size_t end;
887e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
888e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    start = command_string.find_first_not_of (white_space);
889e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (start != std::string::npos)
890e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
891649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice        size_t len = command_string.size() - start;
892649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice        if (len >= 2
893649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                && ((command_string[start] == '\'') || (command_string[start] == '"')))
894e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
895649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            was_quoted = true;
896649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            quote_char = command_string[start];
897649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            std::string quote_string = command_string.substr (start, 1);
898649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            start = start + 1;
899649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            end = command_string.find (quote_string, start);
900649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            if (end != std::string::npos)
901649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
902649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                word = command_string.substr (start, end - start);
903649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                if (end + 1 < len)
904649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    command_string = command_string.substr (end+1);
905649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                else
906649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    command_string.erase ();
907649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                size_t pos = command_string.find_first_not_of (white_space);
908649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                if ((pos != 0) && (pos != std::string::npos))
909649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    command_string = command_string.substr (pos);
910649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
911649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            else
912649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
913649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                word = command_string.substr (start - 1);
914649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                command_string.erase ();
915649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
916e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
917e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
918e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
919649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            end = command_string.find_first_of (white_space, start);
920649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            if (end != std::string::npos)
921649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
922649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                word = command_string.substr (start, end - start);
923649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                command_string = command_string.substr (end);
924649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                size_t pos = command_string.find_first_not_of (white_space);
925649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                if ((pos != 0) && (pos != std::string::npos))
926649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    command_string = command_string.substr (pos);
927649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
928649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            else
929649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
930649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                word = command_string.substr (start);
931649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                command_string.erase();
932649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
933e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
934e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
935e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
936e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    return true;
937e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice}
938e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
939e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Ticevoid
940e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline TiceCommandInterpreter::BuildAliasResult (const char *alias_name, std::string &raw_input_string, std::string &alias_result,
941e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                      CommandObject *&alias_cmd_obj, CommandReturnObject &result)
942e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice{
943e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    Args cmd_args (raw_input_string.c_str());
944e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    alias_cmd_obj = GetCommandObject (alias_name);
945e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    StreamString result_str;
946e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
947e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (alias_cmd_obj)
948e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
949e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        std::string alias_name_str = alias_name;
950e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if ((cmd_args.GetArgumentCount() == 0)
951e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            || (alias_name_str.compare (cmd_args.GetArgumentAtIndex(0)) != 0))
952e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            cmd_args.Unshift (alias_name);
953e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
954e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        result_str.Printf ("%s", alias_cmd_obj->GetCommandName ());
955e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        OptionArgVectorSP option_arg_vector_sp = GetAliasOptions (alias_name);
95624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
957e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (option_arg_vector_sp.get())
958e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
959e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
960e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
961e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            for (int i = 0; i < option_arg_vector->size(); ++i)
962e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
963e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                OptionArgPair option_pair = (*option_arg_vector)[i];
964e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                OptionArgValue value_pair = option_pair.second;
965e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                int value_type = value_pair.first;
966e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                std::string option = option_pair.first;
967e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                std::string value = value_pair.second;
968e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                if (option.compare ("<argument>") == 0)
969e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    result_str.Printf (" %s", value.c_str());
970e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                else
971e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                {
972e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    result_str.Printf (" %s", option.c_str());
973e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    if (value_type != optional_argument)
974e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        result_str.Printf (" ");
975e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    if (value.compare ("<no_argument>") != 0)
976e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    {
977e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        int index = GetOptionArgumentPosition (value.c_str());
978e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        if (index == 0)
979e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result_str.Printf ("%s", value.c_str());
980e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        else if (index >= cmd_args.GetArgumentCount())
981e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        {
982e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
983e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result.AppendErrorWithFormat
984e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            ("Not enough arguments provided; you need at least %d arguments to use this alias.\n",
985e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                             index);
986e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result.SetStatus (eReturnStatusFailed);
987e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            return;
988e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        }
989e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        else
990e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        {
991e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            size_t strpos = raw_input_string.find (cmd_args.GetArgumentAtIndex (index));
992e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            if (strpos != std::string::npos)
993e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                raw_input_string = raw_input_string.erase (strpos,
994e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                                                          strlen (cmd_args.GetArgumentAtIndex (index)));
995e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result_str.Printf ("%s", cmd_args.GetArgumentAtIndex (index));
996e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        }
997e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    }
998e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                }
999e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1000e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1001e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1002e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        alias_result = result_str.GetData();
1003e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
1004e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice}
1005e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1006f5c0c72346eb8137107dbee95b12efb700117c13Greg ClaytonError
1007f5c0c72346eb8137107dbee95b12efb700117c13Greg ClaytonCommandInterpreter::PreprocessCommand (std::string &command)
1008f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton{
1009f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // The command preprocessor needs to do things to the command
1010f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // line before any parsing of arguments or anything else is done.
1011f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // The only current stuff that gets proprocessed is anyting enclosed
1012f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // in backtick ('`') characters is evaluated as an expression and
1013f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // the result of the expression must be a scalar that can be substituted
1014f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // into the command. An example would be:
1015f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // (lldb) memory read `$rsp + 20`
1016f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    Error error; // Error for any expressions that might not evaluate
1017f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    size_t start_backtick;
1018f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    size_t pos = 0;
1019f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    while ((start_backtick = command.find ('`', pos)) != std::string::npos)
1020f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    {
1021f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        if (start_backtick > 0 && command[start_backtick-1] == '\\')
1022f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        {
1023f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            // The backtick was preceeded by a '\' character, remove the slash
1024f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            // and don't treat the backtick as the start of an expression
1025f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            command.erase(start_backtick-1, 1);
1026f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            // No need to add one to start_backtick since we just deleted a char
1027f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            pos = start_backtick;
1028f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        }
1029f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        else
1030f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        {
1031f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            const size_t expr_content_start = start_backtick + 1;
1032f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            const size_t end_backtick = command.find ('`', expr_content_start);
1033f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            if (end_backtick == std::string::npos)
1034f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                return error;
1035f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            else if (end_backtick == expr_content_start)
1036f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            {
1037f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                // Empty expression (two backticks in a row)
1038f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                command.erase (start_backtick, 2);
1039f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            }
1040f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            else
1041f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            {
1042f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                std::string expr_str (command, expr_content_start, end_backtick - expr_content_start);
1043f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1044f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                Target *target = m_exe_ctx.GetTargetPtr();
1045f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                if (target)
1046f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                {
1047f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    const bool unwind_on_error = true;
1048f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    const bool keep_in_memory = false;
1049f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    ValueObjectSP expr_result_valobj_sp;
1050f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    ExecutionResults expr_result = target->EvaluateExpression (expr_str.c_str(),
1051f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                                               m_exe_ctx.GetFramePtr(),
1052f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                                               eExecutionPolicyOnlyWhenNeeded,
1053f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                                               unwind_on_error, keep_in_memory,
1054f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                                               eNoDynamicValues,
1055f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                                                               expr_result_valobj_sp);
1056f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    if (expr_result == eExecutionCompleted)
1057f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    {
1058f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        Scalar scalar;
1059f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        if (expr_result_valobj_sp->ResolveValue (scalar))
1060f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        {
1061f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            command.erase (start_backtick, end_backtick - start_backtick + 1);
1062f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            StreamString value_strm;
1063f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            const bool show_type = false;
1064f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            scalar.GetValue (&value_strm, show_type);
1065f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            size_t value_string_size = value_strm.GetSize();
1066f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            if (value_string_size)
1067f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            {
1068f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                command.insert (start_backtick, value_strm.GetData(), value_string_size);
1069f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                pos = start_backtick + value_string_size;
1070f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                continue;
1071f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            }
1072f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            else
1073f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            {
1074f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                error.SetErrorStringWithFormat("expression value didn't result in a scalar value for the expression '%s'", expr_str.c_str());
1075f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            }
1076f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        }
1077f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        else
1078f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        {
1079f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            error.SetErrorStringWithFormat("expression value didn't result in a scalar value for the expression '%s'", expr_str.c_str());
1080f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        }
1081f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    }
1082f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    else
1083f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    {
1084f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        if (expr_result_valobj_sp)
1085f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            error = expr_result_valobj_sp->GetError();
1086f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        if (error.Success())
1087f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        {
1088f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1089f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            switch (expr_result)
1090f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            {
1091f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionSetupError:
1092f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression setup error for the expression '%s'", expr_str.c_str());
1093f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1094f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionCompleted:
1095f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1096f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionDiscarded:
1097f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression discarded for the expression '%s'", expr_str.c_str());
1098f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1099f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionInterrupted:
1100f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression interrupted for the expression '%s'", expr_str.c_str());
1101f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1102f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionTimedOut:
1103f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression timed out for the expression '%s'", expr_str.c_str());
1104f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1105f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            }
1106f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        }
1107f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    }
1108f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                }
1109f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            }
1110f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            if (error.Fail())
1111f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                break;
1112f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        }
1113f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    }
1114f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    return error;
1115f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton}
1116f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1117f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1118e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Ticebool
1119e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline TiceCommandInterpreter::HandleCommand (const char *command_line,
1120e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                   bool add_to_history,
1121e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                   CommandReturnObject &result,
1122949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                   ExecutionContext *override_context,
11238bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                   bool repeat_on_empty_command,
11248bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                   bool no_context_switching)
1125949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1126e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice{
1127949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1128e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool done = false;
1129e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    CommandObject *cmd_obj = NULL;
1130e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    std::string next_word;
1131e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool wants_raw_input = false;
1132e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    std::string command_string (command_line);
11336247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    std::string original_command_string (command_line);
1134e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1135e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    LogSP log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_COMMANDS));
1136e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    Host::SetCrashDescriptionWithFormat ("HandleCommand(command = \"%s\")", command_line);
1137e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton
1138e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    // Make a scoped cleanup object that will clear the crash description string
1139e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    // on exit of this function.
11401a102087f54079c25c8827afac6153a44ca535daEnrico Granata    lldb_utility::CleanUp <const char *> crash_description_cleanup(NULL, Host::SetCrashDescription);
1141e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton
1142e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (log)
1143e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("Processing command: %s", command_line);
114424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1145abab14b9b6021781a8a6aef258ebfb7e617ba3e2Jim Ingham    Timer scoped_timer (__PRETTY_FUNCTION__, "Handling command: %s.", command_line);
1146abab14b9b6021781a8a6aef258ebfb7e617ba3e2Jim Ingham
11478bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen    if (!no_context_switching)
11488bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen        UpdateExecutionContext (override_context);
114924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1150949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    bool empty_command = false;
1151949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    bool comment_command = false;
1152949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (command_string.empty())
1153949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        empty_command = true;
1154949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    else
115524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1156949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        const char *k_space_characters = "\t\n\v\f\r ";
1157949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1158949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        size_t non_space = command_string.find_first_not_of (k_space_characters);
1159949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // Check for empty line or comment line (lines whose first
1160949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // non-space character is the comment character for this interpreter)
1161949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (non_space == std::string::npos)
1162949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            empty_command = true;
1163949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        else if (command_string[non_space] == m_comment_char)
1164949d5acde6684b5824a26034457410cdf3823dfeJim Ingham             comment_command = true;
11656247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        else if (command_string[non_space] == m_repeat_char)
11666247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        {
11676247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            const char *history_string = FindHistoryString (command_string.c_str() + non_space);
11686247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            if (history_string == NULL)
11696247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            {
11706247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                result.AppendErrorWithFormat ("Could not find entry: %s in history", command_string.c_str());
11716247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                result.SetStatus(eReturnStatusFailed);
11726247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                return false;
11736247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            }
11746247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            add_to_history = false;
11756247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            command_string = history_string;
11766247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            original_command_string = history_string;
11776247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        }
1178949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
1179949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1180949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (empty_command)
1181949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
1182949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (repeat_on_empty_command)
118324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1184949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            if (m_command_history.empty())
11855d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham            {
1186949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.AppendError ("empty command");
1187949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.SetStatus(eReturnStatusFailed);
11885d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham                return false;
11895d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham            }
1190949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            else
1191949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
1192949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                command_line = m_repeat_command.c_str();
1193949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                command_string = command_line;
11946247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                original_command_string = command_line;
1195949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                if (m_repeat_command.empty())
1196949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                {
1197949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    result.AppendErrorWithFormat("No auto repeat.\n");
1198949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    result.SetStatus (eReturnStatusFailed);
1199949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    return false;
1200949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                }
1201949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
1202949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            add_to_history = false;
1203949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
1204949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        else
1205949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
1206949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.SetStatus (eReturnStatusSuccessFinishNoResult);
1207949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            return true;
120824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1209949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
1210949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    else if (comment_command)
1211949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
1212949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        result.SetStatus (eReturnStatusSuccessFinishNoResult);
1213949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        return true;
121424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1215649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice
1216f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1217f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    Error error (PreprocessCommand (command_string));
1218f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1219f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    if (error.Fail())
1220f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    {
1221f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        result.AppendError (error.AsCString());
1222f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        result.SetStatus(eReturnStatusFailed);
1223f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        return false;
1224f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    }
1225e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Phase 1.
1226e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1227e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Before we do ANY kind of argument processing, etc. we need to figure out what the real/final command object
1228e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // is for the specified command, and whether or not it wants raw input.  This gets complicated by the fact that
1229e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // the user could have specified an alias, and in translating the alias there may also be command options and/or
1230e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // even data (including raw text strings) that need to be found and inserted into the command line as part of
1231e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // the translation.  So this first step is plain look-up & replacement, resulting in three things:  1). the command
12325d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // object whose Execute method will actually be called; 2). a revised command string, with all substitutions &
1233e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // replacements taken care of; 3). whether or not the Execute function wants raw input or not.
1234e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1235e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    StreamString revised_command_line;
1236ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice    size_t actual_cmd_name_len = 0;
1237e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    while (!done)
123824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1239649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice        bool was_quoted = false;
1240649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice        char quote_char = '\0';
1241649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice        StripFirstWord (command_string, next_word, was_quoted, quote_char);
1242e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (!cmd_obj && AliasExists (next_word.c_str()))
124324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1244e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            std::string alias_result;
1245e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            BuildAliasResult (next_word.c_str(), command_string, alias_result, cmd_obj, result);
1246e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            revised_command_line.Printf ("%s", alias_result.c_str());
1247e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (cmd_obj)
124856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            {
1249e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                wants_raw_input = cmd_obj->WantsRawCommandString ();
125056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                actual_cmd_name_len = strlen (cmd_obj->GetCommandName());
125156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            }
1252e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1253e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else if (!cmd_obj)
1254e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1255e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            cmd_obj = GetCommandObject (next_word.c_str());
1256e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (cmd_obj)
125724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
1258ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                actual_cmd_name_len += next_word.length();
1259e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                revised_command_line.Printf ("%s", next_word.c_str());
1260e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                wants_raw_input = cmd_obj->WantsRawCommandString ();
1261e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1262e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
1263e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
1264e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                revised_command_line.Printf ("%s", next_word.c_str());
1265e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1266e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1267e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else if (cmd_obj->IsMultiwordObject ())
1268e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1269e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            CommandObject *sub_cmd_obj = ((CommandObjectMultiword *) cmd_obj)->GetSubcommandObject (next_word.c_str());
1270e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (sub_cmd_obj)
1271e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
1272ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                actual_cmd_name_len += next_word.length() + 1;
1273e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                revised_command_line.Printf (" %s", next_word.c_str());
1274e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                cmd_obj = sub_cmd_obj;
1275e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                wants_raw_input = cmd_obj->WantsRawCommandString ();
1276e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1277e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
1278e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
1279649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                if (was_quoted)
1280649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                {
1281649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    if (quote_char == '"')
1282649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                        revised_command_line.Printf (" \"%s\"", next_word.c_str());
1283649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    else
1284649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                        revised_command_line.Printf (" '%s'", next_word.c_str());
1285649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                }
1286649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                else
1287649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    revised_command_line.Printf (" %s", next_word.c_str());
1288e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                done = true;
1289e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1290e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1291e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
1292e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1293649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            if (was_quoted)
1294649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
1295649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                if (quote_char == '"')
1296649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    revised_command_line.Printf (" \"%s\"", next_word.c_str());
1297649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                else
1298649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                    revised_command_line.Printf (" '%s'", next_word.c_str());
1299649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
1300649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            else
1301649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                revised_command_line.Printf (" %s", next_word.c_str());
1302e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            done = true;
1303e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1304e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1305e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (cmd_obj == NULL)
1306e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1307e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendErrorWithFormat ("'%s' is not a valid command.\n", next_word.c_str());
1308e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.SetStatus (eReturnStatusFailed);
1309e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            return false;
1310e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1311e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1312e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        next_word.erase ();
1313e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (command_string.length() == 0)
1314e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            done = true;
131544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
1316e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
131724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1318e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (command_string.size() > 0)
1319e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        revised_command_line.Printf (" %s", command_string.c_str());
13205d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham
1321e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // End of Phase 1.
1322e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // At this point cmd_obj should contain the CommandObject whose Execute method will be called, if the command
1323e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // specified was valid; revised_command_line contains the complete command line (including command name(s)),
1324e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // fully translated with all substitutions & translations taken care of (still in raw text format); and
1325e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // wants_raw_input specifies whether the Execute method expects raw input or not.
13265d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham
1327e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1328e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (log)
1329e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1330e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("HandleCommand, cmd_obj : '%s'", cmd_obj ? cmd_obj->GetCommandName() : "<not found>");
1331e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("HandleCommand, revised_command_line: '%s'", revised_command_line.GetData());
1332e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("HandleCommand, wants_raw_input:'%s'", wants_raw_input ? "True" : "False");
1333e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
133424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1335e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Phase 2.
1336e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Take care of things like setting up the history command & calling the appropriate Execute method on the
1337e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // CommandObject, with the appropriate arguments.
1338e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1339e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (cmd_obj != NULL)
1340e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1341e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (add_to_history)
1342e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1343e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            Args command_args (revised_command_line.GetData());
1344e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            const char *repeat_command = cmd_obj->GetRepeatCommand(command_args, 0);
1345e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (repeat_command != NULL)
1346e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                m_repeat_command.assign(repeat_command);
1347e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
13486247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                m_repeat_command.assign(original_command_string.c_str());
1349e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
13506247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            // Don't keep pushing the same command onto the history...
13516247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            if (m_command_history.size() == 0 || m_command_history.back() != original_command_string)
13526247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                m_command_history.push_back (original_command_string);
1353e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1354e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1355e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        command_string = revised_command_line.GetData();
1356e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        std::string command_name (cmd_obj->GetCommandName());
1357ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice        std::string remainder;
1358ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice        if (actual_cmd_name_len < command_string.length())
1359ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice            remainder = command_string.substr (actual_cmd_name_len);  // Note: 'actual_cmd_name_len' may be considerably shorter
1360ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                                                           // than cmd_obj->GetCommandName(), because name completion
1361ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                                                           // allows users to enter short versions of the names,
1362ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                                                           // e.g. 'br s' for 'breakpoint set'.
1363e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1364e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // Remove any initial spaces
1365e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        std::string white_space (" \t\v");
1366e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        size_t pos = remainder.find_first_not_of (white_space);
1367e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (pos != 0 && pos != std::string::npos)
136891c9dcfd3ff3c3b13276d4ce8ac0488e49721105Greg Clayton            remainder.erase(0, pos);
1369e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1370e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (log)
137124c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda            log->Printf ("HandleCommand, command line after removing command name(s): '%s'", remainder.c_str());
1372e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
137324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1374e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (wants_raw_input)
1375e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            cmd_obj->ExecuteRawCommandString (remainder.c_str(), result);
1376e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
1377e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1378e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            Args cmd_args (remainder.c_str());
1379e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            cmd_obj->ExecuteWithOptions (cmd_args, result);
1380e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1381e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
1382e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    else
1383e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1384e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // We didn't find the first command object, so complete the first argument.
1385e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        Args command_args (revised_command_line.GetData());
1386e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        StringList matches;
1387e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        int num_matches;
1388e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        int cursor_index = 0;
1389e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        int cursor_char_position = strlen (command_args.GetArgumentAtIndex(0));
1390e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        bool word_complete;
1391e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        num_matches = HandleCompletionMatches (command_args,
1392e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               cursor_index,
1393e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               cursor_char_position,
1394e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               0,
1395e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               -1,
1396e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               word_complete,
1397e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               matches);
1398e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1399e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (num_matches > 0)
1400e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1401e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            std::string error_msg;
1402e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.assign ("ambiguous command '");
1403e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append(command_args.GetArgumentAtIndex(0));
1404e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append ("'.");
1405e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1406e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append (" Possible completions:");
1407e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            for (int i = 0; i < num_matches; i++)
1408e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
1409e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                error_msg.append ("\n\t");
1410e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                error_msg.append (matches.GetStringAtIndex (i));
141124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
1412e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append ("\n");
1413e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendRawError (error_msg.c_str(), error_msg.size());
141424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1415e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
1416e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendErrorWithFormat ("Unrecognized command '%s'.\n", command_args.GetArgumentAtIndex (0));
1417e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1418e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        result.SetStatus (eReturnStatusFailed);
141924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1420e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
142124c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda    if (log)
142224c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda      log->Printf ("HandleCommand, command %s", (result.Succeeded() ? "succeeded" : "did not succeed"));
142324c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda
142424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result.Succeeded();
142524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
142624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
142724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
142824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HandleCompletionMatches (Args &parsed_line,
142924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int &cursor_index,
143024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int &cursor_char_position,
143124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int match_start_point,
143224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int max_return_elements,
1433802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                             bool &word_complete,
143424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             StringList &matches)
143524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
143624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int num_command_matches = 0;
143724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool look_for_subcommand = false;
1438802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham
1439802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    // For any of the command completions a unique match will be a complete word.
1440802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    word_complete = true;
144124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cursor_index == -1)
144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
144424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We got nothing on the command line, so return the list of commands
1445d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        bool include_aliases = true;
144624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_command_matches = GetCommandNamesMatchingPartialString ("", include_aliases, matches);
144724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
144824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (cursor_index == 0)
144924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
145024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The cursor is in the first argument, so just do a lookup in the dictionary.
1451d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        CommandObject *cmd_obj = GetCommandObject (parsed_line.GetArgumentAtIndex(0), &matches);
145224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_command_matches = matches.GetSize();
145324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_command_matches == 1
145524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && cmd_obj && cmd_obj->IsMultiwordObject()
145624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && matches.GetStringAtIndex(0) != NULL
145724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && strcmp (parsed_line.GetArgumentAtIndex(0), matches.GetStringAtIndex(0)) == 0)
145824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
145924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            look_for_subcommand = true;
146024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_command_matches = 0;
146124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            matches.DeleteStringAtIndex(0);
146224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            parsed_line.AppendArgument ("");
146324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_index++;
146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_char_position = 0;
146524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
146724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
146824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cursor_index > 0 || look_for_subcommand)
146924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
147024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We are completing further on into a commands arguments, so find the command and tell it
147124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // to complete the command.
147224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // First see if there is a matching initial command:
1473d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        CommandObject *command_object = GetCommandObject (parsed_line.GetArgumentAtIndex(0));
147424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (command_object == NULL)
147524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
147624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
147724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
147824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
147924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
148024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            parsed_line.Shift();
148124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_index--;
1482238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            num_command_matches = command_object->HandleCompletion (parsed_line,
148363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                    cursor_index,
148463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                    cursor_char_position,
148563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                    match_start_point,
1486802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                                    max_return_elements,
1487802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                                    word_complete,
148824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    matches);
148924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
149024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
149124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_command_matches;
149324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
149524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
149624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
149724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HandleCompletion (const char *current_line,
149824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      const char *cursor,
149924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      const char *last_char,
150024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      int match_start_point,
150124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      int max_return_elements,
150224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      StringList &matches)
150324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
150424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We parse the argument up to the cursor, so the last argument in parsed_line is
150524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the one containing the cursor, and the cursor is after the last character.
150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args parsed_line(current_line, last_char - current_line);
150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args partial_parsed_line(current_line, cursor - current_line);
150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15106247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    // Don't complete comments, and if the line we are completing is just the history repeat character,
15116247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    // substitute the appropriate history line.
15126247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    const char *first_arg = parsed_line.GetArgumentAtIndex(0);
15136247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    if (first_arg)
15146247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    {
15156247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (first_arg[0] == m_comment_char)
15166247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return 0;
15176247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        else if (first_arg[0] == m_repeat_char)
15186247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        {
15196247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            const char *history_string = FindHistoryString (first_arg);
15206247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            if (history_string != NULL)
15216247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            {
15226247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                matches.Clear();
15236247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                matches.InsertStringAtIndex(0, history_string);
15246247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                return -2;
15256247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            }
15266247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            else
15276247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                return 0;
15286247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
15296247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        }
15306247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    }
15316247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
15326247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int num_args = partial_parsed_line.GetArgumentCount();
153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int cursor_index = partial_parsed_line.GetArgumentCount() - 1;
153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int cursor_char_position;
153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cursor_index == -1)
153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cursor_char_position = 0;
153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
154024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cursor_char_position = strlen (partial_parsed_line.GetArgumentAtIndex(cursor_index));
1541cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham
1542cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham    if (cursor > current_line && cursor[-1] == ' ')
1543cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham    {
1544cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // We are just after a space.  If we are in an argument, then we will continue
1545cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // parsing, but if we are between arguments, then we have to complete whatever the next
1546cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // element would be.
1547cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // We can distinguish the two cases because if we are in an argument (e.g. because the space is
1548cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // protected by a quote) then the space will also be in the parsed argument...
1549cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham
1550cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        const char *current_elem = partial_parsed_line.GetArgumentAtIndex(cursor_index);
1551cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        if (cursor_char_position == 0 || current_elem[cursor_char_position - 1] != ' ')
1552cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        {
1553cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham            parsed_line.InsertArgumentAtIndex(cursor_index + 1, "", '"');
1554cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham            cursor_index++;
1555cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham            cursor_char_position = 0;
1556cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        }
1557cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham    }
155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int num_command_matches;
156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    matches.Clear();
156224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
156324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Only max_return_elements == -1 is supported at present:
156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (max_return_elements == -1);
1565802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    bool word_complete;
156663094e0bb161580564954dee512955c1c79d3476Greg Clayton    num_command_matches = HandleCompletionMatches (parsed_line,
156763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   cursor_index,
156863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   cursor_char_position,
156963094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   match_start_point,
1570802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                   max_return_elements,
1571802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                   word_complete,
157263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   matches);
157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_command_matches <= 0)
157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return num_command_matches;
157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_args == 0)
157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
157924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we got an empty string, insert nothing.
158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.InsertStringAtIndex(0, "");
158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Now figure out if there is a common substring, and if so put that in element 0, otherwise
158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // put an empty string in element 0.
158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string command_partial_str;
158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (cursor_index >= 0)
1588e3663e8cd1fce64f73dd3740d65132a76ac97709Jim Ingham            command_partial_str.assign(parsed_line.GetArgumentAtIndex(cursor_index),
1589e3663e8cd1fce64f73dd3740d65132a76ac97709Jim Ingham                                       parsed_line.GetArgumentAtIndex(cursor_index) + cursor_char_position);
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string common_prefix;
159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.LongestCommonPrefix (common_prefix);
159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int partial_name_len = command_partial_str.size();
159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we matched a unique single command, add a space...
1596802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham        // Only do this if the completer told us this was a complete word, however...
1597802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham        if (num_command_matches == 1 && word_complete)
159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
159924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            char quote_char = parsed_line.GetArgumentQuoteCharAtIndex(cursor_index);
160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (quote_char != '\0')
160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                common_prefix.push_back(quote_char);
160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            common_prefix.push_back(' ');
160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        common_prefix.erase (0, partial_name_len);
160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.InsertStringAtIndex(0, common_prefix.c_str());
160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_command_matches;
160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::~CommandInterpreter ()
161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetPrompt ()
161824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16195bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    return m_debugger.GetPrompt();
162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
162124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
162224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
162324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::SetPrompt (const char *new_prompt)
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
16255bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    m_debugger.SetPrompt (new_prompt);
162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16285e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Inghamsize_t
16295892856b0cd6591194c669afab5bf9ac19c5b3a0Greg ClaytonCommandInterpreter::GetConfirmationInputReaderCallback
16305892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton(
16315892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    void *baton,
16325892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    InputReader &reader,
16335892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    lldb::InputReaderAction action,
16345892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    const char *bytes,
16355892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    size_t bytes_len
16365892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton)
16375e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham{
16385892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File &out_file = reader.GetDebugger().GetOutputFile();
16395e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    bool *response_ptr = (bool *) baton;
16405e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
16415e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    switch (action)
16425e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    {
16435e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderActivate:
16445892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        if (out_file.IsValid())
16455e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
16465e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            if (reader.GetPrompt())
164722a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice            {
16485892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                out_file.Printf ("%s", reader.GetPrompt());
16495892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                out_file.Flush ();
165022a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice            }
16515e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
16525e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
16535e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
16545e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderDeactivate:
16555e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
16565e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
16575e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderReactivate:
16585892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        if (out_file.IsValid() && reader.GetPrompt())
165922a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice        {
16605892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton            out_file.Printf ("%s", reader.GetPrompt());
16615892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton            out_file.Flush ();
166222a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice        }
16635e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
16644a348081030cdd2af758fddc869518357d9befd3Caroline Tice
16654a348081030cdd2af758fddc869518357d9befd3Caroline Tice    case eInputReaderAsynchronousOutputWritten:
16664a348081030cdd2af758fddc869518357d9befd3Caroline Tice        break;
16674a348081030cdd2af758fddc869518357d9befd3Caroline Tice
16685e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderGotToken:
16695e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        if (bytes_len == 0)
16705e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
16715e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            reader.SetIsDone(true);
16725e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
16735e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        else if (bytes[0] == 'y')
16745e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
16755e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            *response_ptr = true;
16765e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            reader.SetIsDone(true);
16775e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
16785e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        else if (bytes[0] == 'n')
16795e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
16805e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            *response_ptr = false;
16815e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            reader.SetIsDone(true);
16825e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
16835e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        else
16845e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
16855892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton            if (out_file.IsValid() && !reader.IsDone() && reader.GetPrompt())
16865e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            {
16875892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                out_file.Printf ("Please answer \"y\" or \"n\"\n%s", reader.GetPrompt());
16885892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                out_file.Flush ();
16895e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            }
16905e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
16915e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
16925e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
1693c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    case eInputReaderInterrupt:
1694c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    case eInputReaderEndOfFile:
1695c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        *response_ptr = false;  // Assume ^C or ^D means cancel the proposed action
1696c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        reader.SetIsDone (true);
1697c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        break;
1698c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
16995e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderDone:
17005e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
17015e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    }
17025e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
17035e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    return bytes_len;
17045e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
17055e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham}
17065e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
17075e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Inghambool
17085e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim InghamCommandInterpreter::Confirm (const char *message, bool default_answer)
17095e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham{
17109305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    // Check AutoConfirm first:
17119305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    if (m_debugger.GetAutoConfirm())
17129305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham        return default_answer;
17139305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham
17145e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    InputReaderSP reader_sp (new InputReader(GetDebugger()));
17155e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    bool response = default_answer;
17165e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    if (reader_sp)
17175e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    {
17185e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        std::string prompt(message);
17195e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        prompt.append(": [");
17205e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        if (default_answer)
17215e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            prompt.append ("Y/n] ");
17225e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        else
17235e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            prompt.append ("y/N] ");
17245e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
17255e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        Error err (reader_sp->Initialize (CommandInterpreter::GetConfirmationInputReaderCallback,
17265e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          &response,                    // baton
17275e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          eInputReaderGranularityLine,  // token size, to pass to callback function
17285e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          NULL,                         // end token
17295e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          prompt.c_str(),               // prompt
17305e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          true));                       // echo input
17315e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        if (err.Success())
17325e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
17335e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            GetDebugger().PushInputReader (reader_sp);
17345e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
17355e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        reader_sp->WaitOnReaderIsDone();
17365e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    }
17375e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    return response;
17385e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham}
17395e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
17405e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::CrossRegisterCommand (const char * dest_cmd, const char * object_type)
174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1744d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    CommandObjectSP cmd_obj_sp = GetCommandSPExact (dest_cmd, true);
174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cmd_obj_sp != NULL)
174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject *cmd_obj = cmd_obj_sp.get();
174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (cmd_obj->IsCrossRefObject ())
175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cmd_obj->AddObject (object_type);
175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerOptionArgVectorSP
175524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetAliasOptions (const char *alias_name)
175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgMap::iterator pos;
175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgVectorSP ret_val;
175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string alias (alias_name);
176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (HasAliasOptions())
176324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_alias_options.find (alias);
176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_alias_options.end())
176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          ret_val = pos->second;
176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ret_val;
177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
177224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
177324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::RemoveAliasOptions (const char *alias_name)
177424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
177524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgMap::iterator pos = m_alias_options.find(alias_name);
177624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_alias_options.end())
177724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
177824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_alias_options.erase (pos);
177924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
178024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
178124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
178324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::AddOrReplaceAliasOptions (const char *alias_name, OptionArgVectorSP &option_arg_vector_sp)
178424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
178524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_alias_options[alias_name] = option_arg_vector_sp;
178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
178724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
178924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasCommands ()
179024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
179124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_command_dict.empty());
179224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
179324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
179524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasAliases ()
179624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
179724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_alias_dict.empty());
179824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
180124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasUserCommands ()
180224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
180324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_user_dict.empty());
180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
180524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
180624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasAliasOptions ()
180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_alias_options.empty());
181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
181224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
1813bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline TiceCommandInterpreter::BuildAliasCommandArgs (CommandObject *alias_cmd_obj,
1814bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                                           const char *alias_name,
1815bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                                           Args &cmd_args,
181644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                                           std::string &raw_input_string,
1817bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                                           CommandReturnObject &result)
181824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
181924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgVectorSP option_arg_vector_sp = GetAliasOptions (alias_name);
182044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
182144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    bool wants_raw_input = alias_cmd_obj->WantsRawCommandString();
182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
182344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    // Make sure that the alias name is the 0th element in cmd_args
182444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    std::string alias_name_str = alias_name;
182544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    if (alias_name_str.compare (cmd_args.GetArgumentAtIndex(0)) != 0)
182644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        cmd_args.Unshift (alias_name);
182744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
182844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    Args new_args (alias_cmd_obj->GetCommandName());
182944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    if (new_args.GetArgumentCount() == 2)
183044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        new_args.Shift();
183144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
183224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (option_arg_vector_sp.get())
183324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
183444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        if (wants_raw_input)
183544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        {
183644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            // We have a command that both has command options and takes raw input.  Make *sure* it has a
183744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            // " -- " in the right place in the raw_input_string.
183844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            size_t pos = raw_input_string.find(" -- ");
183944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            if (pos == std::string::npos)
184044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            {
184144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                // None found; assume it goes at the beginning of the raw input string
184244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                raw_input_string.insert (0, " -- ");
184344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            }
184444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        }
184524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
184624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
184724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int old_size = cmd_args.GetArgumentCount();
1848bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice        std::vector<bool> used (old_size + 1, false);
1849bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice
1850bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice        used[0] = true;
185124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
185224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (int i = 0; i < option_arg_vector->size(); ++i)
185324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
185424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            OptionArgPair option_pair = (*option_arg_vector)[i];
185544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            OptionArgValue value_pair = option_pair.second;
185644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            int value_type = value_pair.first;
185724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string option = option_pair.first;
185844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            std::string value = value_pair.second;
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (option.compare ("<argument>") == 0)
186044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            {
186144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                if (!wants_raw_input
186244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    || (value.compare("--") != 0)) // Since we inserted this above, make sure we don't insert it twice
186344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    new_args.AppendArgument (value.c_str());
186444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            }
186524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
186624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
186744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                if (value_type != optional_argument)
186844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    new_args.AppendArgument (option.c_str());
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (value.compare ("<no-argument>") != 0)
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    int index = GetOptionArgumentPosition (value.c_str());
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (index == 0)
187344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    {
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // value was NOT a positional argument; must be a real value
187544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        if (value_type != optional_argument)
187644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (value.c_str());
187744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        else
187844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        {
187944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            char buffer[255];
188044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            ::snprintf (buffer, sizeof (buffer), "%s%s", option.c_str(), value.c_str());
188144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (buffer);
188244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        }
188344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
188444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    }
188524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else if (index >= cmd_args.GetArgumentCount())
188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendErrorWithFormat
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    ("Not enough arguments provided; you need at least %d arguments to use this alias.\n",
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     index);
189024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus (eReturnStatusFailed);
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return;
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
189544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        // Find and remove cmd_args.GetArgumentAtIndex(i) from raw_input_string
189644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        size_t strpos = raw_input_string.find (cmd_args.GetArgumentAtIndex (index));
189744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        if (strpos != std::string::npos)
189844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        {
189944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            raw_input_string = raw_input_string.erase (strpos, strlen (cmd_args.GetArgumentAtIndex (index)));
190044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        }
190144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
190244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        if (value_type != optional_argument)
190344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (cmd_args.GetArgumentAtIndex (index));
190444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        else
190544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        {
190644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            char buffer[255];
190744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            ::snprintf (buffer, sizeof(buffer), "%s%s", option.c_str(),
190844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                                        cmd_args.GetArgumentAtIndex (index));
190944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (buffer);
191044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        }
1911bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                        used[index] = true;
191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (int j = 0; j < cmd_args.GetArgumentCount(); ++j)
191824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
191944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            if (!used[j] && !wants_raw_input)
192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                new_args.AppendArgument (cmd_args.GetArgumentAtIndex (j));
192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cmd_args.Clear();
192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cmd_args.SetArguments (new_args.GetArgumentCount(), (const char **) new_args.GetArgumentVector());
192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
192724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
192824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus (eReturnStatusSuccessFinishNoResult);
192944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        // This alias was not created with any options; nothing further needs to be done, unless it is a command that
193044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        // wants raw input, in which case we need to clear the rest of the data from cmd_args, since its in the raw
193144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        // input string.
193244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        if (wants_raw_input)
193344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        {
193444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            cmd_args.Clear();
193544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            cmd_args.SetArguments (new_args.GetArgumentCount(), (const char **) new_args.GetArgumentVector());
193644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        }
193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    result.SetStatus (eReturnStatusSuccessFinishNoResult);
194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return;
194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetOptionArgumentPosition (const char *in_string)
194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int position = 0;   // Any string that isn't an argument position, i.e. '%' followed by an integer, gets a position
194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // of zero.
195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *cptr = (char *) in_string;
195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Does it start with '%'
195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cptr[0] == '%')
195524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
195624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ++cptr;
195724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Is the rest of it entirely digits?
195924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (isdigit (cptr[0]))
196024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
196124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *start = cptr;
196224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            while (isdigit (cptr[0]))
196324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++cptr;
196424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
196524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We've gotten to the end of the digits; are we at the end of the string?
196624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cptr[0] == '\0')
196724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                position = atoi (start);
196824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
196924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
197024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return position;
197224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
197324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
197424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
197524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::SourceInitFile (bool in_cwd, CommandReturnObject &result)
197624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
1977574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    FileSpec init_file;
1978d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton    if (in_cwd)
1979574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    {
1980d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // In the current working directory we don't load any program specific
1981d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // .lldbinit files, we only look for a "./.lldbinit" file.
1982d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        if (m_skip_lldbinit_files)
1983d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            return;
1984d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
1985d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        init_file.SetFile ("./.lldbinit", true);
1986574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    }
1987d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton    else
1988574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    {
1989d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // If we aren't looking in the current working directory we are looking
1990d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // in the home directory. We will first see if there is an application
1991d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // specific ".lldbinit" file whose name is "~/.lldbinit" followed by a
1992d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // "-" and the name of the program. If this file doesn't exist, we fall
1993d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // back to just the "~/.lldbinit" file. We also obey any requests to not
1994d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // load the init files.
1995d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        const char *init_file_path = "~/.lldbinit";
1996d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
1997d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        if (m_skip_app_init_files == false)
1998d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        {
1999d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            FileSpec program_file_spec (Host::GetProgramFileSpec());
2000d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            const char *program_name = program_file_spec.GetFilename().AsCString();
2001574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham
2002d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            if (program_name)
2003d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            {
2004d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                char program_init_file_name[PATH_MAX];
2005d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                ::snprintf (program_init_file_name, sizeof(program_init_file_name), "%s-%s", init_file_path, program_name);
2006d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                init_file.SetFile (program_init_file_name, true);
2007d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                if (!init_file.Exists())
2008d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                    init_file.Clear();
2009d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            }
2010d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        }
2011d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
2012d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        if (!init_file && !m_skip_lldbinit_files)
2013d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton			init_file.SetFile (init_file_path, true);
2014d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton    }
2015d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
201624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If the file exists, tell HandleCommand to 'source' it; this will do the actual broadcasting
201724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // of the commands back to any appropriate listener (see CommandObjectSource::Execute for more details).
201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (init_file.Exists())
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2021949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        ExecutionContext *exe_ctx = NULL;  // We don't have any context yet.
2022949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool stop_on_continue = true;
2023949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool stop_on_error    = false;
2024949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool echo_commands    = false;
2025949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool print_results    = false;
2026949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2027949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        HandleCommandsFromFile (init_file, exe_ctx, stop_on_continue, stop_on_error, echo_commands, print_results, result);
202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // nothing to be done if the file doesn't exist
203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus(eReturnStatusSuccessFinishNoResult);
203324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
203424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2036b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformSP
2037b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonCommandInterpreter::GetPlatform (bool prefer_target_platform)
2038b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
2039b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    PlatformSP platform_sp;
2040567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (prefer_target_platform)
2041567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
2042567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Target *target = m_exe_ctx.GetTargetPtr();
2043567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (target)
2044567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            platform_sp = target->GetPlatform();
2045567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
2046b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2047b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (!platform_sp)
2048b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        platform_sp = m_debugger.GetPlatformList().GetSelectedPlatform();
2049b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return platform_sp;
2050b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
2051b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2052949d5acde6684b5824a26034457410cdf3823dfeJim Inghamvoid
2053a4fede31869663e889d67ace3d07dc5d3e4ea2b8Jim InghamCommandInterpreter::HandleCommands (const StringList &commands,
2054949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    ExecutionContext *override_context,
2055949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool stop_on_continue,
2056949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool stop_on_error,
2057949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool echo_commands,
2058949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool print_results,
2059949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    CommandReturnObject &result)
2060949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{
2061949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    size_t num_lines = commands.GetSize();
2062949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2063949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // If we are going to continue past a "continue" then we need to run the commands synchronously.
2064949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // Make sure you reset this value anywhere you return from the function.
2065949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2066949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    bool old_async_execution = m_debugger.GetAsyncExecution();
2067949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2068949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // If we've been given an execution context, set it at the start, but don't keep resetting it or we will
2069949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // cause series of commands that change the context, then do an operation that relies on that context to fail.
2070949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2071949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (override_context != NULL)
2072b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        UpdateExecutionContext (override_context);
2073949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2074949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (!stop_on_continue)
2075949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2076949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        m_debugger.SetAsyncExecution (false);
2077949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2078949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2079949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    for (int idx = 0; idx < num_lines; idx++)
2080949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2081949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        const char *cmd = commands.GetStringAtIndex(idx);
2082949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (cmd[0] == '\0')
2083949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            continue;
2084949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2085949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (echo_commands)
2086949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2087949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.AppendMessageWithFormat ("%s %s\n",
2088949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                             GetPrompt(),
2089949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                             cmd);
2090949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2091949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2092aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton        CommandReturnObject tmp_result;
20938bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen        // If override_context is not NULL, pass no_context_switching = true for
20948bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen        // HandleCommand() since we updated our context already.
20958bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen        bool success = HandleCommand(cmd, false, tmp_result,
20968bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                     NULL, /* override_context */
20978bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                     true, /* repeat_on_empty_command */
20988bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                     override_context != NULL /* no_context_switching */);
2099949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2100949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (print_results)
2101949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2102949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            if (tmp_result.Succeeded())
21032e8cb8a7342a2ea672792067d712a794e215a3a7Jim Ingham              result.AppendMessageWithFormat("%s", tmp_result.GetOutputData());
2104949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2105949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2106949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (!success || !tmp_result.Succeeded())
2107949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2108949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            if (stop_on_error)
2109949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
2110949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.AppendErrorWithFormat("Aborting reading of commands after command #%d: '%s' failed.\n",
2111949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                         idx, cmd);
2112949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.SetStatus (eReturnStatusFailed);
2113949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                m_debugger.SetAsyncExecution (old_async_execution);
2114949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                return;
2115949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
2116949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            else if (print_results)
2117949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
2118949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.AppendMessageWithFormat ("Command #%d '%s' failed with error: %s.\n",
2119949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                idx + 1,
2120949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                cmd,
21212e8cb8a7342a2ea672792067d712a794e215a3a7Jim Ingham                                                tmp_result.GetErrorData());
2122949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
2123949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2124949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
21254a348081030cdd2af758fddc869518357d9befd3Caroline Tice        if (result.GetImmediateOutputStream())
21264a348081030cdd2af758fddc869518357d9befd3Caroline Tice            result.GetImmediateOutputStream()->Flush();
21274a348081030cdd2af758fddc869518357d9befd3Caroline Tice
21284a348081030cdd2af758fddc869518357d9befd3Caroline Tice        if (result.GetImmediateErrorStream())
21294a348081030cdd2af758fddc869518357d9befd3Caroline Tice            result.GetImmediateErrorStream()->Flush();
21304a348081030cdd2af758fddc869518357d9befd3Caroline Tice
2131949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // N.B. Can't depend on DidChangeProcessState, because the state coming into the command execution
2132949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // could be running (for instance in Breakpoint Commands.
2133949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // So we check the return value to see if it is has running in it.
2134949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if ((tmp_result.GetStatus() == eReturnStatusSuccessContinuingNoResult)
2135949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                || (tmp_result.GetStatus() == eReturnStatusSuccessContinuingResult))
2136949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2137949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            if (stop_on_continue)
2138949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
2139949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                // If we caused the target to proceed, and we're going to stop in that case, set the
2140949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                // status in our real result before returning.  This is an error if the continue was not the
2141949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                // last command in the set of commands to be run.
2142949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                if (idx != num_lines - 1)
2143949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    result.AppendErrorWithFormat("Aborting reading of commands after command #%d: '%s' continued the target.\n",
2144949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                 idx + 1, cmd);
2145949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                else
2146949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    result.AppendMessageWithFormat ("Command #%d '%s' continued the target.\n", idx + 1, cmd);
2147949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2148949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.SetStatus(tmp_result.GetStatus());
2149949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                m_debugger.SetAsyncExecution (old_async_execution);
2150949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2151949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                return;
2152949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
2153949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2154949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2155949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2156949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2157949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    result.SetStatus (eReturnStatusSuccessFinishResult);
2158949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    m_debugger.SetAsyncExecution (old_async_execution);
2159949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2160949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    return;
2161949d5acde6684b5824a26034457410cdf3823dfeJim Ingham}
2162949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2163949d5acde6684b5824a26034457410cdf3823dfeJim Inghamvoid
2164949d5acde6684b5824a26034457410cdf3823dfeJim InghamCommandInterpreter::HandleCommandsFromFile (FileSpec &cmd_file,
2165949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            ExecutionContext *context,
2166949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool stop_on_continue,
2167949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool stop_on_error,
2168949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool echo_command,
2169949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool print_result,
2170949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            CommandReturnObject &result)
2171949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{
2172949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (cmd_file.Exists())
2173949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2174949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool success;
2175949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        StringList commands;
2176949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        success = commands.ReadFileLines(cmd_file);
2177949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (!success)
2178949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2179949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.AppendErrorWithFormat ("Error reading commands from file: %s.\n", cmd_file.GetFilename().AsCString());
2180949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.SetStatus (eReturnStatusFailed);
2181949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            return;
2182949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2183949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        HandleCommands (commands, context, stop_on_continue, stop_on_error, echo_command, print_result, result);
2184949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2185949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    else
2186949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2187949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        result.AppendErrorWithFormat ("Error reading commands from file %s - file not found.\n",
2188949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                      cmd_file.GetFilename().AsCString());
2189949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        result.SetStatus (eReturnStatusFailed);
2190949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        return;
2191949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2192949d5acde6684b5824a26034457410cdf3823dfeJim Ingham}
2193949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScriptInterpreter *
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetScriptInterpreter ()
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
21970aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    if (m_script_interpreter_ap.get() != NULL)
21980aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice        return m_script_interpreter_ap.get();
219963094e0bb161580564954dee512955c1c79d3476Greg Clayton
22000aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    lldb::ScriptLanguage script_lang = GetDebugger().GetScriptLanguage();
22010aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    switch (script_lang)
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
22030aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice        case eScriptLanguageNone:
22040aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice            m_script_interpreter_ap.reset (new ScriptInterpreterNone (*this));
22050aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice            break;
22060aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice        case eScriptLanguagePython:
22070aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice            m_script_interpreter_ap.reset (new ScriptInterpreterPython (*this));
22080aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice            break;
22090aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice        default:
22100aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice            break;
22110aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    };
22120aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice
22130aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    return m_script_interpreter_ap.get();
221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetSynchronous ()
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_synchronous_execution;
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::SetSynchronous (bool value)
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2227d7a4eb073d08bf632154b74189e36a28726cefaaJohnny Chen    m_synchronous_execution  = value;
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::OutputFormattedHelpText (Stream &strm,
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             const char *word_text,
223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             const char *separator,
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             const char *help_text,
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             uint32_t max_word_len)
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2237238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    const uint32_t max_columns = m_debugger.GetTerminalWidth();
2238238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int indent_size = max_word_len + strlen (separator) + 2;
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.IndentMore (indent_size);
2242d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton
2243d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    StreamString text_strm;
2244d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    text_strm.Printf ("%-*s %s %s",  max_word_len, word_text, separator, help_text);
2245d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton
2246d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    size_t len = text_strm.GetSize();
2247d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    const char *text = text_strm.GetData();
224824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (text[len - 1] == '\n')
2249d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    {
2250d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        text_strm.EOL();
2251d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        len = text_strm.GetSize();
2252d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    }
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (len  < max_columns)
225524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
225624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Output it as a single line.
225724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        strm.Printf ("%s", text);
225824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
225924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
226024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
226124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We need to break it up into multiple lines.
226224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool first_line = true;
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int text_width;
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int start = 0;
226524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int end = start;
226624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int final_end = strlen (text);
226724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int sub_len;
226824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
226924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (end < final_end)
227024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
227124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (first_line)
227224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                text_width = max_columns - 1;
227324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
227424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                text_width = max_columns - indent_size - 1;
227524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Don't start the 'text' on a space, since we're already outputting the indentation.
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!first_line)
227824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
227924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while ((start < final_end) && (text[start] == ' '))
228024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                  start++;
228124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
228324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            end = start + text_width;
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end > final_end)
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                end = final_end;
228624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
228724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // If we're not at the end of the text, make sure we break the line on white space.
228924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while (end > start
229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       && text[end] != ' ' && text[end] != '\t' && text[end] != '\n')
229124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    end--;
229224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
229324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
229424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            sub_len = end - start;
229524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (start != 0)
229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              strm.EOL();
229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!first_line)
229824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                strm.Indent();
229924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                first_line = false;
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (start <= final_end);
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (start + sub_len <= final_end);
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sub_len > 0)
230424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                strm.Write (text + start, sub_len);
230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            start = end + 1;
230624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
230724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
230824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.EOL();
230924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.IndentLess(indent_size);
231024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
231124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
231224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
23131bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico GranataCommandInterpreter::OutputHelpText (Stream &strm,
23141bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    const char *word_text,
23151bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    const char *separator,
23161bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    const char *help_text,
23171bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    uint32_t max_word_len)
23181bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata{
23191bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    int indent_size = max_word_len + strlen (separator) + 2;
23201bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23211bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    strm.IndentMore (indent_size);
23221bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23231bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    StreamString text_strm;
23241bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    text_strm.Printf ("%-*s %s %s",  max_word_len, word_text, separator, help_text);
23251bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23261bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    const uint32_t max_columns = m_debugger.GetTerminalWidth();
23271bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    bool first_line = true;
23281bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23291bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    size_t len = text_strm.GetSize();
23301bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    const char *text = text_strm.GetData();
23311bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23321bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    uint32_t chars_left = max_columns;
23331bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23341bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    for (uint32_t i = 0; i < len; i++)
23351bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    {
23361bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        if ((text[i] == ' ' && ::strchr((text+i+1), ' ') && chars_left < ::strchr((text+i+1), ' ')-(text+i)) || text[i] == '\n')
23371bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        {
23381bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            first_line = false;
23391bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            chars_left = max_columns - indent_size;
23401bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            strm.EOL();
23411bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            strm.Indent();
23421bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        }
23431bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        else
23441bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        {
23451bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            strm.PutChar(text[i]);
23461bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            chars_left--;
23471bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        }
23481bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23491bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    }
23501bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23511bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    strm.EOL();
23521bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    strm.IndentLess(indent_size);
23531bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata}
23541bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
23551bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granatavoid
235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::AproposAllSubCommands (CommandObject *cmd_obj, const char *prefix, const char *search_word,
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                           StringList &commands_found, StringList &commands_help)
235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::const_iterator pos;
236024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap sub_cmd_dict = ((CommandObjectMultiword *) cmd_obj)->m_subcommand_dict;
236124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject *sub_cmd_obj;
236224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = sub_cmd_dict.begin(); pos != sub_cmd_dict.end(); ++pos)
236424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
236524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          const char * command_name = pos->first.c_str();
236624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          sub_cmd_obj = pos->second.get();
236724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          StreamString complete_command_name;
236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          complete_command_name.Printf ("%s %s", prefix, command_name);
237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2371238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton          if (sub_cmd_obj->HelpTextContainsWord (search_word))
237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          {
237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              commands_found.AppendString (complete_command_name.GetData());
237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              commands_help.AppendString (sub_cmd_obj->GetHelp());
237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          }
237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          if (sub_cmd_obj->IsMultiwordObject())
237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              AproposAllSubCommands (sub_cmd_obj, complete_command_name.GetData(), search_word, commands_found,
237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     commands_help);
238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::FindCommandsForApropos (const char *search_word, StringList &commands_found,
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                            StringList &commands_help)
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::const_iterator pos;
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (pos = m_command_dict.begin(); pos != m_command_dict.end(); ++pos)
239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *command_name = pos->first.c_str();
239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject *cmd_obj = pos->second.get();
239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2395238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        if (cmd_obj->HelpTextContainsWord (search_word))
239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            commands_found.AppendString (command_name);
239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            commands_help.AppendString (cmd_obj->GetHelp());
239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (cmd_obj->IsMultiwordObject())
240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          AproposAllSubCommands (cmd_obj, command_name, search_word, commands_found, commands_help);
240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2406b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2407b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2408b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid
2409b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonCommandInterpreter::UpdateExecutionContext (ExecutionContext *override_context)
2410b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
2411b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    m_exe_ctx.Clear();
2412b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2413b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (override_context != NULL)
2414b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
2415567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        m_exe_ctx = *override_context;
2416b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
2417b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
2418b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
2419b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        TargetSP target_sp (m_debugger.GetSelectedTarget());
2420b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        if (target_sp)
2421b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        {
2422567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            m_exe_ctx.SetTargetSP (target_sp);
2423567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            ProcessSP process_sp (target_sp->GetProcessSP());
2424567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            m_exe_ctx.SetProcessSP (process_sp);
2425567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            if (process_sp && process_sp->IsAlive() && !process_sp->IsRunning())
2426b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            {
2427567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                ThreadSP thread_sp (process_sp->GetThreadList().GetSelectedThread().get());
2428567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                if (thread_sp)
2429b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                {
2430567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    m_exe_ctx.SetThreadSP (thread_sp);
2431567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    StackFrameSP frame_sp (thread_sp->GetSelectedFrame());
2432567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    if (!frame_sp)
2433b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    {
2434567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        frame_sp = thread_sp->GetStackFrameAtIndex (0);
2435b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                        // If we didn't have a selected frame select one here.
2436567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        if (frame_sp)
2437567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                            thread_sp->SetSelectedFrame(frame_sp.get());
2438b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                    }
2439567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                    if (frame_sp)
2440567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton                        m_exe_ctx.SetFrameSP (frame_sp);
2441b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                }
2442b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton            }
2443b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        }
2444b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
2445b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
2446b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
24476247dbee41ec51e9a082df7e86269c0f47f28160Jim Inghamvoid
24486247dbee41ec51e9a082df7e86269c0f47f28160Jim InghamCommandInterpreter::DumpHistory (Stream &stream, uint32_t count) const
24496247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham{
24506247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    DumpHistory (stream, 0, count - 1);
24516247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham}
24526247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
24536247dbee41ec51e9a082df7e86269c0f47f28160Jim Inghamvoid
24546247dbee41ec51e9a082df7e86269c0f47f28160Jim InghamCommandInterpreter::DumpHistory (Stream &stream, uint32_t start, uint32_t end) const
24556247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham{
24566247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    size_t num_history_elements = m_command_history.size();
24576247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    if (start > num_history_elements)
24586247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        return;
24596247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    for (uint32_t i = start; i < num_history_elements && i <= end; i++)
24606247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    {
24616247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (!m_command_history[i].empty())
24626247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        {
24636247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            stream.Indent();
24646247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            stream.Printf ("%4d: %s\n", i, m_command_history[i].c_str());
24656247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        }
24666247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    }
24676247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham}
24686247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
24696247dbee41ec51e9a082df7e86269c0f47f28160Jim Inghamconst char *
24706247dbee41ec51e9a082df7e86269c0f47f28160Jim InghamCommandInterpreter::FindHistoryString (const char *input_str) const
24716247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham{
24726247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    if (input_str[0] != m_repeat_char)
24736247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        return NULL;
24746247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    if (input_str[1] == '-')
24756247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    {
24766247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        bool success;
24776247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        uint32_t idx = Args::StringToUInt32 (input_str+2, 0, 0, &success);
24786247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (!success)
24796247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return NULL;
24806247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (idx > m_command_history.size())
24816247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return NULL;
24826247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        idx = m_command_history.size() - idx;
24836247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        return m_command_history[idx].c_str();
24846247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
24856247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    }
24866247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    else if (input_str[1] == m_repeat_char)
24876247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    {
24886247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (m_command_history.empty())
24896247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return NULL;
24906247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        else
24916247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return m_command_history.back().c_str();
24926247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    }
24936247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    else
24946247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    {
24956247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        bool success;
24966247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        uint32_t idx = Args::StringToUInt32 (input_str+1, 0, 0, &success);
24976247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (!success)
24986247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return NULL;
24996247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (idx >= m_command_history.size())
25006247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return NULL;
25016247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        return m_command_history[idx].c_str();
25026247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    }
25036247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham}
2504