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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
13bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice#include <vector>
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <getopt.h>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
185c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "CommandObjectScript.h"
19921fac021ef9f7e5d32de359e67d5ad28fcccc65Peter Collingbourne#include "lldb/Interpreter/CommandObjectRegexCommand.h"
205c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton
21ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectApropos.h"
22ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectArgs.h"
23ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectBreakpoint.h"
24ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectDisassemble.h"
25ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectExpression.h"
26ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectFrame.h"
27ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectHelp.h"
28ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectLog.h"
29ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectMemory.h"
30b1888f24fa181489840b9acf193e224d125d0776Greg Clayton#include "../Commands/CommandObjectPlatform.h"
316d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata#include "../Commands/CommandObjectPlugin.h"
32ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectProcess.h"
33ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectQuit.h"
34ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectRegister.h"
35ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectSettings.h"
36ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectSource.h"
37767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "../Commands/CommandObjectCommands.h"
38ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectSyntax.h"
39ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectTarget.h"
40ccdb9ec8adf5b2899ac118e0cda4bf60fad5b2aaEli Friedman#include "../Commands/CommandObjectThread.h"
415c28dd1daf8de701ce1eeb8f9b8d3e3b5e39ad50Greg Clayton#include "../Commands/CommandObjectType.h"
42902e018b7b7b16609099c656c97ec2c0cb115c00Johnny Chen#include "../Commands/CommandObjectVersion.h"
4301acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen#include "../Commands/CommandObjectWatchpoint.h"
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Debugger.h"
475e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham#include "lldb/Core/InputReader.h"
48db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Core/Log.h"
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h"
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Timer.h"
51db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
52cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton#include "lldb/Host/Host.h"
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
54db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Interpreter/Args.h"
55f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton#include "lldb/Interpreter/CommandCompletions.h"
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
57f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton#include "lldb/Interpreter/CommandReturnObject.h"
58db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Interpreter/Options.h"
590aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice#include "lldb/Interpreter/ScriptInterpreterNone.h"
600aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice#include "lldb/Interpreter/ScriptInterpreterPython.h"
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
63db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Target/Process.h"
64db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Target/Thread.h"
65db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Target/TargetList.h"
66db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
67db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata#include "lldb/Utility/CleanUp.h"
68db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
729f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
739f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonstatic PropertyDefinition
749f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytong_properties[] =
759f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton{
769f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    { "expand-regex-aliases", OptionValue::eTypeBoolean, true, false, NULL, NULL, "If true, regular expression alias commands will show the expanded command that will be executed. This can be used to debug new regular expression alias commands." },
77dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    { "prompt-on-quit", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, LLDB will prompt you before quitting if there are any live processes being debugged. If false, LLDB will quit without asking in any case." },
786fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata    { "stop-command-source-on-error", OptionValue::eTypeBoolean, true, true, NULL, NULL, "If true, LLDB will stop running a 'command source' script upon encountering an error." },
799f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    { NULL                  , OptionValue::eTypeInvalid, true, 0    , NULL, NULL, NULL }
809f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton};
819f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
829f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonenum
839f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton{
84dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    ePropertyExpandRegexAliases = 0,
856fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata    ePropertyPromptOnQuit = 1,
866fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata    ePropertyStopCmdSourceOnError = 2
879f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton};
889f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
895a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim InghamConstString &
905a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim InghamCommandInterpreter::GetStaticBroadcasterClass ()
915a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham{
925a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    static ConstString class_name ("lldb.commandInterpreter");
935a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    return class_name;
945a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham}
955a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::CommandInterpreter
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
9863094e0bb161580564954dee512955c1c79d3476Greg Clayton    Debugger &debugger,
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ScriptLanguage script_language,
10063094e0bb161580564954dee512955c1c79d3476Greg Clayton    bool synchronous_execution
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) :
1025a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    Broadcaster (&debugger, "lldb.command-interpreter"),
1039f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    Properties(OptionValuePropertiesSP(new OptionValueProperties(ConstString("interpreter")))),
10463094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_debugger (debugger),
105887aa2898314218406275a34cbec30c11cd00acdGreg Clayton    m_synchronous_execution (synchronous_execution),
1060aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    m_skip_lldbinit_files (false),
107574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    m_skip_app_init_files (false),
108949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    m_script_interpreter_ap (),
109892fadd1f1001d1082cd2edcf282fee0cba8ac87Caroline Tice    m_comment_char ('#'),
1103908bb19f5f7956dcb58d6cfca3958103af776a6Johnny Chen    m_batch_command_mode (false),
11101bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata    m_truncation_warning(eNoTruncation),
11201bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata    m_command_source_depth (0)
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11473844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    debugger.SetScriptLanguage (script_language);
11549ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitThreadShouldExit, "thread-should-exit");
11649ce682dfa7993d31206cea19ce7006cd3f3077eGreg Clayton    SetEventName (eBroadcastBitResetPrompt, "reset-prompt");
11773844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton    SetEventName (eBroadcastBitQuitCommandReceived, "quit");
1185a15e6927b5b3234fb3e688717297ba6b5dd6ad7Jim Ingham    CheckInWithManager ();
1199f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    m_collection_sp->Initialize (g_properties);
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1229f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Claytonbool
1239f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg ClaytonCommandInterpreter::GetExpandRegexAliases () const
1249f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton{
1259f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    const uint32_t idx = ePropertyExpandRegexAliases;
1269f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton    return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
1279f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton}
1289f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
129dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granatabool
130dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico GranataCommandInterpreter::GetPromptOnQuit () const
131dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata{
132dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    const uint32_t idx = ePropertyPromptOnQuit;
133dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata    return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
134dcb36c76090fdbf52f020bdd3fada62e0cffcc8dEnrico Granata}
1359f282851b07ff6daee37cd3b1a3fbc43ef11da29Greg Clayton
1366fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granatabool
1376fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico GranataCommandInterpreter::GetStopCmdSourceOnError () const
1386fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata{
1396fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata    const uint32_t idx = ePropertyStopCmdSourceOnError;
1406fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata    return m_collection_sp->GetPropertyAtIndexAsBoolean (NULL, idx, g_properties[idx].default_uint_value != 0);
1416fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata}
1426fefc3a3915bcaf899b9179c43b1b7b2f693b3adEnrico Granata
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::Initialize ()
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject result;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    LoadCommandDictionary ();
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Set up some initial aliases.
1535ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    CommandObjectSP cmd_obj_sp = GetCommandSPExact ("quit", false);
1545ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1555ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1565ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("q", cmd_obj_sp);
1575ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("exit", cmd_obj_sp);
1585ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
159fc58af2513c7c9883df515686a5906d95a19ecf0Sean Callanan
160a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    cmd_obj_sp = GetCommandSPExact ("_regexp-attach",false);
161fc58af2513c7c9883df515686a5906d95a19ecf0Sean Callanan    if (cmd_obj_sp)
162fc58af2513c7c9883df515686a5906d95a19ecf0Sean Callanan    {
163fc58af2513c7c9883df515686a5906d95a19ecf0Sean Callanan        AddAlias ("attach", cmd_obj_sp);
164fc58af2513c7c9883df515686a5906d95a19ecf0Sean Callanan    }
1655ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
166a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    cmd_obj_sp = GetCommandSPExact ("process detach",false);
167a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    if (cmd_obj_sp)
168a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    {
169a47e44b447750f33bff81995f41c4051fc699409Johnny Chen        AddAlias ("detach", cmd_obj_sp);
170a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    }
171a47e44b447750f33bff81995f41c4051fc699409Johnny Chen
1725ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("process continue", false);
1735ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1745ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
1755ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("c", cmd_obj_sp);
1765ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("continue", cmd_obj_sp);
1775ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
1785ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1795ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("_regexp-break",false);
1805ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
1815ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("b", cmd_obj_sp);
1825ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
1832753a024a5a314232baa579c0ada87551aa86988Jim Ingham    cmd_obj_sp = GetCommandSPExact ("_regexp-tbreak",false);
1842753a024a5a314232baa579c0ada87551aa86988Jim Ingham    if (cmd_obj_sp)
1852753a024a5a314232baa579c0ada87551aa86988Jim Ingham        AddAlias ("tbreak", cmd_obj_sp);
1862753a024a5a314232baa579c0ada87551aa86988Jim Ingham
1875ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-inst", false);
1885ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
18947eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    {
19047eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda        AddAlias ("stepi", cmd_obj_sp);
1915ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("si", cmd_obj_sp);
19247eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    }
19347eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda
19447eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    cmd_obj_sp = GetCommandSPExact ("thread step-inst-over", false);
19547eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    if (cmd_obj_sp)
19647eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    {
19747eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda        AddAlias ("nexti", cmd_obj_sp);
19847eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda        AddAlias ("ni", cmd_obj_sp);
19947eb00e8fe39de83a04178c7d798b9ce7e0804e7Jason Molenda    }
2005ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2015ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-in", false);
2025ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2035ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
2045ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("s", cmd_obj_sp);
2055ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("step", cmd_obj_sp);
2065ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
2075ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2085ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-over", false);
2095ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2105ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
2115ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("n", cmd_obj_sp);
2125ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("next", cmd_obj_sp);
2135ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
2145ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2155ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("thread step-out", false);
2165ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2175ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
2185ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("finish", cmd_obj_sp);
2195ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
2205ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
22159355253c2bae819c040892add4d4575c59b4cf7Jim Ingham    cmd_obj_sp = GetCommandSPExact ("frame select", false);
22259355253c2bae819c040892add4d4575c59b4cf7Jim Ingham    if (cmd_obj_sp)
22359355253c2bae819c040892add4d4575c59b4cf7Jim Ingham    {
22459355253c2bae819c040892add4d4575c59b4cf7Jim Ingham        AddAlias ("f", cmd_obj_sp);
22559355253c2bae819c040892add4d4575c59b4cf7Jim Ingham    }
22659355253c2bae819c040892add4d4575c59b4cf7Jim Ingham
2272753a024a5a314232baa579c0ada87551aa86988Jim Ingham    cmd_obj_sp = GetCommandSPExact ("thread select", false);
2282753a024a5a314232baa579c0ada87551aa86988Jim Ingham    if (cmd_obj_sp)
2292753a024a5a314232baa579c0ada87551aa86988Jim Ingham    {
2302753a024a5a314232baa579c0ada87551aa86988Jim Ingham        AddAlias ("t", cmd_obj_sp);
2312753a024a5a314232baa579c0ada87551aa86988Jim Ingham    }
2322753a024a5a314232baa579c0ada87551aa86988Jim Ingham
2338f805c29a68c326788278e21308f1a700dc58635Greg Clayton    cmd_obj_sp = GetCommandSPExact ("_regexp-list", false);
2345ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2355ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
2365ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("l", cmd_obj_sp);
2375ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("list", cmd_obj_sp);
2385ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
2395ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
240c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    cmd_obj_sp = GetCommandSPExact ("_regexp-env", false);
241c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    if (cmd_obj_sp)
242c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    {
243c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton        AddAlias ("env", cmd_obj_sp);
244c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    }
245c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton
2465ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("memory read", false);
2475ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2485ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("x", cmd_obj_sp);
2495ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2505ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("_regexp-up", false);
2515ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2525ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("up", cmd_obj_sp);
2535ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2545ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("_regexp-down", false);
2555ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2565ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("down", cmd_obj_sp);
2575ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2583f2ec9b8ff3a7bfa8ece0b23334c1ed3b9d9ad08Jason Molenda    cmd_obj_sp = GetCommandSPExact ("_regexp-display", false);
259730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (cmd_obj_sp)
260730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        AddAlias ("display", cmd_obj_sp);
2619d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
2629d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    cmd_obj_sp = GetCommandSPExact ("disassemble", false);
2639d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    if (cmd_obj_sp)
2649d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham        AddAlias ("dis", cmd_obj_sp);
2659d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
2669d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    cmd_obj_sp = GetCommandSPExact ("disassemble", false);
2679d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham    if (cmd_obj_sp)
2689d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham        AddAlias ("di", cmd_obj_sp);
2699d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
2709d1acc179e28cf2625e66c411fb164303b6e4e4eJim Ingham
271730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
2723f2ec9b8ff3a7bfa8ece0b23334c1ed3b9d9ad08Jason Molenda    cmd_obj_sp = GetCommandSPExact ("_regexp-undisplay", false);
273730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (cmd_obj_sp)
274730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        AddAlias ("undisplay", cmd_obj_sp);
275730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
276f190a41a2e9a77499709e68ed0822f1498afef4cJim Ingham    cmd_obj_sp = GetCommandSPExact ("_regexp-bt", false);
277f190a41a2e9a77499709e68ed0822f1498afef4cJim Ingham    if (cmd_obj_sp)
278f190a41a2e9a77499709e68ed0822f1498afef4cJim Ingham        AddAlias ("bt", cmd_obj_sp);
279f190a41a2e9a77499709e68ed0822f1498afef4cJim Ingham
2805ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("target create", false);
2815ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2825ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("file", cmd_obj_sp);
2835ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2845ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("target modules", false);
2855ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
2865ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("image", cmd_obj_sp);
2875ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2885ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
2895ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    OptionArgVectorSP alias_arguments_vector_sp (new OptionArgVector);
290e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham
2915ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("expression", false);
2925ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
29371c5d60c65c7e73a55adfc220501fe7085fd0eb7Sean Callanan    {
2945ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        ProcessAliasOptionsArgs (cmd_obj_sp, "--", alias_arguments_vector_sp);
2955ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("p", cmd_obj_sp);
2965ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("print", cmd_obj_sp);
29759959ebd87b269b0a690cf88f103a370e973de73Sean Callanan        AddAlias ("call", cmd_obj_sp);
2985ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("p", alias_arguments_vector_sp);
2995ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("print", alias_arguments_vector_sp);
30059959ebd87b269b0a690cf88f103a370e973de73Sean Callanan        AddOrReplaceAliasOptions ("call", alias_arguments_vector_sp);
3015ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
3025ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        alias_arguments_vector_sp.reset (new OptionArgVector);
3032f6a4ed0dd1b2046a5193a1432af7462e32c620dGreg Clayton        ProcessAliasOptionsArgs (cmd_obj_sp, "-O -- ", alias_arguments_vector_sp);
3045ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("po", cmd_obj_sp);
3055ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("po", alias_arguments_vector_sp);
3065ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
3075ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
308ee301fa37c161f85f8d3df49453bf905227d0283Sean Callanan    cmd_obj_sp = GetCommandSPExact ("process kill", false);
309ee301fa37c161f85f8d3df49453bf905227d0283Sean Callanan    if (cmd_obj_sp)
310f2e53a53d931692a76f0f8b73a8c38f1bf2cffe9Greg Clayton    {
311ee301fa37c161f85f8d3df49453bf905227d0283Sean Callanan        AddAlias ("kill", cmd_obj_sp);
312f2e53a53d931692a76f0f8b73a8c38f1bf2cffe9Greg Clayton    }
313ee301fa37c161f85f8d3df49453bf905227d0283Sean Callanan
3145ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    cmd_obj_sp = GetCommandSPExact ("process launch", false);
3155ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (cmd_obj_sp)
3165ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
3175ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        alias_arguments_vector_sp.reset (new OptionArgVector);
31836eb7c00064891bd013938be1edc77738cf1a53fJason Molenda#if defined (__arm__)
31936eb7c00064891bd013938be1edc77738cf1a53fJason Molenda        ProcessAliasOptionsArgs (cmd_obj_sp, "--", alias_arguments_vector_sp);
32036eb7c00064891bd013938be1edc77738cf1a53fJason Molenda#else
32186c50d733f7195867fb8240e1696a8001f5423a0Greg Clayton        ProcessAliasOptionsArgs (cmd_obj_sp, "--shell=/bin/bash --", alias_arguments_vector_sp);
32236eb7c00064891bd013938be1edc77738cf1a53fJason Molenda#endif
3235ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("r", cmd_obj_sp);
3245ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddAlias ("run", cmd_obj_sp);
3255ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("r", alias_arguments_vector_sp);
3265ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        AddOrReplaceAliasOptions ("run", alias_arguments_vector_sp);
3275ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
328c84623f95ddc04c800f5ef96c840eb1afc45563bGreg Clayton
329c84623f95ddc04c800f5ef96c840eb1afc45563bGreg Clayton    cmd_obj_sp = GetCommandSPExact ("target symbols add", false);
330c84623f95ddc04c800f5ef96c840eb1afc45563bGreg Clayton    if (cmd_obj_sp)
331c84623f95ddc04c800f5ef96c840eb1afc45563bGreg Clayton    {
332c84623f95ddc04c800f5ef96c840eb1afc45563bGreg Clayton        AddAlias ("add-dsym", cmd_obj_sp);
333c84623f95ddc04c800f5ef96c840eb1afc45563bGreg Clayton    }
3347b71b172c516740a3d9db3b5959f4e20a816b741Sean Callanan
3357b71b172c516740a3d9db3b5959f4e20a816b741Sean Callanan    cmd_obj_sp = GetCommandSPExact ("breakpoint set", false);
3367b71b172c516740a3d9db3b5959f4e20a816b741Sean Callanan    if (cmd_obj_sp)
3377b71b172c516740a3d9db3b5959f4e20a816b741Sean Callanan    {
3387b71b172c516740a3d9db3b5959f4e20a816b741Sean Callanan        alias_arguments_vector_sp.reset (new OptionArgVector);
3397b71b172c516740a3d9db3b5959f4e20a816b741Sean Callanan        ProcessAliasOptionsArgs (cmd_obj_sp, "--func-regex %1", alias_arguments_vector_sp);
3402657b6bcfdde42ae97cbaac56e8f7ed3857b4605Jim Ingham        AddAlias ("rbreak", cmd_obj_sp);
3412657b6bcfdde42ae97cbaac56e8f7ed3857b4605Jim Ingham        AddOrReplaceAliasOptions("rbreak", alias_arguments_vector_sp);
3427b71b172c516740a3d9db3b5959f4e20a816b741Sean Callanan    }
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::ProcessEmbeddedScriptCommands (const char *arg)
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // This function has not yet been implemented.
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Look for any embedded script command
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If found,
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    get interpreter object from the command dictionary,
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    call execute_one_command on it,
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    get the results as a string,
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //    substitute that string for current stuff.
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return arg;
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::LoadCommandDictionary ()
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3665bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    lldb::ScriptLanguage script_language = m_debugger.GetScriptLanguage();
3676e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice
368238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["apropos"]   = CommandObjectSP (new CommandObjectApropos (*this));
36963094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["breakpoint"]= CommandObjectSP (new CommandObjectMultiwordBreakpoint (*this));
3709e4c3d7e23766be3d65b6637a2a52e455b5fed0aJohnny Chen    m_command_dict["command"]   = CommandObjectSP (new CommandObjectMultiwordCommands (*this));
371238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["disassemble"] = CommandObjectSP (new CommandObjectDisassemble (*this));
372238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["expression"]= CommandObjectSP (new CommandObjectExpression (*this));
37363094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["frame"]     = CommandObjectSP (new CommandObjectMultiwordFrame (*this));
374238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["help"]      = CommandObjectSP (new CommandObjectHelp (*this));
37563094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["log"]       = CommandObjectSP (new CommandObjectLog (*this));
37663094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["memory"]    = CommandObjectSP (new CommandObjectMemory (*this));
377b1888f24fa181489840b9acf193e224d125d0776Greg Clayton    m_command_dict["platform"]  = CommandObjectSP (new CommandObjectPlatform (*this));
3786d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata    m_command_dict["plugin"]    = CommandObjectSP (new CommandObjectPlugin (*this));
37963094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["process"]   = CommandObjectSP (new CommandObjectMultiwordProcess (*this));
380238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["quit"]      = CommandObjectSP (new CommandObjectQuit (*this));
38163094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["register"]  = CommandObjectSP (new CommandObjectRegister (*this));
382238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_command_dict["script"]    = CommandObjectSP (new CommandObjectScript (*this, script_language));
3836e4c5ce0f697eb9899a54854a2a9004e961b0de2Caroline Tice    m_command_dict["settings"]  = CommandObjectSP (new CommandObjectMultiwordSettings (*this));
384767af88aa617288e584afcfed055f7755e408542Jim Ingham    m_command_dict["source"]    = CommandObjectSP (new CommandObjectMultiwordSource (*this));
38563094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["target"]    = CommandObjectSP (new CommandObjectMultiwordTarget (*this));
38663094e0bb161580564954dee512955c1c79d3476Greg Clayton    m_command_dict["thread"]    = CommandObjectSP (new CommandObjectMultiwordThread (*this));
3876b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    m_command_dict["type"]      = CommandObjectSP (new CommandObjectType (*this));
388902e018b7b7b16609099c656c97ec2c0cb115c00Johnny Chen    m_command_dict["version"]   = CommandObjectSP (new CommandObjectVersion (*this));
38901acfa76010b8db2e77016c144963c4dd70f1392Johnny Chen    m_command_dict["watchpoint"]= CommandObjectSP (new CommandObjectMultiwordWatchpoint (*this));
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3912753a024a5a314232baa579c0ada87551aa86988Jim Ingham    const char *break_regexes[][2] = {{"^(.*[^[:space:]])[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]]*$", "breakpoint set --file '%1' --line %2"},
3922753a024a5a314232baa579c0ada87551aa86988Jim Ingham                                      {"^([[:digit:]]+)[[:space:]]*$", "breakpoint set --line %1"},
393f2bf27413cdcbd730aa2ed05ec5cdb6222b130e9Greg Clayton                                      {"^\\*?(0x[[:xdigit:]]+)[[:space:]]*$", "breakpoint set --address %1"},
394f892c42725ed36c97e8ce10e758170cf6f1aff83Greg Clayton                                      {"^[\"']?([-+]?\\[.*\\])[\"']?[[:space:]]*$", "breakpoint set --name '%1'"},
3952753a024a5a314232baa579c0ada87551aa86988Jim Ingham                                      {"^(-.*)$", "breakpoint set %1"},
3962753a024a5a314232baa579c0ada87551aa86988Jim Ingham                                      {"^(.*[^[:space:]])`(.*[^[:space:]])[[:space:]]*$", "breakpoint set --name '%2' --shlib '%1'"},
397f2bf27413cdcbd730aa2ed05ec5cdb6222b130e9Greg Clayton                                      {"^\\&(.*[^[:space:]])[[:space:]]*$", "breakpoint set --name '%1' --skip-prologue=0"},
3982753a024a5a314232baa579c0ada87551aa86988Jim Ingham                                      {"^(.*[^[:space:]])[[:space:]]*$", "breakpoint set --name '%1'"}};
3992753a024a5a314232baa579c0ada87551aa86988Jim Ingham
4002753a024a5a314232baa579c0ada87551aa86988Jim Ingham    size_t num_regexes = sizeof break_regexes/sizeof(char *[2]);
4012753a024a5a314232baa579c0ada87551aa86988Jim Ingham
402102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
403238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    break_regex_cmd_ap(new CommandObjectRegexCommand (*this,
404b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                      "_regexp-break",
40558edac307c3c3c60db52a491c101b6565b9b234fJohnny Chen                                                      "Set a breakpoint using a regular expression to specify the location, where <linenum> is in decimal and <address> is in hex.",
406f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                      "_regexp-break [<filename>:<linenum>]\n_regexp-break [<linenum>]\n_regexp-break [<address>]\n_regexp-break <...>",
407f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                      2,
408f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                      CommandCompletions::eSymbolCompletion |
409f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                      CommandCompletions::eSourceFileCompletion));
4102753a024a5a314232baa579c0ada87551aa86988Jim Ingham
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (break_regex_cmd_ap.get())
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4132753a024a5a314232baa579c0ada87551aa86988Jim Ingham        bool success = true;
4142753a024a5a314232baa579c0ada87551aa86988Jim Ingham        for (size_t i = 0; i < num_regexes; i++)
4152753a024a5a314232baa579c0ada87551aa86988Jim Ingham        {
4162753a024a5a314232baa579c0ada87551aa86988Jim Ingham            success = break_regex_cmd_ap->AddRegexCommand (break_regexes[i][0], break_regexes[i][1]);
4172753a024a5a314232baa579c0ada87551aa86988Jim Ingham            if (!success)
4182753a024a5a314232baa579c0ada87551aa86988Jim Ingham                break;
4192753a024a5a314232baa579c0ada87551aa86988Jim Ingham        }
4202753a024a5a314232baa579c0ada87551aa86988Jim Ingham        success = break_regex_cmd_ap->AddRegexCommand("^$", "breakpoint list --full");
4212753a024a5a314232baa579c0ada87551aa86988Jim Ingham
4222753a024a5a314232baa579c0ada87551aa86988Jim Ingham        if (success)
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            CommandObjectSP break_regex_cmd_sp(break_regex_cmd_ap.release());
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_command_dict[break_regex_cmd_sp->GetCommandName ()] = break_regex_cmd_sp;
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
428e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham
429102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
4302753a024a5a314232baa579c0ada87551aa86988Jim Ingham    tbreak_regex_cmd_ap(new CommandObjectRegexCommand (*this,
4312753a024a5a314232baa579c0ada87551aa86988Jim Ingham                                                      "_regexp-tbreak",
4322753a024a5a314232baa579c0ada87551aa86988Jim Ingham                                                      "Set a one shot breakpoint using a regular expression to specify the location, where <linenum> is in decimal and <address> is in hex.",
433f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                      "_regexp-tbreak [<filename>:<linenum>]\n_regexp-break [<linenum>]\n_regexp-break [<address>]\n_regexp-break <...>",
434f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                       2,
435f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                       CommandCompletions::eSymbolCompletion |
436f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                       CommandCompletions::eSourceFileCompletion));
4372753a024a5a314232baa579c0ada87551aa86988Jim Ingham
4382753a024a5a314232baa579c0ada87551aa86988Jim Ingham    if (tbreak_regex_cmd_ap.get())
4392753a024a5a314232baa579c0ada87551aa86988Jim Ingham    {
4402753a024a5a314232baa579c0ada87551aa86988Jim Ingham        bool success = true;
4412753a024a5a314232baa579c0ada87551aa86988Jim Ingham        for (size_t i = 0; i < num_regexes; i++)
4422753a024a5a314232baa579c0ada87551aa86988Jim Ingham        {
4432753a024a5a314232baa579c0ada87551aa86988Jim Ingham            // If you add a resultant command string longer than 1024 characters be sure to increase the size of this buffer.
4442753a024a5a314232baa579c0ada87551aa86988Jim Ingham            char buffer[1024];
4452753a024a5a314232baa579c0ada87551aa86988Jim Ingham            int num_printed = snprintf(buffer, 1024, "%s %s", break_regexes[i][1], "-o");
4462753a024a5a314232baa579c0ada87551aa86988Jim Ingham            assert (num_printed < 1024);
4472753a024a5a314232baa579c0ada87551aa86988Jim Ingham            success = tbreak_regex_cmd_ap->AddRegexCommand (break_regexes[i][0], buffer);
4482753a024a5a314232baa579c0ada87551aa86988Jim Ingham            if (!success)
4492753a024a5a314232baa579c0ada87551aa86988Jim Ingham                break;
4502753a024a5a314232baa579c0ada87551aa86988Jim Ingham        }
4512753a024a5a314232baa579c0ada87551aa86988Jim Ingham        success = tbreak_regex_cmd_ap->AddRegexCommand("^$", "breakpoint list --full");
4522753a024a5a314232baa579c0ada87551aa86988Jim Ingham
4532753a024a5a314232baa579c0ada87551aa86988Jim Ingham        if (success)
4542753a024a5a314232baa579c0ada87551aa86988Jim Ingham        {
4552753a024a5a314232baa579c0ada87551aa86988Jim Ingham            CommandObjectSP tbreak_regex_cmd_sp(tbreak_regex_cmd_ap.release());
4562753a024a5a314232baa579c0ada87551aa86988Jim Ingham            m_command_dict[tbreak_regex_cmd_sp->GetCommandName ()] = tbreak_regex_cmd_sp;
4572753a024a5a314232baa579c0ada87551aa86988Jim Ingham        }
4582753a024a5a314232baa579c0ada87551aa86988Jim Ingham    }
4592753a024a5a314232baa579c0ada87551aa86988Jim Ingham
460102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
461a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    attach_regex_cmd_ap(new CommandObjectRegexCommand (*this,
462a47e44b447750f33bff81995f41c4051fc699409Johnny Chen                                                       "_regexp-attach",
463a47e44b447750f33bff81995f41c4051fc699409Johnny Chen                                                       "Attach to a process id if in decimal, otherwise treat the argument as a process name to attach to.",
464f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                       "_regexp-attach [<pid>]\n_regexp-attach [<process-name>]",
465f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                       2));
466a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    if (attach_regex_cmd_ap.get())
467a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    {
468b1484f7c5b38bf5fbd73622b033ac4343d21624eGreg Clayton        if (attach_regex_cmd_ap->AddRegexCommand("^([0-9]+)[[:space:]]*$", "process attach --pid %1") &&
469b1484f7c5b38bf5fbd73622b033ac4343d21624eGreg Clayton            attach_regex_cmd_ap->AddRegexCommand("^(-.*|.* -.*)$", "process attach %1") && // Any options that are specified get passed to 'process attach'
470b1484f7c5b38bf5fbd73622b033ac4343d21624eGreg Clayton            attach_regex_cmd_ap->AddRegexCommand("^(.+)$", "process attach --name '%1'") &&
471b1484f7c5b38bf5fbd73622b033ac4343d21624eGreg Clayton            attach_regex_cmd_ap->AddRegexCommand("^$", "process attach"))
472a47e44b447750f33bff81995f41c4051fc699409Johnny Chen        {
473a47e44b447750f33bff81995f41c4051fc699409Johnny Chen            CommandObjectSP attach_regex_cmd_sp(attach_regex_cmd_ap.release());
474a47e44b447750f33bff81995f41c4051fc699409Johnny Chen            m_command_dict[attach_regex_cmd_sp->GetCommandName ()] = attach_regex_cmd_sp;
475a47e44b447750f33bff81995f41c4051fc699409Johnny Chen        }
476a47e44b447750f33bff81995f41c4051fc699409Johnny Chen    }
477a47e44b447750f33bff81995f41c4051fc699409Johnny Chen
478102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
479e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    down_regex_cmd_ap(new CommandObjectRegexCommand (*this,
480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                     "_regexp-down",
481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                     "Go down \"n\" frames in the stack (1 frame by default).",
482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                     "_regexp-down [n]", 2));
483e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    if (down_regex_cmd_ap.get())
484e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    {
485e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        if (down_regex_cmd_ap->AddRegexCommand("^$", "frame select -r -1") &&
486e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            down_regex_cmd_ap->AddRegexCommand("^([0-9]+)$", "frame select -r -%1"))
487e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        {
488e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            CommandObjectSP down_regex_cmd_sp(down_regex_cmd_ap.release());
489e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            m_command_dict[down_regex_cmd_sp->GetCommandName ()] = down_regex_cmd_sp;
490e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        }
491e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    }
492e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham
493102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
494e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    up_regex_cmd_ap(new CommandObjectRegexCommand (*this,
495b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                   "_regexp-up",
496b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                   "Go up \"n\" frames in the stack (1 frame by default).",
497b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton                                                   "_regexp-up [n]", 2));
498e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    if (up_regex_cmd_ap.get())
499e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    {
500e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        if (up_regex_cmd_ap->AddRegexCommand("^$", "frame select -r 1") &&
501e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            up_regex_cmd_ap->AddRegexCommand("^([0-9]+)$", "frame select -r %1"))
502e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        {
503e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            CommandObjectSP up_regex_cmd_sp(up_regex_cmd_ap.release());
504e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham            m_command_dict[up_regex_cmd_sp->GetCommandName ()] = up_regex_cmd_sp;
505e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham        }
506e56493f430ba2956e4e8965fd4e573cbf1a48811Jim Ingham    }
507730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
508102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
509730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    display_regex_cmd_ap(new CommandObjectRegexCommand (*this,
510f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                        "_regexp-display",
511f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                        "Add an expression evaluation stop-hook.",
512f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                        "_regexp-display expression", 2));
513730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (display_regex_cmd_ap.get())
514730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    {
515730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        if (display_regex_cmd_ap->AddRegexCommand("^(.+)$", "target stop-hook add -o \"expr -- %1\""))
516730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        {
517730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            CommandObjectSP display_regex_cmd_sp(display_regex_cmd_ap.release());
518730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            m_command_dict[display_regex_cmd_sp->GetCommandName ()] = display_regex_cmd_sp;
519730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        }
520730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    }
521730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
522102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
523730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    undisplay_regex_cmd_ap(new CommandObjectRegexCommand (*this,
524f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                          "_regexp-undisplay",
525f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                          "Remove an expression evaluation stop-hook.",
526f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                          "_regexp-undisplay stop-hook-number", 2));
527730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    if (undisplay_regex_cmd_ap.get())
528730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    {
529730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        if (undisplay_regex_cmd_ap->AddRegexCommand("^([0-9]+)$", "target stop-hook delete %1"))
530730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        {
531730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            CommandObjectSP undisplay_regex_cmd_sp(undisplay_regex_cmd_ap.release());
532730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda            m_command_dict[undisplay_regex_cmd_sp->GetCommandName ()] = undisplay_regex_cmd_sp;
533730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda        }
534730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda    }
535730cae073aef3b44b9d6f420ea3bb0a6e0b1f020Jason Molenda
536102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
537c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    connect_gdb_remote_cmd_ap(new CommandObjectRegexCommand (*this,
538f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                             "gdb-remote",
539f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                             "Connect to a remote GDB server.  If no hostname is provided, localhost is assumed.",
540f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                             "gdb-remote [<hostname>:]<portnum>", 2));
541c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    if (connect_gdb_remote_cmd_ap.get())
542c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    {
543c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton        if (connect_gdb_remote_cmd_ap->AddRegexCommand("^([^:]+:[[:digit:]]+)$", "process connect --plugin gdb-remote connect://%1") &&
544c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton            connect_gdb_remote_cmd_ap->AddRegexCommand("^([[:digit:]]+)$", "process connect --plugin gdb-remote connect://localhost:%1"))
545c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton        {
546c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton            CommandObjectSP command_sp(connect_gdb_remote_cmd_ap.release());
547c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton            m_command_dict[command_sp->GetCommandName ()] = command_sp;
548c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton        }
549c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    }
550c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton
551102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
552c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    connect_kdp_remote_cmd_ap(new CommandObjectRegexCommand (*this,
553c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton                                                             "kdp-remote",
554de1edceb2474399ab9bdbb919a05b536a4d64d49Jason Molenda                                                             "Connect to a remote KDP server.  udp port 41139 is the default port number.",
555de1edceb2474399ab9bdbb919a05b536a4d64d49Jason Molenda                                                             "kdp-remote <hostname>[:<portnum>]", 2));
556c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    if (connect_kdp_remote_cmd_ap.get())
557c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    {
558c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton        if (connect_kdp_remote_cmd_ap->AddRegexCommand("^([^:]+:[[:digit:]]+)$", "process connect --plugin kdp-remote udp://%1") &&
55973feea495a1ed9850f8ff46092f4c3ff935242a8Jason Molenda            connect_kdp_remote_cmd_ap->AddRegexCommand("^(.+)$", "process connect --plugin kdp-remote udp://%1:41139"))
560c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton        {
561c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton            CommandObjectSP command_sp(connect_kdp_remote_cmd_ap.release());
562c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton            m_command_dict[command_sp->GetCommandName ()] = command_sp;
563c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton        }
564c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton    }
565c3750435abd083cc11fa7614007a7a5c38a84f38Greg Clayton
566102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
5671a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda    bt_regex_cmd_ap(new CommandObjectRegexCommand (*this,
568f190a41a2e9a77499709e68ed0822f1498afef4cJim Ingham                                                     "_regexp-bt",
5691a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda                                                     "Show a backtrace.  An optional argument is accepted; if that argument is a number, it specifies the number of frames to display.  If that argument is 'all', full backtraces of all threads are displayed.",
5701a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda                                                     "bt [<digit>|all]", 2));
5711a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda    if (bt_regex_cmd_ap.get())
5721a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda    {
5731a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda        // accept but don't document "bt -c <number>" -- before bt was a regex command if you wanted to backtrace
5741a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda        // three frames you would do "bt -c 3" but the intention is to have this emulate the gdb "bt" command and
5751a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda        // so now "bt 3" is the preferred form, in line with gdb.
5761a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda        if (bt_regex_cmd_ap->AddRegexCommand("^([[:digit:]]+)$", "thread backtrace -c %1") &&
5771a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda            bt_regex_cmd_ap->AddRegexCommand("^-c ([[:digit:]]+)$", "thread backtrace -c %1") &&
5781a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda            bt_regex_cmd_ap->AddRegexCommand("^all$", "thread backtrace all") &&
5791a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda            bt_regex_cmd_ap->AddRegexCommand("^$", "thread backtrace"))
5801a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda        {
5811a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda            CommandObjectSP command_sp(bt_regex_cmd_ap.release());
5821a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda            m_command_dict[command_sp->GetCommandName ()] = command_sp;
5831a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda        }
5841a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda    }
5851a48cb7c84595e5fb0634c4758a84bb0dda012d2Jason Molenda
586102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
5878f805c29a68c326788278e21308f1a700dc58635Greg Clayton    list_regex_cmd_ap(new CommandObjectRegexCommand (*this,
5888f805c29a68c326788278e21308f1a700dc58635Greg Clayton                                                     "_regexp-list",
5898f805c29a68c326788278e21308f1a700dc58635Greg Clayton                                                     "Implements the GDB 'list' command in all of its forms except FILE:FUNCTION and maps them to the appropriate 'source list' commands.",
590f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                     "_regexp-list [<line>]\n_regexp-attach [<file>:<line>]\n_regexp-attach [<file>:<line>]",
591f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                     2,
592f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                     CommandCompletions::eSourceFileCompletion));
5938f805c29a68c326788278e21308f1a700dc58635Greg Clayton    if (list_regex_cmd_ap.get())
5948f805c29a68c326788278e21308f1a700dc58635Greg Clayton    {
5958f805c29a68c326788278e21308f1a700dc58635Greg Clayton        if (list_regex_cmd_ap->AddRegexCommand("^([0-9]+)[[:space:]]*$", "source list --line %1") &&
5968f805c29a68c326788278e21308f1a700dc58635Greg Clayton            list_regex_cmd_ap->AddRegexCommand("^(.*[^[:space:]])[[:space:]]*:[[:space:]]*([[:digit:]]+)[[:space:]]*$", "source list --file '%1' --line %2") &&
5978f805c29a68c326788278e21308f1a700dc58635Greg Clayton            list_regex_cmd_ap->AddRegexCommand("^\\*?(0x[[:xdigit:]]+)[[:space:]]*$", "source list --address %1") &&
598c98abf51778fe9b4a992ab0111d5912b2b3420e8Greg Clayton            list_regex_cmd_ap->AddRegexCommand("^-[[:space:]]*$", "source list --reverse") &&
599b1f44b340f31ec747a7b6dcd299b8a6151470817Greg Clayton            list_regex_cmd_ap->AddRegexCommand("^-([[:digit:]]+)[[:space:]]*$", "source list --reverse --count %1") &&
6008f805c29a68c326788278e21308f1a700dc58635Greg Clayton            list_regex_cmd_ap->AddRegexCommand("^(.+)$", "source list --name \"%1\"") &&
6018f805c29a68c326788278e21308f1a700dc58635Greg Clayton            list_regex_cmd_ap->AddRegexCommand("^$", "source list"))
6028f805c29a68c326788278e21308f1a700dc58635Greg Clayton        {
6038f805c29a68c326788278e21308f1a700dc58635Greg Clayton            CommandObjectSP list_regex_cmd_sp(list_regex_cmd_ap.release());
6048f805c29a68c326788278e21308f1a700dc58635Greg Clayton            m_command_dict[list_regex_cmd_sp->GetCommandName ()] = list_regex_cmd_sp;
6058f805c29a68c326788278e21308f1a700dc58635Greg Clayton        }
6068f805c29a68c326788278e21308f1a700dc58635Greg Clayton    }
6078f805c29a68c326788278e21308f1a700dc58635Greg Clayton
608102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton    std::unique_ptr<CommandObjectRegexCommand>
609c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    env_regex_cmd_ap(new CommandObjectRegexCommand (*this,
610f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                    "_regexp-env",
611f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                    "Implements a shortcut to viewing and setting environment variables.",
612f3c65b85caf3e097654f6b59c9a709507adfc254Greg Clayton                                                    "_regexp-env\n_regexp-env FOO=BAR", 2));
613c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    if (env_regex_cmd_ap.get())
614c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    {
615c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton        if (env_regex_cmd_ap->AddRegexCommand("^$", "settings show target.env-vars") &&
616c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton            env_regex_cmd_ap->AddRegexCommand("^([A-Za-z_][A-Za-z_0-9]*=.*)$", "settings set target.env-vars %1"))
617c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton        {
618c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton            CommandObjectSP env_regex_cmd_sp(env_regex_cmd_ap.release());
619c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton            m_command_dict[env_regex_cmd_sp->GetCommandName ()] = env_regex_cmd_sp;
620c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton        }
621c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton    }
622c06adf1bd6b9b051f74804047c0627a49fac2bf6Greg Clayton
62324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
62424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
62524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
62624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetCommandNamesMatchingPartialString (const char *cmd_str, bool include_aliases,
62724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                          StringList &matches)
62824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
62924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::AddNamesMatchingPartialString (m_command_dict, cmd_str, matches);
63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (include_aliases)
63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandObject::AddNamesMatchingPartialString (m_alias_dict, cmd_str, matches);
63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return matches.GetSize();
63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectSP
64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetCommandSP (const char *cmd_cstr, bool include_aliases, bool exact, StringList *matches)
64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
64224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator pos;
64336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    CommandObjectSP command_sp;
64424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string cmd(cmd_cstr);
64624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
64724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (HasCommands())
64824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_command_dict.find(cmd);
65024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_command_dict.end())
65136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            command_sp = pos->second;
65224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
65324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
65424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (include_aliases && HasAliases())
65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
65624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_alias_dict.find(cmd);
65724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_alias_dict.end())
65836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            command_sp = pos->second;
65924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
66024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (HasUserCommands())
66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_user_dict.find(cmd);
66424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_user_dict.end())
66536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            command_sp = pos->second;
66624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
66836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    if (!exact && !command_sp)
66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
670d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // We will only get into here if we didn't find any exact matches.
671d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
672d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        CommandObjectSP user_match_sp, alias_match_sp, real_match_sp;
673d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
67424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StringList local_matches;
67524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (matches == NULL)
67624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            matches = &local_matches;
67724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
678d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        unsigned int num_cmd_matches = 0;
679d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        unsigned int num_alias_matches = 0;
680d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        unsigned int num_user_matches = 0;
681d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
682d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // Look through the command dictionaries one by one, and if we get only one match from any of
683d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // them in toto, then return that, otherwise return an empty CommandObjectSP and the list of matches.
684d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
68524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (HasCommands())
68624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
68724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_cmd_matches = CommandObject::AddNamesMatchingPartialString (m_command_dict, cmd_cstr, *matches);
68824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
68924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
69024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_cmd_matches == 1)
69124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
69224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cmd.assign(matches->GetStringAtIndex(0));
69324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos = m_command_dict.find(cmd);
69424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pos != m_command_dict.end())
695d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                real_match_sp = pos->second;
69624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
69724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6989a57417fd3e1a4a9fe5044fc431f9836bade906dJim Ingham        if (include_aliases && HasAliases())
69924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
70024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_alias_matches = CommandObject::AddNamesMatchingPartialString (m_alias_dict, cmd_cstr, *matches);
70124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
70224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
70324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
704d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        if (num_alias_matches == 1)
70524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
70624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cmd.assign(matches->GetStringAtIndex (num_cmd_matches));
70724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos = m_alias_dict.find(cmd);
70824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pos != m_alias_dict.end())
709d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                alias_match_sp = pos->second;
71024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
71124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7129a57417fd3e1a4a9fe5044fc431f9836bade906dJim Ingham        if (HasUserCommands())
71324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
71424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_user_matches = CommandObject::AddNamesMatchingPartialString (m_user_dict, cmd_cstr, *matches);
71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
71624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
717d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        if (num_user_matches == 1)
71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
71924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cmd.assign (matches->GetStringAtIndex (num_cmd_matches + num_alias_matches));
72024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
72124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pos = m_user_dict.find (cmd);
72224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (pos != m_user_dict.end())
723d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                user_match_sp = pos->second;
724d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        }
725d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
726d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        // If we got exactly one match, return that, otherwise return the match list.
727d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
728d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        if (num_user_matches + num_cmd_matches + num_alias_matches == 1)
729d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        {
730d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham            if (num_cmd_matches)
731d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                return real_match_sp;
732d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham            else if (num_alias_matches)
733d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                return alias_match_sp;
734d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham            else
735d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham                return user_match_sp;
73624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
73836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    else if (matches && command_sp)
739d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    {
740d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        matches->AppendString (cmd_cstr);
74124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
74224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
74436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    return command_sp;
74524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
74624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
747d12aeab33bab559e138307f599077da3918a3238Greg Claytonbool
748d12aeab33bab559e138307f599077da3918a3238Greg ClaytonCommandInterpreter::AddCommand (const char *name, const lldb::CommandObjectSP &cmd_sp, bool can_replace)
749d12aeab33bab559e138307f599077da3918a3238Greg Clayton{
750d12aeab33bab559e138307f599077da3918a3238Greg Clayton    if (name && name[0])
751d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
752d12aeab33bab559e138307f599077da3918a3238Greg Clayton        std::string name_sstr(name);
7532f1014bdef1dba6163afec1eb5a3076d7117bd9dEnrico Granata        bool found = (m_command_dict.find (name_sstr) != m_command_dict.end());
7542f1014bdef1dba6163afec1eb5a3076d7117bd9dEnrico Granata        if (found && !can_replace)
7552f1014bdef1dba6163afec1eb5a3076d7117bd9dEnrico Granata            return false;
7562f1014bdef1dba6163afec1eb5a3076d7117bd9dEnrico Granata        if (found && m_command_dict[name_sstr]->IsRemovable() == false)
7576d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata            return false;
758d12aeab33bab559e138307f599077da3918a3238Greg Clayton        m_command_dict[name_sstr] = cmd_sp;
759d12aeab33bab559e138307f599077da3918a3238Greg Clayton        return true;
760d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
761d12aeab33bab559e138307f599077da3918a3238Greg Clayton    return false;
762d12aeab33bab559e138307f599077da3918a3238Greg Clayton}
763d12aeab33bab559e138307f599077da3918a3238Greg Clayton
7646b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granatabool
7656010acef0cee54e044d4e7e472ef3d99e13c5045Enrico GranataCommandInterpreter::AddUserCommand (std::string name,
7666b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                    const lldb::CommandObjectSP &cmd_sp,
7676b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                    bool can_replace)
7686b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata{
7696010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata    if (!name.empty())
7706b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    {
7716010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata
7726010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata        const char* name_cstr = name.c_str();
7736010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata
7746010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata        // do not allow replacement of internal commands
7756010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata        if (CommandExists(name_cstr))
7766d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata        {
7776d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata            if (can_replace == false)
7786d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata                return false;
7796d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata            if (m_command_dict[name]->IsRemovable() == false)
7806d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata                return false;
7816d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata        }
7826d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata
7836d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata        if (UserCommandExists(name_cstr))
7846d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata        {
7856d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata            if (can_replace == false)
7866d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata                return false;
7876d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata            if (m_user_dict[name]->IsRemovable() == false)
7886d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata                return false;
7896d101887bb427b3c879c0c06775ab4dcb1cd265bEnrico Granata        }
7906010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata
7916010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata        m_user_dict[name] = cmd_sp;
7926b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        return true;
7936b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    }
7946b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    return false;
7956b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata}
796d12aeab33bab559e138307f599077da3918a3238Greg Clayton
797d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandObjectSP
798d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandInterpreter::GetCommandSPExact (const char *cmd_cstr, bool include_aliases)
799d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham{
80056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    Args cmd_words (cmd_cstr); // Break up the command string into words, in case it's a multi-word command.
80156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    CommandObjectSP ret_val;   // Possibly empty return value.
80256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice
80356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    if (cmd_cstr == NULL)
80456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        return ret_val;
80556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice
80656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    if (cmd_words.GetArgumentCount() == 1)
80756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        return GetCommandSP(cmd_cstr, include_aliases, true, NULL);
80856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    else
80956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    {
81056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        // We have a multi-word command (seemingly), so we need to do more work.
81156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        // First, get the cmd_obj_sp for the first word in the command.
81256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        CommandObjectSP cmd_obj_sp = GetCommandSP (cmd_words.GetArgumentAtIndex (0), include_aliases, true, NULL);
81356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        if (cmd_obj_sp.get() != NULL)
81456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        {
81556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // Loop through the rest of the words in the command (everything passed in was supposed to be part of a
81656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // command name), and find the appropriate sub-command SP for each command word....
81756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            size_t end = cmd_words.GetArgumentCount();
81856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            for (size_t j= 1; j < end; ++j)
81956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            {
82056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                if (cmd_obj_sp->IsMultiwordObject())
82156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                {
82213193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton                    cmd_obj_sp = cmd_obj_sp->GetSubcommandSP (cmd_words.GetArgumentAtIndex (j));
82356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    if (cmd_obj_sp.get() == NULL)
82456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                        // The sub-command name was invalid.  Fail and return the empty 'ret_val'.
82556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                        return ret_val;
82656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                }
82756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                else
82856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    // We have more words in the command name, but we don't have a multiword object. Fail and return
82956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    // empty 'ret_val'.
83056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    return ret_val;
83156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            }
83256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // We successfully looped through all the command words and got valid command objects for them.  Assign the
83356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            // last object retrieved to 'ret_val'.
83456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            ret_val = cmd_obj_sp;
83556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice        }
83656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    }
83756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice    return ret_val;
838d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham}
839d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
84024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject *
841d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandInterpreter::GetCommandObjectExact (const char *cmd_cstr, bool include_aliases)
84224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
843d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    return GetCommandSPExact (cmd_cstr, include_aliases).get();
844d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham}
845d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
846d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandObject *
847d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim InghamCommandInterpreter::GetCommandObject (const char *cmd_cstr, StringList *matches)
848d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham{
849d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    CommandObject *command_obj = GetCommandSP (cmd_cstr, false, true, matches).get();
850d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
851d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    // If we didn't find an exact match to the command string in the commands, look in
852d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    // the aliases.
853c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata
854c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    if (command_obj)
855c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata        return command_obj;
856d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
857c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    command_obj = GetCommandSP (cmd_cstr, true, true, matches).get();
858d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham
859c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    if (command_obj)
860c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata        return command_obj;
861c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata
862c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    // If there wasn't an exact match then look for an inexact one in just the commands
863c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    command_obj = GetCommandSP(cmd_cstr, false, false, NULL).get();
86411ac3162a6b54579d28cfe3968f2a3536a951c5bMatt Kopec
86511ac3162a6b54579d28cfe3968f2a3536a951c5bMatt Kopec    // Finally, if there wasn't an inexact match among the commands, look for an inexact
86611ac3162a6b54579d28cfe3968f2a3536a951c5bMatt Kopec    // match in both the commands and aliases.
867c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata
868c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    if (command_obj)
869c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    {
870c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata        if (matches)
871c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata            matches->AppendString(command_obj->GetCommandName());
872c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata        return command_obj;
873c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    }
874c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata
875c86ae088be2439a2eed608add5603b7a94db1032Enrico Granata    return GetCommandSP(cmd_cstr, true, false, matches).get();
87624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
87724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
87824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
87924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::CommandExists (const char *cmd)
88024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_command_dict.find(cmd) != m_command_dict.end();
88224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
88324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
88424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
8855ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline TiceCommandInterpreter::ProcessAliasOptionsArgs (lldb::CommandObjectSP &cmd_obj_sp,
8865ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                            const char *options_args,
8875ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                            OptionArgVectorSP &option_arg_vector_sp)
8885ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice{
8895ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    bool success = true;
8905ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
8915ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
8925ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (!options_args || (strlen (options_args) < 1))
8935ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        return true;
8945ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
8955ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    std::string options_string (options_args);
8965ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    Args args (options_args);
8975ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    CommandReturnObject result;
8985ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    // Check to see if the command being aliased can take any command options.
8995ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    Options *options = cmd_obj_sp->GetOptions ();
9005ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    if (options)
9015ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
9025ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        // See if any options were specified as part of the alias;  if so, handle them appropriately.
9035ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        options->NotifyOptionParsingStarting ();
9045ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        args.Unshift ("dummy_arg");
9055ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        args.ParseAliasOptions (*options, result, option_arg_vector, options_string);
9065ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        args.Shift ();
9075ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        if (result.Succeeded())
9085ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            options->VerifyPartialOptions (result);
9095ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted)
9105ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        {
9115ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            result.AppendError ("Unable to create requested alias.\n");
9125ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            return false;
9135ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        }
9145ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
9155ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
9167268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    if (!options_string.empty())
9175ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    {
9185ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        if (cmd_obj_sp->WantsRawCommandString ())
9195ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            option_arg_vector->push_back (OptionArgPair ("<argument>",
9205ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                          OptionArgValue (-1,
9215ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                                          options_string)));
9225ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        else
9235ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        {
92436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            const size_t argc = args.GetArgumentCount();
9255ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice            for (size_t i = 0; i < argc; ++i)
9265ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                if (strcmp (args.GetArgumentAtIndex (i), "") != 0)
9275ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                    option_arg_vector->push_back
9285ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                (OptionArgPair ("<argument>",
9295ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                OptionArgValue (-1,
9305ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice                                                                std::string (args.GetArgumentAtIndex (i)))));
9315ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice        }
9325ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    }
9335ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
9345ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice    return success;
9355ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice}
9365ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Tice
9375ddbe214153f60f8ab62ba98dea089a21f1779f3Caroline Ticebool
9381d4812cbb71af9e05250a4ffbcda4236275c82b4Jim InghamCommandInterpreter::GetAliasFullName (const char *cmd, std::string &full_name)
9391d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham{
9401d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham    bool exact_match  = (m_alias_dict.find(cmd) != m_alias_dict.end());
9411d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham    if (exact_match)
9421d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham    {
9431d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        full_name.assign(cmd);
9441d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        return exact_match;
9451d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham    }
9461d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham    else
9471d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham    {
9481d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        StringList matches;
9491d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        size_t num_alias_matches;
9501d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        num_alias_matches = CommandObject::AddNamesMatchingPartialString (m_alias_dict, cmd, matches);
9511d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        if (num_alias_matches == 1)
9521d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        {
9531d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            // Make sure this isn't shadowing a command in the regular command space:
9541d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            StringList regular_matches;
9551d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            const bool include_aliases = false;
9561d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            const bool exact = false;
9571d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            CommandObjectSP cmd_obj_sp(GetCommandSP (cmd, include_aliases, exact, &regular_matches));
9581d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            if (cmd_obj_sp || regular_matches.GetSize() > 0)
9591d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham                return false;
9601d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            else
9611d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            {
9621d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham                full_name.assign (matches.GetStringAtIndex(0));
9631d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham                return true;
9641d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            }
9651d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        }
9661d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham        else
9671d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            return false;
9681d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham    }
9691d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham}
9701d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham
9711d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Inghambool
97224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::AliasExists (const char *cmd)
97324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
97424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_alias_dict.find(cmd) != m_alias_dict.end();
97524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
97624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
97724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
97824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::UserCommandExists (const char *cmd)
97924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
98024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_user_dict.find(cmd) != m_user_dict.end();
98124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
98324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
98424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::AddAlias (const char *alias_name, CommandObjectSP& command_obj_sp)
98524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
986d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    command_obj_sp->SetIsAlias (true);
98724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_alias_dict[alias_name] = command_obj_sp;
98824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
98924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
99024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
99124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::RemoveAlias (const char *alias_name)
99224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
99324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator pos = m_alias_dict.find(alias_name);
99424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_alias_dict.end())
99524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
99624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_alias_dict.erase(pos);
99724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
99824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
99924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
100024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
100124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
100224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::RemoveUser (const char *alias_name)
100324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
100424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator pos = m_user_dict.find(alias_name);
100524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_user_dict.end())
100624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_user_dict.erase(pos);
100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return true;
100924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
101024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return false;
101124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
101224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
101324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
101424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetAliasHelp (const char *alias_name, const char *command_name, StreamString &help_string)
101524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
101624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    help_string.Printf ("'%s", command_name);
101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgVectorSP option_arg_vector_sp = GetAliasOptions (alias_name);
101824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1019b386d82334b65fb984348f2027b1cb7714de993fSean Callanan    if (option_arg_vector_sp)
102024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionArgVector *options = option_arg_vector_sp.get();
10223e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs        for (size_t i = 0; i < options->size(); ++i)
102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            OptionArgPair cur_option = (*options)[i];
102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string opt = cur_option.first;
102644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            OptionArgValue value_pair = cur_option.second;
102744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            std::string value = value_pair.second;
102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (opt.compare("<argument>") == 0)
102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                help_string.Printf (" %s", value.c_str());
103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
103324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
103424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                help_string.Printf (" %s", opt.c_str());
103524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if ((value.compare ("<no-argument>") != 0)
103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    && (value.compare ("<need-argument") != 0))
103724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    help_string.Printf (" %s", value.c_str());
103924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
104024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
104124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
104224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
104324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    help_string.Printf ("'");
104524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
104624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
104765124eac53b7a214906e8931be314e429bbbeb30Greg Claytonsize_t
104824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::FindLongestCommandWord (CommandObject::CommandMap &dict)
104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
105024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::const_iterator pos;
105165124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    CommandObject::CommandMap::const_iterator end = dict.end();
105265124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    size_t max_len = 0;
105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
105465124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    for (pos = dict.begin(); pos != end; ++pos)
105565124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    {
105665124eac53b7a214906e8931be314e429bbbeb30Greg Clayton        size_t len = pos->first.size();
105765124eac53b7a214906e8931be314e429bbbeb30Greg Clayton        if (max_len < len)
105865124eac53b7a214906e8931be314e429bbbeb30Greg Clayton            max_len = len;
105965124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    }
106065124eac53b7a214906e8931be314e429bbbeb30Greg Clayton    return max_len;
106124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
10646b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico GranataCommandInterpreter::GetHelp (CommandReturnObject &result,
10651ac6d1f9200a875cc4f761e278d29658599431c0Enrico Granata                             uint32_t cmd_types)
106624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::const_iterator pos;
106836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    size_t max_len = FindLongestCommandWord (m_command_dict);
10696b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
10706b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata    if ( (cmd_types & eCommandTypesBuiltin) == eCommandTypesBuiltin )
107124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
10726b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
10736b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        result.AppendMessage("The following is a list of built-in, permanent debugger commands:");
10746b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        result.AppendMessage("");
10756b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
10766b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        for (pos = m_command_dict.begin(); pos != m_command_dict.end(); ++pos)
10776b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        {
10786b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata            OutputFormattedHelpText (result.GetOutputStream(), pos->first.c_str(), "--", pos->second->GetHelp(),
10796b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                     max_len);
10806b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        }
10816b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        result.AppendMessage("");
10826b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata
108324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
108424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10857268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    if (!m_alias_dict.empty() && ( (cmd_types & eCommandTypesAliases) == eCommandTypesAliases ))
108624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1087e3663e8cd1fce64f73dd3740d65132a76ac97709Jim Ingham        result.AppendMessage("The following is a list of your current command abbreviations "
10889e4c3d7e23766be3d65b6637a2a52e455b5fed0aJohnny Chen                             "(see 'help command alias' for more info):");
108924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
109065124eac53b7a214906e8931be314e429bbbeb30Greg Clayton        max_len = FindLongestCommandWord (m_alias_dict);
109165124eac53b7a214906e8931be314e429bbbeb30Greg Clayton
109224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (pos = m_alias_dict.begin(); pos != m_alias_dict.end(); ++pos)
109324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
109424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString sstr;
109524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            StreamString translation_and_help;
109624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string entry_name = pos->first;
109724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string second_entry = pos->second.get()->GetCommandName();
109824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            GetAliasHelp (pos->first.c_str(), pos->second->GetCommandName(), sstr);
109924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
110024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            translation_and_help.Printf ("(%s)  %s", sstr.GetData(), pos->second->GetHelp());
110124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            OutputFormattedHelpText (result.GetOutputStream(), pos->first.c_str(), "--",
110224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     translation_and_help.GetData(), max_len);
110324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
110424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
110524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11077268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    if (!m_user_dict.empty() && ( (cmd_types & eCommandTypesUserDef) == eCommandTypesUserDef ))
110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage ("The following is a list of your current user-defined commands:");
111024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
11116b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata        max_len = FindLongestCommandWord (m_user_dict);
111224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        for (pos = m_user_dict.begin(); pos != m_user_dict.end(); ++pos)
111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
11146b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata            OutputFormattedHelpText (result.GetOutputStream(), pos->first.c_str(), "--", pos->second->GetHelp(),
11156b1596d81c34c6efb10ed51a3572d6b145b73f5bEnrico Granata                                     max_len);
111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.AppendMessage("");
111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    result.AppendMessage("For more information on any particular command, try 'help <command-name>'.");
112124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
112224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1123e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline TiceCommandObject *
1124e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline TiceCommandInterpreter::GetCommandObjectForCommand (std::string &command_string)
1125e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice{
1126e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // This function finds the final, lowest-level, alias-resolved command object whose 'Execute' function will
1127e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // eventually be invoked by the given command line.
1128e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1129e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    CommandObject *cmd_obj = NULL;
1130e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    std::string white_space (" \t\v");
1131e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    size_t start = command_string.find_first_not_of (white_space);
1132e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    size_t end = 0;
1133e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool done = false;
1134e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    while (!done)
1135e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1136e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (start != std::string::npos)
1137e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1138e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Get the next word from command_string.
1139e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            end = command_string.find_first_of (white_space, start);
1140e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (end == std::string::npos)
1141e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                end = command_string.size();
1142e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            std::string cmd_word = command_string.substr (start, end - start);
1143e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1144e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (cmd_obj == NULL)
1145e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // Since cmd_obj is NULL we are on our first time through this loop. Check to see if cmd_word is a valid
1146e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // command or alias.
1147e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                cmd_obj = GetCommandObject (cmd_word.c_str());
1148e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else if (cmd_obj->IsMultiwordObject ())
1149e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
1150e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // Our current object is a multi-word object; see if the cmd_word is a valid sub-command for our object.
115113193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton                CommandObject *sub_cmd_obj = cmd_obj->GetSubcommandObject (cmd_word.c_str());
1152e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                if (sub_cmd_obj)
1153e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    cmd_obj = sub_cmd_obj;
1154e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                else // cmd_word was not a valid sub-command word, so we are donee
1155e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    done = true;
1156e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1157e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
1158e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // We have a cmd_obj and it is not a multi-word object, so we are done.
1159e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                done = true;
1160e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1161e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // If we didn't find a valid command object, or our command object is not a multi-word object, or
1162e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // we are at the end of the command_string, then we are done.  Otherwise, find the start of the
1163e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // next word.
1164e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1165e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (!cmd_obj || !cmd_obj->IsMultiwordObject() || end >= command_string.size())
1166e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                done = true;
1167e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
1168e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                start = command_string.find_first_not_of (white_space, end);
1169e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1170e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
1171e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Unable to find any more words.
1172e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            done = true;
1173e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
1174e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1175e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (end == command_string.size())
1176e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        command_string.clear();
1177e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    else
1178e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        command_string = command_string.substr(end);
1179e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1180e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    return cmd_obj;
1181e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice}
1182e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
11839d855c667f8006ffcfd20dc8858fea6a0308b411Greg Claytonstatic const char *k_white_space = " \t\v";
11847268b4c8a444a59d42f4d765bd7292e62f41a651Greg Claytonstatic const char *k_valid_command_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_";
11859d855c667f8006ffcfd20dc8858fea6a0308b411Greg Claytonstatic void
11869d855c667f8006ffcfd20dc8858fea6a0308b411Greg ClaytonStripLeadingSpaces (std::string &s)
118724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11889d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    if (!s.empty())
11899d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    {
11909d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton        size_t pos = s.find_first_not_of (k_white_space);
11919d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton        if (pos == std::string::npos)
11929d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton            s.clear();
11939d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton        else if (pos == 0)
11949d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton            return;
11959d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton        s.erase (0, pos);
11969d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    }
11979d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton}
11989d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton
11993840cd75026758963e340ea3db65281759936a7aGreg Claytonstatic size_t
12003840cd75026758963e340ea3db65281759936a7aGreg ClaytonFindArgumentTerminator (const std::string &s)
12013840cd75026758963e340ea3db65281759936a7aGreg Clayton{
12023840cd75026758963e340ea3db65281759936a7aGreg Clayton    const size_t s_len = s.size();
12033840cd75026758963e340ea3db65281759936a7aGreg Clayton    size_t offset = 0;
12043840cd75026758963e340ea3db65281759936a7aGreg Clayton    while (offset < s_len)
12053840cd75026758963e340ea3db65281759936a7aGreg Clayton    {
12063840cd75026758963e340ea3db65281759936a7aGreg Clayton        size_t pos = s.find ("--", offset);
12073840cd75026758963e340ea3db65281759936a7aGreg Clayton        if (pos == std::string::npos)
12083840cd75026758963e340ea3db65281759936a7aGreg Clayton            break;
12093840cd75026758963e340ea3db65281759936a7aGreg Clayton        if (pos > 0)
12103840cd75026758963e340ea3db65281759936a7aGreg Clayton        {
12113840cd75026758963e340ea3db65281759936a7aGreg Clayton            if (isspace(s[pos-1]))
12123840cd75026758963e340ea3db65281759936a7aGreg Clayton            {
12133840cd75026758963e340ea3db65281759936a7aGreg Clayton                // Check if the string ends "\s--" (where \s is a space character)
12143840cd75026758963e340ea3db65281759936a7aGreg Clayton                // or if we have "\s--\s".
12153840cd75026758963e340ea3db65281759936a7aGreg Clayton                if ((pos + 2 >= s_len) || isspace(s[pos+2]))
12163840cd75026758963e340ea3db65281759936a7aGreg Clayton                {
12173840cd75026758963e340ea3db65281759936a7aGreg Clayton                    return pos;
12183840cd75026758963e340ea3db65281759936a7aGreg Clayton                }
12193840cd75026758963e340ea3db65281759936a7aGreg Clayton            }
12203840cd75026758963e340ea3db65281759936a7aGreg Clayton        }
12213840cd75026758963e340ea3db65281759936a7aGreg Clayton        offset = pos + 2;
12223840cd75026758963e340ea3db65281759936a7aGreg Clayton    }
12233840cd75026758963e340ea3db65281759936a7aGreg Clayton    return std::string::npos;
12243840cd75026758963e340ea3db65281759936a7aGreg Clayton}
12253840cd75026758963e340ea3db65281759936a7aGreg Clayton
12269d855c667f8006ffcfd20dc8858fea6a0308b411Greg Claytonstatic bool
12277268b4c8a444a59d42f4d765bd7292e62f41a651Greg ClaytonExtractCommand (std::string &command_string, std::string &command, std::string &suffix, char &quote_char)
12289d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton{
12297268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    command.clear();
12307268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    suffix.clear();
12319d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    StripLeadingSpaces (command_string);
12329d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton
12339d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    bool result = false;
12349d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    quote_char = '\0';
1235e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
12369d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    if (!command_string.empty())
1237e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
12389d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton        const char first_char = command_string[0];
12399d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton        if (first_char == '\'' || first_char == '"')
1240e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
12419d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton            quote_char = first_char;
12429d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton            const size_t end_quote_pos = command_string.find (quote_char, 1);
12439d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton            if (end_quote_pos == std::string::npos)
1244649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
12457268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                command.swap (command_string);
12469d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton                command_string.erase ();
1247649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
1248649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            else
1249649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
12507268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                command.assign (command_string, 1, end_quote_pos - 1);
12519d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton                if (end_quote_pos + 1 < command_string.size())
12529d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton                    command_string.erase (0, command_string.find_first_not_of (k_white_space, end_quote_pos + 1));
12539d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton                else
12549d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton                    command_string.erase ();
1255649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
1256e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1257e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
1258e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
12599d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton            const size_t first_space_pos = command_string.find_first_of (k_white_space);
12609d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton            if (first_space_pos == std::string::npos)
1261649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
12627268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                command.swap (command_string);
12639d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton                command_string.erase();
1264649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
1265649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            else
1266649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            {
12677268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                command.assign (command_string, 0, first_space_pos);
12687268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                command_string.erase(0, command_string.find_first_not_of (k_white_space, first_space_pos));
1269649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice            }
1270e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
12719d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton        result = true;
1272e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
12737268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton
12747268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton
12757268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    if (!command.empty())
12767268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    {
12777268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        // actual commands can't start with '-' or '_'
12787268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        if (command[0] != '-' && command[0] != '_')
12797268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        {
12807268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            size_t pos = command.find_first_not_of(k_valid_command_chars);
12817268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            if (pos > 0 && pos != std::string::npos)
12827268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            {
12837268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                suffix.assign (command.begin() + pos, command.end());
12847268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                command.erase (pos);
12857268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            }
12867268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        }
12877268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    }
12889d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton
12899d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton    return result;
1290e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice}
1291e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
12927268b4c8a444a59d42f4d765bd7292e62f41a651Greg ClaytonCommandObject *
12937268b4c8a444a59d42f4d765bd7292e62f41a651Greg ClaytonCommandInterpreter::BuildAliasResult (const char *alias_name,
12947268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                                      std::string &raw_input_string,
12957268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                                      std::string &alias_result,
12967268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                                      CommandReturnObject &result)
1297e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice{
12987268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    CommandObject *alias_cmd_obj = NULL;
1299e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    Args cmd_args (raw_input_string.c_str());
1300e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    alias_cmd_obj = GetCommandObject (alias_name);
1301e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    StreamString result_str;
1302e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1303e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (alias_cmd_obj)
1304e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1305e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        std::string alias_name_str = alias_name;
1306e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if ((cmd_args.GetArgumentCount() == 0)
1307e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            || (alias_name_str.compare (cmd_args.GetArgumentAtIndex(0)) != 0))
1308e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            cmd_args.Unshift (alias_name);
1309e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1310e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        result_str.Printf ("%s", alias_cmd_obj->GetCommandName ());
1311e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        OptionArgVectorSP option_arg_vector_sp = GetAliasOptions (alias_name);
131224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1313e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (option_arg_vector_sp.get())
1314e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1315e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
1316e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
13173e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs            for (size_t i = 0; i < option_arg_vector->size(); ++i)
1318e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
1319e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                OptionArgPair option_pair = (*option_arg_vector)[i];
1320e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                OptionArgValue value_pair = option_pair.second;
1321e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                int value_type = value_pair.first;
1322e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                std::string option = option_pair.first;
1323e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                std::string value = value_pair.second;
1324e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                if (option.compare ("<argument>") == 0)
1325e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    result_str.Printf (" %s", value.c_str());
1326e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                else
1327e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                {
1328e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    result_str.Printf (" %s", option.c_str());
1329e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    if (value_type != optional_argument)
1330e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        result_str.Printf (" ");
1331e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    if (value.compare ("<no_argument>") != 0)
1332e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    {
1333e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        int index = GetOptionArgumentPosition (value.c_str());
1334e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        if (index == 0)
1335e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result_str.Printf ("%s", value.c_str());
1336e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        else if (index >= cmd_args.GetArgumentCount())
1337e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        {
1338e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1339e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result.AppendErrorWithFormat
1340e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            ("Not enough arguments provided; you need at least %d arguments to use this alias.\n",
1341e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                             index);
1342e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result.SetStatus (eReturnStatusFailed);
13437268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                            return alias_cmd_obj;
1344e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        }
1345e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        else
1346e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        {
1347e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            size_t strpos = raw_input_string.find (cmd_args.GetArgumentAtIndex (index));
1348e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            if (strpos != std::string::npos)
1349e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                raw_input_string = raw_input_string.erase (strpos,
1350e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                                                          strlen (cmd_args.GetArgumentAtIndex (index)));
1351e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                            result_str.Printf ("%s", cmd_args.GetArgumentAtIndex (index));
1352e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        }
1353e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    }
1354e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                }
1355e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1356e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1357e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1358e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        alias_result = result_str.GetData();
1359e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
13607268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    return alias_cmd_obj;
1361e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice}
1362e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1363f5c0c72346eb8137107dbee95b12efb700117c13Greg ClaytonError
1364f5c0c72346eb8137107dbee95b12efb700117c13Greg ClaytonCommandInterpreter::PreprocessCommand (std::string &command)
1365f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton{
1366f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // The command preprocessor needs to do things to the command
1367f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // line before any parsing of arguments or anything else is done.
1368f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // The only current stuff that gets proprocessed is anyting enclosed
1369f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // in backtick ('`') characters is evaluated as an expression and
1370f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // the result of the expression must be a scalar that can be substituted
1371f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // into the command. An example would be:
1372f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    // (lldb) memory read `$rsp + 20`
1373f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    Error error; // Error for any expressions that might not evaluate
1374f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    size_t start_backtick;
1375f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    size_t pos = 0;
1376f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    while ((start_backtick = command.find ('`', pos)) != std::string::npos)
1377f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    {
1378f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        if (start_backtick > 0 && command[start_backtick-1] == '\\')
1379f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        {
1380f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            // The backtick was preceeded by a '\' character, remove the slash
1381f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            // and don't treat the backtick as the start of an expression
1382f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            command.erase(start_backtick-1, 1);
1383f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            // No need to add one to start_backtick since we just deleted a char
1384f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            pos = start_backtick;
1385f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        }
1386f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        else
1387f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        {
1388f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            const size_t expr_content_start = start_backtick + 1;
1389f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            const size_t end_backtick = command.find ('`', expr_content_start);
1390f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            if (end_backtick == std::string::npos)
1391f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                return error;
1392f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            else if (end_backtick == expr_content_start)
1393f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            {
1394f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                // Empty expression (two backticks in a row)
1395f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                command.erase (start_backtick, 2);
1396f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            }
1397f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            else
1398f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            {
1399f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                std::string expr_str (command, expr_content_start, end_backtick - expr_content_start);
1400f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1401bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton                ExecutionContext exe_ctx(GetExecutionContext());
1402bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton                Target *target = exe_ctx.GetTargetPtr();
1403b09f8479229d034c63ba8670f0507466141d61b8Johnny Chen                // Get a dummy target to allow for calculator mode while processing backticks.
1404b09f8479229d034c63ba8670f0507466141d61b8Johnny Chen                // This also helps break the infinite loop caused when target is null.
1405b09f8479229d034c63ba8670f0507466141d61b8Johnny Chen                if (!target)
1406b09f8479229d034c63ba8670f0507466141d61b8Johnny Chen                    target = Host::GetDummyTarget(GetDebugger()).get();
1407f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                if (target)
1408f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                {
1409f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    ValueObjectSP expr_result_valobj_sp;
1410d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
141147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham                    EvaluateExpressionOptions options;
1412d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                    options.SetCoerceToId(false)
1413d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                    .SetUnwindOnError(true)
1414b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                    .SetIgnoreBreakpoints(true)
1415d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                    .SetKeepInMemory(false)
141647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham                    .SetRunOthers(true)
141747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham                    .SetTimeoutUsec(0);
1418d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
1419f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    ExecutionResults expr_result = target->EvaluateExpression (expr_str.c_str(),
1420d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                                                                               exe_ctx.GetFramePtr(),
14216cca9695637b27bd583eaae310d5c09dede7cc49Enrico Granata                                                                               expr_result_valobj_sp,
1422d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata                                                                               options);
1423d27026e46d8430fb451d85ac161a8492e1930245Enrico Granata
1424f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    if (expr_result == eExecutionCompleted)
1425f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    {
1426f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        Scalar scalar;
1427f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        if (expr_result_valobj_sp->ResolveValue (scalar))
1428f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        {
1429f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            command.erase (start_backtick, end_backtick - start_backtick + 1);
1430f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            StreamString value_strm;
1431f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            const bool show_type = false;
1432f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            scalar.GetValue (&value_strm, show_type);
1433f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            size_t value_string_size = value_strm.GetSize();
1434f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            if (value_string_size)
1435f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            {
1436f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                command.insert (start_backtick, value_strm.GetData(), value_string_size);
1437f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                pos = start_backtick + value_string_size;
1438f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                continue;
1439f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            }
1440f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            else
1441f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            {
1442f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                error.SetErrorStringWithFormat("expression value didn't result in a scalar value for the expression '%s'", expr_str.c_str());
1443f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            }
1444f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        }
1445f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        else
1446f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        {
1447f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            error.SetErrorStringWithFormat("expression value didn't result in a scalar value for the expression '%s'", expr_str.c_str());
1448f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        }
1449f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    }
1450f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    else
1451f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    {
1452f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        if (expr_result_valobj_sp)
1453f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            error = expr_result_valobj_sp->GetError();
1454f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        if (error.Success())
1455f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        {
1456f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1457f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            switch (expr_result)
1458f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            {
1459f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionSetupError:
1460f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression setup error for the expression '%s'", expr_str.c_str());
1461f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1462f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionCompleted:
1463f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1464f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionDiscarded:
1465f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression discarded for the expression '%s'", expr_str.c_str());
1466f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1467f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionInterrupted:
1468f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression interrupted for the expression '%s'", expr_str.c_str());
1469f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1470b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                                case eExecutionHitBreakpoint:
1471b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                                    error.SetErrorStringWithFormat("expression hit breakpoint for the expression '%s'", expr_str.c_str());
1472b794020ffbd6473c59a6e98be044df50abf7fc30Jim Ingham                                    break;
1473f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                case eExecutionTimedOut:
1474f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    error.SetErrorStringWithFormat("expression timed out for the expression '%s'", expr_str.c_str());
1475f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                                    break;
1476f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                            }
1477f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                        }
1478f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                    }
1479f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                }
1480f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            }
1481f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton            if (error.Fail())
1482f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton                break;
1483f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        }
1484f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    }
1485f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    return error;
1486f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton}
1487f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1488f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1489e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Ticebool
1490e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline TiceCommandInterpreter::HandleCommand (const char *command_line,
149101bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata                                   LazyBool lazy_add_to_history,
1492e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                   CommandReturnObject &result,
1493949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                   ExecutionContext *override_context,
14948bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                   bool repeat_on_empty_command,
14958bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                   bool no_context_switching)
1496949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1497e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice{
1498949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1499e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool done = false;
1500e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    CommandObject *cmd_obj = NULL;
1501e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool wants_raw_input = false;
1502e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    std::string command_string (command_line);
15036247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    std::string original_command_string (command_line);
1504e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1505952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log (lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_COMMANDS));
1506e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    Host::SetCrashDescriptionWithFormat ("HandleCommand(command = \"%s\")", command_line);
1507e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton
1508e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    // Make a scoped cleanup object that will clear the crash description string
1509e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton    // on exit of this function.
15101a102087f54079c25c8827afac6153a44ca535daEnrico Granata    lldb_utility::CleanUp <const char *> crash_description_cleanup(NULL, Host::SetCrashDescription);
1511e98ac25604b3d967158917f6fdd5289b3096fd80Greg Clayton
1512e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (log)
1513e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("Processing command: %s", command_line);
151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1515abab14b9b6021781a8a6aef258ebfb7e617ba3e2Jim Ingham    Timer scoped_timer (__PRETTY_FUNCTION__, "Handling command: %s.", command_line);
1516abab14b9b6021781a8a6aef258ebfb7e617ba3e2Jim Ingham
15178bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen    if (!no_context_switching)
15188bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen        UpdateExecutionContext (override_context);
151901bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata
152001bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata    bool add_to_history;
152101bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata    if (lazy_add_to_history == eLazyBoolCalculate)
152201bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata        add_to_history = (m_command_source_depth == 0);
152301bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata    else
152401bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata        add_to_history = (lazy_add_to_history == eLazyBoolYes);
152501bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata
1526949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    bool empty_command = false;
1527949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    bool comment_command = false;
1528949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (command_string.empty())
1529949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        empty_command = true;
1530949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    else
153124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1532949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        const char *k_space_characters = "\t\n\v\f\r ";
1533949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1534949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        size_t non_space = command_string.find_first_not_of (k_space_characters);
1535949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // Check for empty line or comment line (lines whose first
1536949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // non-space character is the comment character for this interpreter)
1537949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (non_space == std::string::npos)
1538949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            empty_command = true;
1539949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        else if (command_string[non_space] == m_comment_char)
1540949d5acde6684b5824a26034457410cdf3823dfeJim Ingham             comment_command = true;
1541b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        else if (command_string[non_space] == CommandHistory::g_repeat_char)
15426247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        {
1543b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            const char *history_string = m_command_history.FindString(command_string.c_str() + non_space);
15446247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            if (history_string == NULL)
15456247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            {
15466247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                result.AppendErrorWithFormat ("Could not find entry: %s in history", command_string.c_str());
15476247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                result.SetStatus(eReturnStatusFailed);
15486247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                return false;
15496247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            }
15506247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            add_to_history = false;
15516247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            command_string = history_string;
15526247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            original_command_string = history_string;
15536247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        }
1554949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
1555949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
1556949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (empty_command)
1557949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
1558949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (repeat_on_empty_command)
155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
1560b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            if (m_command_history.IsEmpty())
15615d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham            {
1562949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.AppendError ("empty command");
1563949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.SetStatus(eReturnStatusFailed);
15645d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham                return false;
15655d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham            }
1566949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            else
1567949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
1568949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                command_line = m_repeat_command.c_str();
1569949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                command_string = command_line;
15706247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                original_command_string = command_line;
1571949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                if (m_repeat_command.empty())
1572949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                {
1573949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    result.AppendErrorWithFormat("No auto repeat.\n");
1574949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    result.SetStatus (eReturnStatusFailed);
1575949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    return false;
1576949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                }
1577949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
1578949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            add_to_history = false;
1579949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
1580949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        else
1581949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
1582949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.SetStatus (eReturnStatusSuccessFinishNoResult);
1583949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            return true;
158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1585949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
1586949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    else if (comment_command)
1587949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
1588949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        result.SetStatus (eReturnStatusSuccessFinishNoResult);
1589949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        return true;
159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1591649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice
1592f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1593f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    Error error (PreprocessCommand (command_string));
1594f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton
1595f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    if (error.Fail())
1596f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    {
1597f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        result.AppendError (error.AsCString());
1598f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        result.SetStatus(eReturnStatusFailed);
1599f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton        return false;
1600f5c0c72346eb8137107dbee95b12efb700117c13Greg Clayton    }
1601e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Phase 1.
1602e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1603e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Before we do ANY kind of argument processing, etc. we need to figure out what the real/final command object
1604e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // is for the specified command, and whether or not it wants raw input.  This gets complicated by the fact that
1605e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // the user could have specified an alias, and in translating the alias there may also be command options and/or
1606e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // even data (including raw text strings) that need to be found and inserted into the command line as part of
1607e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // the translation.  So this first step is plain look-up & replacement, resulting in three things:  1). the command
16085d187e5495ee17f6763337a6ae28c2a7b07e4945Greg Clayton    // object whose Execute method will actually be called; 2). a revised command string, with all substitutions &
1609e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // replacements taken care of; 3). whether or not the Execute function wants raw input or not.
1610e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1611e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    StreamString revised_command_line;
1612ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice    size_t actual_cmd_name_len = 0;
16137268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    std::string next_word;
16144bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas    StringList matches;
1615e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    while (!done)
161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
1617649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice        char quote_char = '\0';
16187268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        std::string suffix;
16197268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        ExtractCommand (command_string, next_word, suffix, quote_char);
16207268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        if (cmd_obj == NULL)
1621e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
16221d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            std::string full_name;
16231d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham            if (GetAliasFullName(next_word.c_str(), full_name))
162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
16257268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                std::string alias_result;
16261d4812cbb71af9e05250a4ffbcda4236275c82b4Jim Ingham                cmd_obj = BuildAliasResult (full_name.c_str(), command_string, alias_result, result);
16277268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                revised_command_line.Printf ("%s", alias_result.c_str());
16287268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                if (cmd_obj)
16297268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                {
16307268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    wants_raw_input = cmd_obj->WantsRawCommandString ();
16317268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    actual_cmd_name_len = strlen (cmd_obj->GetCommandName());
16327268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                }
1633e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1634e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
1635e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
16364bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas                cmd_obj = GetCommandObject (next_word.c_str(), &matches);
16377268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                if (cmd_obj)
16387268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                {
16397268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    actual_cmd_name_len += next_word.length();
16407268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    revised_command_line.Printf ("%s", next_word.c_str());
16417268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    wants_raw_input = cmd_obj->WantsRawCommandString ();
16427268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                }
16437268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                else
16447268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                {
16457268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    revised_command_line.Printf ("%s", next_word.c_str());
16467268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                }
1647e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1648e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
16497268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        else
1650e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
16517268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            if (cmd_obj->IsMultiwordObject ())
1652e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
165313193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton                CommandObject *sub_cmd_obj = cmd_obj->GetSubcommandObject (next_word.c_str());
16547268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                if (sub_cmd_obj)
16557268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                {
16567268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    actual_cmd_name_len += next_word.length() + 1;
16577268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    revised_command_line.Printf (" %s", next_word.c_str());
16587268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    cmd_obj = sub_cmd_obj;
16597268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    wants_raw_input = cmd_obj->WantsRawCommandString ();
16607268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                }
16617268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                else
16627268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                {
16637268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    if (quote_char)
16647268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                        revised_command_line.Printf (" %c%s%s%c", quote_char, next_word.c_str(), suffix.c_str(), quote_char);
16657268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    else
16667268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                        revised_command_line.Printf (" %s%s", next_word.c_str(), suffix.c_str());
16677268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    done = true;
16687268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                }
1669e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1670e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
1671e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
16729d855c667f8006ffcfd20dc8858fea6a0308b411Greg Clayton                if (quote_char)
16737268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    revised_command_line.Printf (" %c%s%s%c", quote_char, next_word.c_str(), suffix.c_str(), quote_char);
1674649116c40a40319fd627f3543cbe7eaf47869f8dCaroline Tice                else
16757268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    revised_command_line.Printf (" %s%s", next_word.c_str(), suffix.c_str());
1676e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                done = true;
1677e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
1678e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1679e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1680e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (cmd_obj == NULL)
1681e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
168236da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            const size_t num_matches = matches.GetSize();
16834bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas            if (matches.GetSize() > 1) {
168436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                StreamString error_msg;
168536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                error_msg.Printf ("Ambiguous command '%s'. Possible matches:\n", next_word.c_str());
16864bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas
16874bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas                for (uint32_t i = 0; i < num_matches; ++i) {
168836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                    error_msg.Printf ("\t%s\n", matches.GetStringAtIndex(i));
16894bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas                }
169036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                result.AppendRawError (error_msg.GetString().c_str());
16914bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas            } else {
16924bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas                // We didn't have only one match, otherwise we wouldn't get here.
16934bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas                assert(num_matches == 0);
16944bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas                result.AppendErrorWithFormat ("'%s' is not a valid command.\n", next_word.c_str());
16954bc8d16c0aeb8645a5ac70908639ca1e55018aabFilipe Cabecinhas            }
1696e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.SetStatus (eReturnStatusFailed);
1697e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            return false;
1698e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1699e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
17007268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        if (cmd_obj->IsMultiwordObject ())
17017268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        {
17027268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            if (!suffix.empty())
17037268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            {
17047268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton
1705c8b6859869e128bad1607fb12b20b43f4a09a2bdEnrico Granata                result.AppendErrorWithFormat ("command '%s' did not recognize '%s%s%s' as valid (subcommand might be invalid).\n",
1706c8b6859869e128bad1607fb12b20b43f4a09a2bdEnrico Granata                                              cmd_obj->GetCommandName(),
1707c8b6859869e128bad1607fb12b20b43f4a09a2bdEnrico Granata                                              next_word.empty() ? "" : next_word.c_str(),
1708c8b6859869e128bad1607fb12b20b43f4a09a2bdEnrico Granata                                              next_word.empty() ? " -- " : " ",
17097268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                                              suffix.c_str());
17107268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                result.SetStatus (eReturnStatusFailed);
17117268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                return false;
17127268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            }
17137268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        }
17147268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        else
17157268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        {
17167268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            // If we found a normal command, we are done
17177268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            done = true;
17187268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            if (!suffix.empty())
17197268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            {
17207268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                switch (suffix[0])
17217268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                {
17227268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                case '/':
17237268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    // GDB format suffixes
1724d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                    {
1725d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                        Options *command_options = cmd_obj->GetOptions();
1726d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                        if (command_options && command_options->SupportsLongOption("gdb-format"))
1727d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                        {
17283840cd75026758963e340ea3db65281759936a7aGreg Clayton                            std::string gdb_format_option ("--gdb-format=");
17293840cd75026758963e340ea3db65281759936a7aGreg Clayton                            gdb_format_option += (suffix.c_str() + 1);
17303840cd75026758963e340ea3db65281759936a7aGreg Clayton
17313840cd75026758963e340ea3db65281759936a7aGreg Clayton                            bool inserted = false;
17323840cd75026758963e340ea3db65281759936a7aGreg Clayton                            std::string &cmd = revised_command_line.GetString();
17333840cd75026758963e340ea3db65281759936a7aGreg Clayton                            size_t arg_terminator_idx = FindArgumentTerminator (cmd);
17343840cd75026758963e340ea3db65281759936a7aGreg Clayton                            if (arg_terminator_idx != std::string::npos)
17353840cd75026758963e340ea3db65281759936a7aGreg Clayton                            {
17363840cd75026758963e340ea3db65281759936a7aGreg Clayton                                // Insert the gdb format option before the "--" that terminates options
17373840cd75026758963e340ea3db65281759936a7aGreg Clayton                                gdb_format_option.append(1,' ');
17383840cd75026758963e340ea3db65281759936a7aGreg Clayton                                cmd.insert(arg_terminator_idx, gdb_format_option);
17393840cd75026758963e340ea3db65281759936a7aGreg Clayton                                inserted = true;
17403840cd75026758963e340ea3db65281759936a7aGreg Clayton                            }
17413840cd75026758963e340ea3db65281759936a7aGreg Clayton
17423840cd75026758963e340ea3db65281759936a7aGreg Clayton                            if (!inserted)
17433840cd75026758963e340ea3db65281759936a7aGreg Clayton                                revised_command_line.Printf (" %s", gdb_format_option.c_str());
17443840cd75026758963e340ea3db65281759936a7aGreg Clayton
17453840cd75026758963e340ea3db65281759936a7aGreg Clayton                            if (wants_raw_input && FindArgumentTerminator(cmd) == std::string::npos)
17463840cd75026758963e340ea3db65281759936a7aGreg Clayton                                revised_command_line.PutCString (" --");
1747d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                        }
1748d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                        else
1749d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                        {
1750d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                            result.AppendErrorWithFormat ("the '%s' command doesn't support the --gdb-format option\n",
1751d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                                                          cmd_obj->GetCommandName());
1752d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                            result.SetStatus (eReturnStatusFailed);
1753d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                            return false;
1754d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                        }
1755d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton                    }
17567268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                    break;
17578ca450b8718d326a93a53a8a3808f8bba0a2aa7eJohnny Chen
17588ca450b8718d326a93a53a8a3808f8bba0a2aa7eJohnny Chen                default:
17598ca450b8718d326a93a53a8a3808f8bba0a2aa7eJohnny Chen                    result.AppendErrorWithFormat ("unknown command shorthand suffix: '%s'\n",
17608ca450b8718d326a93a53a8a3808f8bba0a2aa7eJohnny Chen                                                  suffix.c_str());
17618ca450b8718d326a93a53a8a3808f8bba0a2aa7eJohnny Chen                    result.SetStatus (eReturnStatusFailed);
17628ca450b8718d326a93a53a8a3808f8bba0a2aa7eJohnny Chen                    return false;
17638ca450b8718d326a93a53a8a3808f8bba0a2aa7eJohnny Chen
17647268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton                }
17657268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton            }
17667268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton        }
1767e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (command_string.length() == 0)
1768e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            done = true;
176944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
1770e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17727268b4c8a444a59d42f4d765bd7292e62f41a651Greg Clayton    if (!command_string.empty())
1773e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        revised_command_line.Printf (" %s", command_string.c_str());
17745d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham
1775e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // End of Phase 1.
1776e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // At this point cmd_obj should contain the CommandObject whose Execute method will be called, if the command
1777e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // specified was valid; revised_command_line contains the complete command line (including command name(s)),
1778e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // fully translated with all substitutions & translations taken care of (still in raw text format); and
1779e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // wants_raw_input specifies whether the Execute method expects raw input or not.
17805d9cbd4d92831b9f255b4e5b5304bfd0cdff29c7Jim Ingham
1781e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1782e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (log)
1783e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1784e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("HandleCommand, cmd_obj : '%s'", cmd_obj ? cmd_obj->GetCommandName() : "<not found>");
1785e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("HandleCommand, revised_command_line: '%s'", revised_command_line.GetData());
1786e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        log->Printf ("HandleCommand, wants_raw_input:'%s'", wants_raw_input ? "True" : "False");
1787e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
178824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1789e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Phase 2.
1790e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // Take care of things like setting up the history command & calling the appropriate Execute method on the
1791e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    // CommandObject, with the appropriate arguments.
1792e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1793e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    if (cmd_obj != NULL)
1794e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1795e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (add_to_history)
1796e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1797e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            Args command_args (revised_command_line.GetData());
1798e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            const char *repeat_command = cmd_obj->GetRepeatCommand(command_args, 0);
1799e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (repeat_command != NULL)
1800e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                m_repeat_command.assign(repeat_command);
1801e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            else
18026247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                m_repeat_command.assign(original_command_string.c_str());
1803e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1804b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            m_command_history.AppendString (original_command_string);
1805e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
1806e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1807e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        command_string = revised_command_line.GetData();
1808e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        std::string command_name (cmd_obj->GetCommandName());
1809ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice        std::string remainder;
1810ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice        if (actual_cmd_name_len < command_string.length())
1811ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice            remainder = command_string.substr (actual_cmd_name_len);  // Note: 'actual_cmd_name_len' may be considerably shorter
1812ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                                                           // than cmd_obj->GetCommandName(), because name completion
1813ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                                                           // allows users to enter short versions of the names,
1814ea6e3dfa37366e49d192280579da67607a7eb226Caroline Tice                                                           // e.g. 'br s' for 'breakpoint set'.
1815e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1816e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // Remove any initial spaces
1817e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        std::string white_space (" \t\v");
1818e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        size_t pos = remainder.find_first_not_of (white_space);
1819e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (pos != 0 && pos != std::string::npos)
182091c9dcfd3ff3c3b13276d4ce8ac0488e49721105Greg Clayton            remainder.erase(0, pos);
1821e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1822e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (log)
182324c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda            log->Printf ("HandleCommand, command line after removing command name(s): '%s'", remainder.c_str());
1824e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1825da26bd203cbb104291b39891febf7481794f205fJim Ingham        cmd_obj->Execute (remainder.c_str(), result);
1826e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
1827e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    else
1828e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
1829e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // We didn't find the first command object, so complete the first argument.
1830e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        Args command_args (revised_command_line.GetData());
1831e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        StringList matches;
1832e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        int num_matches;
1833e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        int cursor_index = 0;
1834e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        int cursor_char_position = strlen (command_args.GetArgumentAtIndex(0));
1835e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        bool word_complete;
1836e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        num_matches = HandleCompletionMatches (command_args,
1837e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               cursor_index,
1838e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               cursor_char_position,
1839e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               0,
1840e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               -1,
1841e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               word_complete,
1842e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                               matches);
1843e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1844e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (num_matches > 0)
1845e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
1846e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            std::string error_msg;
1847e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.assign ("ambiguous command '");
1848e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append(command_args.GetArgumentAtIndex(0));
1849e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append ("'.");
1850e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1851e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append (" Possible completions:");
1852e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            for (int i = 0; i < num_matches; i++)
1853e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
1854e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                error_msg.append ("\n\t");
1855e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                error_msg.append (matches.GetStringAtIndex (i));
185624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
1857e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            error_msg.append ("\n");
185836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            result.AppendRawError (error_msg.c_str());
185924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
1860e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
1861e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendErrorWithFormat ("Unrecognized command '%s'.\n", command_args.GetArgumentAtIndex (0));
1862e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
1863e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        result.SetStatus (eReturnStatusFailed);
186424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
1865e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
186624c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda    if (log)
186724c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda      log->Printf ("HandleCommand, command %s", (result.Succeeded() ? "succeeded" : "did not succeed"));
186824c991cab6651b0f87809b033d971e6e5ca19c39Jason Molenda
186924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return result.Succeeded();
187024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
187124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
187224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
187324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HandleCompletionMatches (Args &parsed_line,
187424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int &cursor_index,
187524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int &cursor_char_position,
187624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int match_start_point,
187724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             int max_return_elements,
1878802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                             bool &word_complete,
187924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             StringList &matches)
188024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
188124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int num_command_matches = 0;
188224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool look_for_subcommand = false;
1883802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham
1884802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    // For any of the command completions a unique match will be a complete word.
1885802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    word_complete = true;
188624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
188724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cursor_index == -1)
188824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
188924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We got nothing on the command line, so return the list of commands
1890d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        bool include_aliases = true;
189124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_command_matches = GetCommandNamesMatchingPartialString ("", include_aliases, matches);
189224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
189324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (cursor_index == 0)
189424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
189524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The cursor is in the first argument, so just do a lookup in the dictionary.
1896d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        CommandObject *cmd_obj = GetCommandObject (parsed_line.GetArgumentAtIndex(0), &matches);
189724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        num_command_matches = matches.GetSize();
189824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
189924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (num_command_matches == 1
190024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && cmd_obj && cmd_obj->IsMultiwordObject()
190124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && matches.GetStringAtIndex(0) != NULL
190224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            && strcmp (parsed_line.GetArgumentAtIndex(0), matches.GetStringAtIndex(0)) == 0)
190324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
190424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            look_for_subcommand = true;
190524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            num_command_matches = 0;
190624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            matches.DeleteStringAtIndex(0);
190724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            parsed_line.AppendArgument ("");
190824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_index++;
190924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_char_position = 0;
191024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
191124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
191224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
191324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cursor_index > 0 || look_for_subcommand)
191424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
191524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We are completing further on into a commands arguments, so find the command and tell it
191624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // to complete the command.
191724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // First see if there is a matching initial command:
1918d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham        CommandObject *command_object = GetCommandObject (parsed_line.GetArgumentAtIndex(0));
191924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (command_object == NULL)
192024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
192124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
192224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
192324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
192424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
192524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            parsed_line.Shift();
192624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_index--;
1927238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            num_command_matches = command_object->HandleCompletion (parsed_line,
192863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                    cursor_index,
192963094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                    cursor_char_position,
193063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                    match_start_point,
1931802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                                    max_return_elements,
1932802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                                    word_complete,
193324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                                                    matches);
193424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
193524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
193624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
193724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_command_matches;
193824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
193924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
194024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
194124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
194224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HandleCompletion (const char *current_line,
194324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      const char *cursor,
194424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      const char *last_char,
194524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      int match_start_point,
194624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      int max_return_elements,
194724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                      StringList &matches)
194824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
194924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // We parse the argument up to the cursor, so the last argument in parsed_line is
195024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // the one containing the cursor, and the cursor is after the last character.
195124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
195224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args parsed_line(current_line, last_char - current_line);
195324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args partial_parsed_line(current_line, cursor - current_line);
195424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19556247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    // Don't complete comments, and if the line we are completing is just the history repeat character,
19566247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    // substitute the appropriate history line.
19576247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    const char *first_arg = parsed_line.GetArgumentAtIndex(0);
19586247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    if (first_arg)
19596247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    {
19606247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        if (first_arg[0] == m_comment_char)
19616247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            return 0;
1962b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata        else if (first_arg[0] == CommandHistory::g_repeat_char)
19636247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        {
1964b1fb72761226817e7f687eca21cbe9c0a3ec4cf6Enrico Granata            const char *history_string = m_command_history.FindString (first_arg);
19656247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            if (history_string != NULL)
19666247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            {
19676247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                matches.Clear();
19686247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                matches.InsertStringAtIndex(0, history_string);
19696247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                return -2;
19706247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            }
19716247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham            else
19726247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham                return 0;
19736247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
19746247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham        }
19756247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham    }
19766247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
19776247dbee41ec51e9a082df7e86269c0f47f28160Jim Ingham
197824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int num_args = partial_parsed_line.GetArgumentCount();
197924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int cursor_index = partial_parsed_line.GetArgumentCount() - 1;
198024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int cursor_char_position;
198124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
198224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cursor_index == -1)
198324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cursor_char_position = 0;
198424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
198524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cursor_char_position = strlen (partial_parsed_line.GetArgumentAtIndex(cursor_index));
1986cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham
1987cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham    if (cursor > current_line && cursor[-1] == ' ')
1988cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham    {
1989cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // We are just after a space.  If we are in an argument, then we will continue
1990cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // parsing, but if we are between arguments, then we have to complete whatever the next
1991cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // element would be.
1992cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // We can distinguish the two cases because if we are in an argument (e.g. because the space is
1993cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        // protected by a quote) then the space will also be in the parsed argument...
1994cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham
1995cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        const char *current_elem = partial_parsed_line.GetArgumentAtIndex(cursor_index);
1996cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        if (cursor_char_position == 0 || current_elem[cursor_char_position - 1] != ' ')
1997cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        {
1998cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham            parsed_line.InsertArgumentAtIndex(cursor_index + 1, "", '"');
1999cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham            cursor_index++;
2000cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham            cursor_char_position = 0;
2001cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham        }
2002cf03765e00f712f3421eee1d0d3c623b29fa188fJim Ingham    }
200324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int num_command_matches;
200524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    matches.Clear();
200724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
200824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Only max_return_elements == -1 is supported at present:
200924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    assert (max_return_elements == -1);
2010802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    bool word_complete;
201163094e0bb161580564954dee512955c1c79d3476Greg Clayton    num_command_matches = HandleCompletionMatches (parsed_line,
201263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   cursor_index,
201363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   cursor_char_position,
201463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   match_start_point,
2015802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                   max_return_elements,
2016802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                   word_complete,
201763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                   matches);
201824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
201924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_command_matches <= 0)
202024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return num_command_matches;
202124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
202224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (num_args == 0)
202324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
202424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we got an empty string, insert nothing.
202524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.InsertStringAtIndex(0, "");
202624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
202724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
202824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
202924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Now figure out if there is a common substring, and if so put that in element 0, otherwise
203024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // put an empty string in element 0.
203124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string command_partial_str;
203224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (cursor_index >= 0)
2033e3663e8cd1fce64f73dd3740d65132a76ac97709Jim Ingham            command_partial_str.assign(parsed_line.GetArgumentAtIndex(cursor_index),
2034e3663e8cd1fce64f73dd3740d65132a76ac97709Jim Ingham                                       parsed_line.GetArgumentAtIndex(cursor_index) + cursor_char_position);
203524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
203624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        std::string common_prefix;
203724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.LongestCommonPrefix (common_prefix);
203836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const size_t partial_name_len = command_partial_str.size();
203924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
204024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we matched a unique single command, add a space...
2041802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham        // Only do this if the completer told us this was a complete word, however...
2042802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham        if (num_command_matches == 1 && word_complete)
204324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
204424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            char quote_char = parsed_line.GetArgumentQuoteCharAtIndex(cursor_index);
204524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (quote_char != '\0')
204624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                common_prefix.push_back(quote_char);
204724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
204824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            common_prefix.push_back(' ');
204924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
205024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        common_prefix.erase (0, partial_name_len);
205124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.InsertStringAtIndex(0, common_prefix.c_str());
205224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
205324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return num_command_matches;
205424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
205524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
205624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
205724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::~CommandInterpreter ()
205824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
205924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
206024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
206224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetPrompt ()
206324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20645bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    return m_debugger.GetPrompt();
206524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
206624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
206724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
206824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::SetPrompt (const char *new_prompt)
206924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
20705bc8c97d62b2e399bd90fb7e00c903d7887412abCaroline Tice    m_debugger.SetPrompt (new_prompt);
207124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
207224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20735e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Inghamsize_t
20745892856b0cd6591194c669afab5bf9ac19c5b3a0Greg ClaytonCommandInterpreter::GetConfirmationInputReaderCallback
20755892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton(
20765892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    void *baton,
20775892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    InputReader &reader,
20785892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    lldb::InputReaderAction action,
20795892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    const char *bytes,
20805892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    size_t bytes_len
20815892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton)
20825e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham{
20835892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton    File &out_file = reader.GetDebugger().GetOutputFile();
20845e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    bool *response_ptr = (bool *) baton;
20855e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
20865e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    switch (action)
20875e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    {
20885e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderActivate:
20895892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        if (out_file.IsValid())
20905e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
20915e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            if (reader.GetPrompt())
209222a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice            {
20935892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                out_file.Printf ("%s", reader.GetPrompt());
20945892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                out_file.Flush ();
209522a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice            }
20965e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
20975e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
20985e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
20995e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderDeactivate:
21005e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
21015e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
21025e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderReactivate:
21035892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton        if (out_file.IsValid() && reader.GetPrompt())
210422a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice        {
21055892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton            out_file.Printf ("%s", reader.GetPrompt());
21065892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton            out_file.Flush ();
210722a60097d0d8bc92f11224f71ce0954287ceab60Caroline Tice        }
21085e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
21094a348081030cdd2af758fddc869518357d9befd3Caroline Tice
21104a348081030cdd2af758fddc869518357d9befd3Caroline Tice    case eInputReaderAsynchronousOutputWritten:
21114a348081030cdd2af758fddc869518357d9befd3Caroline Tice        break;
21124a348081030cdd2af758fddc869518357d9befd3Caroline Tice
21135e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderGotToken:
21145e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        if (bytes_len == 0)
21155e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
21165e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            reader.SetIsDone(true);
21175e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
211836fe99155b969cfef8538e026394defabf5f4c23Jim Ingham        else if (bytes[0] == 'y' || bytes[0] == 'Y')
21195e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
21205e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            *response_ptr = true;
21215e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            reader.SetIsDone(true);
21225e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
212336fe99155b969cfef8538e026394defabf5f4c23Jim Ingham        else if (bytes[0] == 'n' || bytes[0] == 'N')
21245e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
21255e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            *response_ptr = false;
21265e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            reader.SetIsDone(true);
21275e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
21285e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        else
21295e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
21305892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton            if (out_file.IsValid() && !reader.IsDone() && reader.GetPrompt())
21315e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            {
21322618380b9a53dbc47a2b0c837ae09438bba72462Jim Ingham                out_file.Printf ("Please answer \"y\" or \"n\".\n%s", reader.GetPrompt());
21335892856b0cd6591194c669afab5bf9ac19c5b3a0Greg Clayton                out_file.Flush ();
21345e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            }
21355e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
21365e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
21375e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
2138c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    case eInputReaderInterrupt:
2139c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice    case eInputReaderEndOfFile:
2140c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        *response_ptr = false;  // Assume ^C or ^D means cancel the proposed action
2141c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        reader.SetIsDone (true);
2142c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice        break;
2143c4f55fee15b66ea53da092ca50400ac5d8b0692dCaroline Tice
21445e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    case eInputReaderDone:
21455e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        break;
21465e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    }
21475e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
21485e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    return bytes_len;
21495e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
21505e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham}
21515e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
21525e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Inghambool
21535e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim InghamCommandInterpreter::Confirm (const char *message, bool default_answer)
21545e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham{
21559305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    // Check AutoConfirm first:
21569305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham    if (m_debugger.GetAutoConfirm())
21579305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham        return default_answer;
21589305747659465e27c87a5bc5ff60c7a36fc8fefcJim Ingham
21595e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    InputReaderSP reader_sp (new InputReader(GetDebugger()));
21605e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    bool response = default_answer;
21615e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    if (reader_sp)
21625e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    {
21635e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        std::string prompt(message);
21645e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        prompt.append(": [");
21655e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        if (default_answer)
21665e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            prompt.append ("Y/n] ");
21675e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        else
21685e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            prompt.append ("y/N] ");
21695e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
21705e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        Error err (reader_sp->Initialize (CommandInterpreter::GetConfirmationInputReaderCallback,
21715e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          &response,                    // baton
21725e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          eInputReaderGranularityLine,  // token size, to pass to callback function
21735e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          NULL,                         // end token
21745e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          prompt.c_str(),               // prompt
21755e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham                                          true));                       // echo input
21765e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        if (err.Success())
21775e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        {
21785e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham            GetDebugger().PushInputReader (reader_sp);
21795e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        }
21805e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham        reader_sp->WaitOnReaderIsDone();
21815e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    }
21825e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham    return response;
21835e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham}
21845e16ef58a8bc2788be0ba03d8b2d0e9f3650fa5dJim Ingham
218524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerOptionArgVectorSP
218624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetAliasOptions (const char *alias_name)
218724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
218824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgMap::iterator pos;
218924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgVectorSP ret_val;
219024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string alias (alias_name);
219224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
219324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (HasAliasOptions())
219424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
219524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        pos = m_alias_options.find (alias);
219624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (pos != m_alias_options.end())
219724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner          ret_val = pos->second;
219824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
219924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return ret_val;
220124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
220224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
220324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
220424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::RemoveAliasOptions (const char *alias_name)
220524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
220624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgMap::iterator pos = m_alias_options.find(alias_name);
220724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (pos != m_alias_options.end())
220824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
220924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_alias_options.erase (pos);
221024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
221124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
221224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
221424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::AddOrReplaceAliasOptions (const char *alias_name, OptionArgVectorSP &option_arg_vector_sp)
221524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
221624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_alias_options[alias_name] = option_arg_vector_sp;
221724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
221824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
221924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
222024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasCommands ()
222124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
222224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_command_dict.empty());
222324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
222424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
222524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
222624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasAliases ()
222724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
222824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_alias_dict.empty());
222924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
223024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
223224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasUserCommands ()
223324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
223424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_user_dict.empty());
223524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
223624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
223724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
223824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::HasAliasOptions ()
223924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
224024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return (!m_alias_options.empty());
224124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
224224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
224324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
2244bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline TiceCommandInterpreter::BuildAliasCommandArgs (CommandObject *alias_cmd_obj,
2245bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                                           const char *alias_name,
2246bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                                           Args &cmd_args,
224744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                                           std::string &raw_input_string,
2248bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                                           CommandReturnObject &result)
224924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
225024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionArgVectorSP option_arg_vector_sp = GetAliasOptions (alias_name);
225144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
225244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    bool wants_raw_input = alias_cmd_obj->WantsRawCommandString();
225324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
225444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    // Make sure that the alias name is the 0th element in cmd_args
225544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    std::string alias_name_str = alias_name;
225644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    if (alias_name_str.compare (cmd_args.GetArgumentAtIndex(0)) != 0)
225744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        cmd_args.Unshift (alias_name);
225844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
225944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    Args new_args (alias_cmd_obj->GetCommandName());
226044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice    if (new_args.GetArgumentCount() == 2)
226144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        new_args.Shift();
226244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
226324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (option_arg_vector_sp.get())
226424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
226544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        if (wants_raw_input)
226644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        {
226744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            // We have a command that both has command options and takes raw input.  Make *sure* it has a
226844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            // " -- " in the right place in the raw_input_string.
226944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            size_t pos = raw_input_string.find(" -- ");
227044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            if (pos == std::string::npos)
227144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            {
227244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                // None found; assume it goes at the beginning of the raw input string
227344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                raw_input_string.insert (0, " -- ");
227444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            }
227544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        }
227624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
227724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
227836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const size_t old_size = cmd_args.GetArgumentCount();
2279bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice        std::vector<bool> used (old_size + 1, false);
2280bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice
2281bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice        used[0] = true;
228224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22833e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs        for (size_t i = 0; i < option_arg_vector->size(); ++i)
228424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
228524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            OptionArgPair option_pair = (*option_arg_vector)[i];
228644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            OptionArgValue value_pair = option_pair.second;
228744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            int value_type = value_pair.first;
228824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            std::string option = option_pair.first;
228944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            std::string value = value_pair.second;
229024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (option.compare ("<argument>") == 0)
229144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            {
229244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                if (!wants_raw_input
229344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    || (value.compare("--") != 0)) // Since we inserted this above, make sure we don't insert it twice
229444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    new_args.AppendArgument (value.c_str());
229544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            }
229624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
229724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
229844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                if (value_type != optional_argument)
229944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    new_args.AppendArgument (option.c_str());
230024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                if (value.compare ("<no-argument>") != 0)
230124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                {
230224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    int index = GetOptionArgumentPosition (value.c_str());
230324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    if (index == 0)
230444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    {
230524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // value was NOT a positional argument; must be a real value
230644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        if (value_type != optional_argument)
230744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (value.c_str());
230844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        else
230944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        {
231044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            char buffer[255];
231144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            ::snprintf (buffer, sizeof (buffer), "%s%s", option.c_str(), value.c_str());
231244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (buffer);
231344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        }
231444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
231544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                    }
231624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else if (index >= cmd_args.GetArgumentCount())
231724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
231824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.AppendErrorWithFormat
231924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                    ("Not enough arguments provided; you need at least %d arguments to use this alias.\n",
232024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                     index);
232124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        result.SetStatus (eReturnStatusFailed);
232224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        return;
232324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
232424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    else
232524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    {
232644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        // Find and remove cmd_args.GetArgumentAtIndex(i) from raw_input_string
232744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        size_t strpos = raw_input_string.find (cmd_args.GetArgumentAtIndex (index));
232844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        if (strpos != std::string::npos)
232944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        {
233044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            raw_input_string = raw_input_string.erase (strpos, strlen (cmd_args.GetArgumentAtIndex (index)));
233144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        }
233244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice
233344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        if (value_type != optional_argument)
233444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (cmd_args.GetArgumentAtIndex (index));
233544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        else
233644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        {
233744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            char buffer[255];
233844c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            ::snprintf (buffer, sizeof(buffer), "%s%s", option.c_str(),
233944c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                                        cmd_args.GetArgumentAtIndex (index));
234044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                            new_args.AppendArgument (buffer);
234144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                        }
2342bd5c63ef58a9ebed5b458ddbb77eb334b84787bdCaroline Tice                        used[index] = true;
234324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    }
234424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                }
234524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
234624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
234724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23483e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs        for (size_t j = 0; j < cmd_args.GetArgumentCount(); ++j)
234924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
235044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            if (!used[j] && !wants_raw_input)
235124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                new_args.AppendArgument (cmd_args.GetArgumentAtIndex (j));
235224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
235324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
235424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cmd_args.Clear();
235524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        cmd_args.SetArguments (new_args.GetArgumentCount(), (const char **) new_args.GetArgumentVector());
235624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
235724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
235824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
235924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus (eReturnStatusSuccessFinishNoResult);
236044c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        // This alias was not created with any options; nothing further needs to be done, unless it is a command that
236144c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        // wants raw input, in which case we need to clear the rest of the data from cmd_args, since its in the raw
236244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        // input string.
236344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        if (wants_raw_input)
236444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        {
236544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            cmd_args.Clear();
236644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice            cmd_args.SetArguments (new_args.GetArgumentCount(), (const char **) new_args.GetArgumentVector());
236744c841d68a439da13e3f170427675bff8c7f2731Caroline Tice        }
236824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return;
236924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
237024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
237124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    result.SetStatus (eReturnStatusSuccessFinishNoResult);
237224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return;
237324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
237424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
237524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
237624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
237724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetOptionArgumentPosition (const char *in_string)
237824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
237924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int position = 0;   // Any string that isn't an argument position, i.e. '%' followed by an integer, gets a position
238024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                        // of zero.
238124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    char *cptr = (char *) in_string;
238324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Does it start with '%'
238524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (cptr[0] == '%')
238624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
238724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ++cptr;
238824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
238924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Is the rest of it entirely digits?
239024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (isdigit (cptr[0]))
239124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
239224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *start = cptr;
239324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            while (isdigit (cptr[0]))
239424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                ++cptr;
239524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
239624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // We've gotten to the end of the digits; are we at the end of the string?
239724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (cptr[0] == '\0')
239824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                position = atoi (start);
239924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
240024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
240124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
240224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return position;
240324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
240424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
240524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
240624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::SourceInitFile (bool in_cwd, CommandReturnObject &result)
240724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2408574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    FileSpec init_file;
2409d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton    if (in_cwd)
2410574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    {
2411d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // In the current working directory we don't load any program specific
2412d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // .lldbinit files, we only look for a "./.lldbinit" file.
2413d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        if (m_skip_lldbinit_files)
2414d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            return;
2415d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
2416d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        init_file.SetFile ("./.lldbinit", true);
2417574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    }
2418d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton    else
2419574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham    {
2420d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // If we aren't looking in the current working directory we are looking
2421d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // in the home directory. We will first see if there is an application
2422d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // specific ".lldbinit" file whose name is "~/.lldbinit" followed by a
2423d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // "-" and the name of the program. If this file doesn't exist, we fall
2424d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // back to just the "~/.lldbinit" file. We also obey any requests to not
2425d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        // load the init files.
2426d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        const char *init_file_path = "~/.lldbinit";
2427d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
2428d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        if (m_skip_app_init_files == false)
2429d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        {
2430d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            FileSpec program_file_spec (Host::GetProgramFileSpec());
2431d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            const char *program_name = program_file_spec.GetFilename().AsCString();
2432574c3d63822cc7fd52bf6f6a94b6882fec4c8ce9Jim Ingham
2433d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            if (program_name)
2434d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            {
2435d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                char program_init_file_name[PATH_MAX];
2436d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                ::snprintf (program_init_file_name, sizeof(program_init_file_name), "%s-%s", init_file_path, program_name);
2437d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                init_file.SetFile (program_init_file_name, true);
2438d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                if (!init_file.Exists())
2439d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton                    init_file.Clear();
2440d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton            }
2441d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        }
2442d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
2443d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton        if (!init_file && !m_skip_lldbinit_files)
2444d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton			init_file.SetFile (init_file_path, true);
2445d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton    }
2446d6edcb5e331a05462340993dd425ba1152edc1feGreg Clayton
244724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // If the file exists, tell HandleCommand to 'source' it; this will do the actual broadcasting
244824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // of the commands back to any appropriate listener (see CommandObjectSource::Execute for more details).
244924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
245024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (init_file.Exists())
245124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2452949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        ExecutionContext *exe_ctx = NULL;  // We don't have any context yet.
2453949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool stop_on_continue = true;
2454949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool stop_on_error    = false;
2455949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool echo_commands    = false;
2456949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool print_results    = false;
2457949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
245801bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata        HandleCommandsFromFile (init_file, exe_ctx, stop_on_continue, stop_on_error, echo_commands, print_results, eLazyBoolNo, result);
245924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
246024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
246124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
246224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // nothing to be done if the file doesn't exist
246324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        result.SetStatus(eReturnStatusSuccessFinishNoResult);
246424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
246524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
246624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2467b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonPlatformSP
2468b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonCommandInterpreter::GetPlatform (bool prefer_target_platform)
2469b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
2470b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    PlatformSP platform_sp;
2471567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    if (prefer_target_platform)
2472567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    {
2473bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton        ExecutionContext exe_ctx(GetExecutionContext());
2474bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton        Target *target = exe_ctx.GetTargetPtr();
2475567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        if (target)
2476567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton            platform_sp = target->GetPlatform();
2477567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton    }
2478b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2479b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (!platform_sp)
2480b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        platform_sp = m_debugger.GetPlatformList().GetSelectedPlatform();
2481b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    return platform_sp;
2482b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
2483b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2484949d5acde6684b5824a26034457410cdf3823dfeJim Inghamvoid
2485a4fede31869663e889d67ace3d07dc5d3e4ea2b8Jim InghamCommandInterpreter::HandleCommands (const StringList &commands,
2486949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    ExecutionContext *override_context,
2487949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool stop_on_continue,
2488949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool stop_on_error,
2489949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool echo_commands,
2490949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    bool print_results,
249101bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata                                    LazyBool add_to_history,
2492949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                    CommandReturnObject &result)
2493949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{
2494949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    size_t num_lines = commands.GetSize();
2495949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2496949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // If we are going to continue past a "continue" then we need to run the commands synchronously.
2497949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // Make sure you reset this value anywhere you return from the function.
2498949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2499949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    bool old_async_execution = m_debugger.GetAsyncExecution();
2500949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2501949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // If we've been given an execution context, set it at the start, but don't keep resetting it or we will
2502949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    // cause series of commands that change the context, then do an operation that relies on that context to fail.
2503949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2504949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (override_context != NULL)
2505b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton        UpdateExecutionContext (override_context);
2506949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2507949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (!stop_on_continue)
2508949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2509949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        m_debugger.SetAsyncExecution (false);
2510949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2511949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
25123e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs    for (size_t idx = 0; idx < num_lines; idx++)
2513949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2514949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        const char *cmd = commands.GetStringAtIndex(idx);
2515949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (cmd[0] == '\0')
2516949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            continue;
2517949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2518949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (echo_commands)
2519949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2520949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.AppendMessageWithFormat ("%s %s\n",
2521949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                             GetPrompt(),
2522949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                             cmd);
2523949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2524949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2525aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton        CommandReturnObject tmp_result;
25268bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen        // If override_context is not NULL, pass no_context_switching = true for
25278bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen        // HandleCommand() since we updated our context already.
2528a153f63ec971339431c945499bd540515270267aJim Ingham
2529a153f63ec971339431c945499bd540515270267aJim Ingham        // We might call into a regex or alias command, in which case the add_to_history will get lost.  This
2530a153f63ec971339431c945499bd540515270267aJim Ingham        // m_command_source_depth dingus is the way we turn off adding to the history in that case, so set it up here.
2531a153f63ec971339431c945499bd540515270267aJim Ingham        if (!add_to_history)
2532a153f63ec971339431c945499bd540515270267aJim Ingham            m_command_source_depth++;
253301bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata        bool success = HandleCommand(cmd, add_to_history, tmp_result,
25348bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                     NULL, /* override_context */
25358bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                     true, /* repeat_on_empty_command */
25368bdf57cfc246358ab65b2d36ec2b8462e8d36e54Johnny Chen                                     override_context != NULL /* no_context_switching */);
2537a153f63ec971339431c945499bd540515270267aJim Ingham        if (!add_to_history)
2538a153f63ec971339431c945499bd540515270267aJim Ingham            m_command_source_depth--;
2539949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2540949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (print_results)
2541949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2542949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            if (tmp_result.Succeeded())
25432e8cb8a7342a2ea672792067d712a794e215a3a7Jim Ingham              result.AppendMessageWithFormat("%s", tmp_result.GetOutputData());
2544949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2545949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2546949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (!success || !tmp_result.Succeeded())
2547949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2548862fd5cdbaae4fab78d897be3e28aa3d7290aeb8Jim Ingham            const char *error_msg = tmp_result.GetErrorData();
2549862fd5cdbaae4fab78d897be3e28aa3d7290aeb8Jim Ingham            if (error_msg == NULL || error_msg[0] == '\0')
2550862fd5cdbaae4fab78d897be3e28aa3d7290aeb8Jim Ingham                error_msg = "<unknown error>.\n";
2551949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            if (stop_on_error)
2552949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
25533e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs                result.AppendErrorWithFormat("Aborting reading of commands after command #%zu: '%s' failed with %s",
2554862fd5cdbaae4fab78d897be3e28aa3d7290aeb8Jim Ingham                                         idx, cmd, error_msg);
2555949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.SetStatus (eReturnStatusFailed);
2556949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                m_debugger.SetAsyncExecution (old_async_execution);
2557949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                return;
2558949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
2559949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            else if (print_results)
2560949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
25613e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs                result.AppendMessageWithFormat ("Command #%zu '%s' failed with %s",
2562949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                idx + 1,
2563949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                cmd,
2564862fd5cdbaae4fab78d897be3e28aa3d7290aeb8Jim Ingham                                                error_msg);
2565949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
2566949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2567949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
25684a348081030cdd2af758fddc869518357d9befd3Caroline Tice        if (result.GetImmediateOutputStream())
25694a348081030cdd2af758fddc869518357d9befd3Caroline Tice            result.GetImmediateOutputStream()->Flush();
25704a348081030cdd2af758fddc869518357d9befd3Caroline Tice
25714a348081030cdd2af758fddc869518357d9befd3Caroline Tice        if (result.GetImmediateErrorStream())
25724a348081030cdd2af758fddc869518357d9befd3Caroline Tice            result.GetImmediateErrorStream()->Flush();
25734a348081030cdd2af758fddc869518357d9befd3Caroline Tice
2574949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // N.B. Can't depend on DidChangeProcessState, because the state coming into the command execution
2575949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // could be running (for instance in Breakpoint Commands.
2576949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // So we check the return value to see if it is has running in it.
2577949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if ((tmp_result.GetStatus() == eReturnStatusSuccessContinuingNoResult)
2578949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                || (tmp_result.GetStatus() == eReturnStatusSuccessContinuingResult))
2579949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2580949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            if (stop_on_continue)
2581949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
2582949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                // If we caused the target to proceed, and we're going to stop in that case, set the
2583949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                // status in our real result before returning.  This is an error if the continue was not the
2584949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                // last command in the set of commands to be run.
2585949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                if (idx != num_lines - 1)
25863e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs                    result.AppendErrorWithFormat("Aborting reading of commands after command #%zu: '%s' continued the target.\n",
2587949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                 idx + 1, cmd);
2588949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                else
25893e11c7ec050648ba865f1d451f8cb46fd39072a8Andy Gibbs                    result.AppendMessageWithFormat ("Command #%zu '%s' continued the target.\n", idx + 1, cmd);
2590949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2591949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                result.SetStatus(tmp_result.GetStatus());
2592949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                m_debugger.SetAsyncExecution (old_async_execution);
2593949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2594949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                return;
2595949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
2596949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
2597949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2598949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2599949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2600949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    result.SetStatus (eReturnStatusSuccessFinishResult);
2601949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    m_debugger.SetAsyncExecution (old_async_execution);
2602949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2603949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    return;
2604949d5acde6684b5824a26034457410cdf3823dfeJim Ingham}
2605949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
2606949d5acde6684b5824a26034457410cdf3823dfeJim Inghamvoid
2607949d5acde6684b5824a26034457410cdf3823dfeJim InghamCommandInterpreter::HandleCommandsFromFile (FileSpec &cmd_file,
2608949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            ExecutionContext *context,
2609949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool stop_on_continue,
2610949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool stop_on_error,
2611949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool echo_command,
2612949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            bool print_result,
261301bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata                                            LazyBool add_to_history,
2614949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                            CommandReturnObject &result)
2615949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{
2616949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    if (cmd_file.Exists())
2617949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2618949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool success;
2619949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        StringList commands;
2620949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        success = commands.ReadFileLines(cmd_file);
2621949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        if (!success)
2622949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
2623949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.AppendErrorWithFormat ("Error reading commands from file: %s.\n", cmd_file.GetFilename().AsCString());
2624949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            result.SetStatus (eReturnStatusFailed);
2625949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            return;
2626949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
262701bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata        m_command_source_depth++;
262801bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata        HandleCommands (commands, context, stop_on_continue, stop_on_error, echo_command, print_result, add_to_history, result);
262901bc2d493b48e4904e3241a7768e18fdd9bb6835Enrico Granata        m_command_source_depth--;
2630949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2631949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    else
2632949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
2633949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        result.AppendErrorWithFormat ("Error reading commands from file %s - file not found.\n",
2634949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                      cmd_file.GetFilename().AsCString());
2635949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        result.SetStatus (eReturnStatusFailed);
2636949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        return;
2637949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
2638949d5acde6684b5824a26034457410cdf3823dfeJim Ingham}
2639949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
264024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerScriptInterpreter *
2641db05491da80820047dc218542c88ba0d9f08fc71Enrico GranataCommandInterpreter::GetScriptInterpreter (bool can_create)
264224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2643db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    if (m_script_interpreter_ap.get() != NULL)
2644db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        return m_script_interpreter_ap.get();
2645db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
2646db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    if (!can_create)
2647db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        return NULL;
2648db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata
2649c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata    // <rdar://problem/11751427>
2650c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata    // we need to protect the initialization of the script interpreter
2651c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata    // otherwise we could end up with two threads both trying to create
2652c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata    // their instance of it, and for some languages (e.g. Python)
2653c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata    // this is a bulletproof recipe for disaster!
2654c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata    // this needs to be a function-level static because multiple Debugger instances living in the same process
2655c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata    // still need to be isolated and not try to initialize Python concurrently
2656b88c0a917d30af9d6f767171d180bb75501848c1Enrico Granata    static Mutex g_interpreter_mutex(Mutex::eMutexTypeRecursive);
2657b88c0a917d30af9d6f767171d180bb75501848c1Enrico Granata    Mutex::Locker interpreter_lock(g_interpreter_mutex);
2658c5c10a47fd8ee2d6b6a55647a59ad429b02ef296Enrico Granata
2659952e9dc874944fcdbbb224f3ec4fc2c859376f64Greg Clayton    Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_OBJECT));
2660db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata    if (log)
2661db05491da80820047dc218542c88ba0d9f08fc71Enrico Granata        log->Printf("Initializing the ScriptInterpreter now\n");
266263094e0bb161580564954dee512955c1c79d3476Greg Clayton
26630aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    lldb::ScriptLanguage script_lang = GetDebugger().GetScriptLanguage();
26640aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    switch (script_lang)
266524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
26660aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice        case eScriptLanguagePython:
26673e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton#ifndef LLDB_DISABLE_PYTHON
26680aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice            m_script_interpreter_ap.reset (new ScriptInterpreterPython (*this));
26690aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice            break;
26703e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton#else
26713e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton            // Fall through to the None case when python is disabled
26723e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton#endif
26733e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton        case eScriptLanguageNone:
26743e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton            m_script_interpreter_ap.reset (new ScriptInterpreterNone (*this));
26753e4238d47a6d1a3106f357d2e7b495870721c7aeGreg Clayton            break;
26760aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    };
26770aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice
26780aa2e55f0e9422405ad33675adc1e35044537adbCaroline Tice    return m_script_interpreter_ap.get();
267924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
268024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
268424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::GetSynchronous ()
268524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
268624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_synchronous_execution;
268724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
268824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
268924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
269024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::SetSynchronous (bool value)
269124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2692d7a4eb073d08bf632154b74189e36a28726cefaaJohnny Chen    m_synchronous_execution  = value;
269324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
269424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
269524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
269624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::OutputFormattedHelpText (Stream &strm,
269724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             const char *word_text,
269824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             const char *separator,
269924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                             const char *help_text,
270036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                                             size_t max_word_len)
270124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2702238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    const uint32_t max_columns = m_debugger.GetTerminalWidth();
2703238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton
270424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int indent_size = max_word_len + strlen (separator) + 2;
270524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
270624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.IndentMore (indent_size);
2707d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton
2708d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    StreamString text_strm;
270936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton    text_strm.Printf ("%-*s %s %s",  (int)max_word_len, word_text, separator, help_text);
2710d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton
2711d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    size_t len = text_strm.GetSize();
2712d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    const char *text = text_strm.GetData();
271324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (text[len - 1] == '\n')
2714d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    {
2715d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        text_strm.EOL();
2716d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton        len = text_strm.GetSize();
2717d284b663aa7d08b4f767de5ffa6289f33fcbcce7Greg Clayton    }
271824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
271924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (len  < max_columns)
272024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
272124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Output it as a single line.
272224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        strm.Printf ("%s", text);
272324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
272424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
272524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
272624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // We need to break it up into multiple lines.
272724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool first_line = true;
272824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        int text_width;
272936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        size_t start = 0;
273036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        size_t end = start;
273136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton        const size_t final_end = strlen (text);
273224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
273324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        while (end < final_end)
273424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
273524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (first_line)
273624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                text_width = max_columns - 1;
273724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
273824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                text_width = max_columns - indent_size - 1;
273924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
274024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Don't start the 'text' on a space, since we're already outputting the indentation.
274124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!first_line)
274224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
274324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while ((start < final_end) && (text[start] == ' '))
274424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                  start++;
274524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
274624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
274724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            end = start + text_width;
274824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (end > final_end)
274924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                end = final_end;
275024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
275124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
275224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // If we're not at the end of the text, make sure we break the line on white space.
275324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                while (end > start
275424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                       && text[end] != ' ' && text[end] != '\t' && text[end] != '\n')
275524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                    end--;
275673844aa19a7360b662e2be710fc3c969d6c86606Greg Clayton                assert (end > 0);
275724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
275824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
275936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            const size_t sub_len = end - start;
276024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (start != 0)
276124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              strm.EOL();
276224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (!first_line)
276324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                strm.Indent();
276424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
276524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                first_line = false;
276624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (start <= final_end);
276724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            assert (start + sub_len <= final_end);
276824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (sub_len > 0)
276924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                strm.Write (text + start, sub_len);
277024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            start = end + 1;
277124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
277224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
277324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.EOL();
277424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    strm.IndentLess(indent_size);
277524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
277624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
277724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
27781bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico GranataCommandInterpreter::OutputHelpText (Stream &strm,
27791bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    const char *word_text,
27801bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    const char *separator,
27811bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    const char *help_text,
27821bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                    uint32_t max_word_len)
27831bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata{
27841bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    int indent_size = max_word_len + strlen (separator) + 2;
27851bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
27861bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    strm.IndentMore (indent_size);
27871bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
27881bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    StreamString text_strm;
27891bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    text_strm.Printf ("%-*s %s %s",  max_word_len, word_text, separator, help_text);
27901bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
27911bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    const uint32_t max_columns = m_debugger.GetTerminalWidth();
27921bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
27931bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    size_t len = text_strm.GetSize();
27941bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    const char *text = text_strm.GetData();
27951bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
27961bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    uint32_t chars_left = max_columns;
27971bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
27981bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    for (uint32_t i = 0; i < len; i++)
27991bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    {
28001bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        if ((text[i] == ' ' && ::strchr((text+i+1), ' ') && chars_left < ::strchr((text+i+1), ' ')-(text+i)) || text[i] == '\n')
28011bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        {
28021bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            chars_left = max_columns - indent_size;
28031bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            strm.EOL();
28041bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            strm.Indent();
28051bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        }
28061bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        else
28071bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        {
28081bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            strm.PutChar(text[i]);
28091bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            chars_left--;
28101bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        }
28111bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
28121bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    }
28131bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
28141bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    strm.EOL();
28151bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    strm.IndentLess(indent_size);
28161bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata}
28171bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
28181bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granatavoid
281924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandInterpreter::FindCommandsForApropos (const char *search_word, StringList &commands_found,
2820589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                                            StringList &commands_help, bool search_builtin_commands, bool search_user_commands)
282124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
282224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::const_iterator pos;
282324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham    if (search_builtin_commands)
282524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
2826589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham        for (pos = m_command_dict.begin(); pos != m_command_dict.end(); ++pos)
282724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2828589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            const char *command_name = pos->first.c_str();
2829589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            CommandObject *cmd_obj = pos->second.get();
2830589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham
2831589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            if (cmd_obj->HelpTextContainsWord (search_word))
2832589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            {
2833589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                commands_found.AppendString (command_name);
2834589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                commands_help.AppendString (cmd_obj->GetHelp());
2835589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            }
2836589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham
2837589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            if (cmd_obj->IsMultiwordObject())
2838589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                cmd_obj->AproposAllSubCommands (command_name,
2839589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                                                search_word,
2840589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                                                commands_found,
2841589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                                                commands_help);
2842589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham
284324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
2844589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham    }
2845589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham
2846589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham    if (search_user_commands)
2847589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham    {
2848589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham        for (pos = m_user_dict.begin(); pos != m_user_dict.end(); ++pos)
2849589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham        {
2850589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            const char *command_name = pos->first.c_str();
2851589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            CommandObject *cmd_obj = pos->second.get();
285224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2853589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            if (cmd_obj->HelpTextContainsWord (search_word))
2854589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            {
2855589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                commands_found.AppendString (command_name);
2856589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                commands_help.AppendString (cmd_obj->GetHelp());
2857589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            }
2858589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham
2859589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham            if (cmd_obj->IsMultiwordObject())
2860589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                cmd_obj->AproposAllSubCommands (command_name,
2861589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                                                search_word,
2862589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                                                commands_found,
2863589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham                                                commands_help);
2864589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham
2865589d3618411e8a757992482e4d0cb3cb79480f2eJim Ingham        }
286624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
286724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
2868b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2869b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton
2870b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Claytonvoid
2871b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg ClaytonCommandInterpreter::UpdateExecutionContext (ExecutionContext *override_context)
2872b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton{
2873b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    if (override_context != NULL)
2874b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
2875bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton        m_exe_ctx_ref = *override_context;
2876b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
2877b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    else
2878b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    {
2879bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton        const bool adopt_selected = true;
2880bcaf99a74367d464dd38011e26b9b4be56b503baGreg Clayton        m_exe_ctx_ref.SetTargetPtr (m_debugger.GetSelectedTarget().get(), adopt_selected);
2881b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton    }
2882b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton}
2883