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, ®ular_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 "e_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