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