CommandObjectCommands.cpp revision 40e482434007a7cac49fb1f437fe7d13db2cf523
1767af88aa617288e584afcfed055f7755e408542Jim Ingham//===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===// 2767af88aa617288e584afcfed055f7755e408542Jim Ingham// 3767af88aa617288e584afcfed055f7755e408542Jim Ingham// The LLVM Compiler Infrastructure 4767af88aa617288e584afcfed055f7755e408542Jim Ingham// 5767af88aa617288e584afcfed055f7755e408542Jim Ingham// This file is distributed under the University of Illinois Open Source 6767af88aa617288e584afcfed055f7755e408542Jim Ingham// License. See LICENSE.TXT for details. 7767af88aa617288e584afcfed055f7755e408542Jim Ingham// 8767af88aa617288e584afcfed055f7755e408542Jim Ingham//===----------------------------------------------------------------------===// 9767af88aa617288e584afcfed055f7755e408542Jim Ingham 10767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "CommandObjectCommands.h" 11767af88aa617288e584afcfed055f7755e408542Jim Ingham 12767af88aa617288e584afcfed055f7755e408542Jim Ingham// C Includes 13767af88aa617288e584afcfed055f7755e408542Jim Ingham// C++ Includes 14767af88aa617288e584afcfed055f7755e408542Jim Ingham// Other libraries and framework includes 1540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton#include "llvm/ADT/StringRef.h" 1640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 17767af88aa617288e584afcfed055f7755e408542Jim Ingham// Project includes 18767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Core/Debugger.h" 19d12aeab33bab559e138307f599077da3918a3238Greg Clayton#include "lldb/Core/InputReader.h" 20d12aeab33bab559e138307f599077da3918a3238Greg Clayton#include "lldb/Interpreter/Args.h" 21767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandInterpreter.h" 22d12aeab33bab559e138307f599077da3918a3238Greg Clayton#include "lldb/Interpreter/CommandObjectRegexCommand.h" 23767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandReturnObject.h" 24767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h" 25767af88aa617288e584afcfed055f7755e408542Jim Ingham 26767af88aa617288e584afcfed055f7755e408542Jim Inghamusing namespace lldb; 27767af88aa617288e584afcfed055f7755e408542Jim Inghamusing namespace lldb_private; 28767af88aa617288e584afcfed055f7755e408542Jim Ingham 29767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 30767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectCommandsSource 31767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 32767af88aa617288e584afcfed055f7755e408542Jim Ingham 33767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectCommandsSource : public CommandObject 34767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 35949d5acde6684b5824a26034457410cdf3823dfeJim Inghamprivate: 36949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 37949d5acde6684b5824a26034457410cdf3823dfeJim Ingham class CommandOptions : public Options 38949d5acde6684b5824a26034457410cdf3823dfeJim Ingham { 39949d5acde6684b5824a26034457410cdf3823dfeJim Ingham public: 40949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 41f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton CommandOptions (CommandInterpreter &interpreter) : 42f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton Options (interpreter) 43f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton { 44f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton } 45949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 46949d5acde6684b5824a26034457410cdf3823dfeJim Ingham virtual 47949d5acde6684b5824a26034457410cdf3823dfeJim Ingham ~CommandOptions (){} 48949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 49949d5acde6684b5824a26034457410cdf3823dfeJim Ingham virtual Error 50143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 51949d5acde6684b5824a26034457410cdf3823dfeJim Ingham { 52949d5acde6684b5824a26034457410cdf3823dfeJim Ingham Error error; 53949d5acde6684b5824a26034457410cdf3823dfeJim Ingham char short_option = (char) m_getopt_table[option_idx].val; 54949d5acde6684b5824a26034457410cdf3823dfeJim Ingham bool success; 55949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 56949d5acde6684b5824a26034457410cdf3823dfeJim Ingham switch (short_option) 57949d5acde6684b5824a26034457410cdf3823dfeJim Ingham { 58949d5acde6684b5824a26034457410cdf3823dfeJim Ingham case 'e': 59949d5acde6684b5824a26034457410cdf3823dfeJim Ingham m_stop_on_error = Args::StringToBoolean(option_arg, true, &success); 60949d5acde6684b5824a26034457410cdf3823dfeJim Ingham if (!success) 61949d5acde6684b5824a26034457410cdf3823dfeJim Ingham error.SetErrorStringWithFormat("Invalid value for stop-on-error: %s.\n", option_arg); 62949d5acde6684b5824a26034457410cdf3823dfeJim Ingham break; 63949d5acde6684b5824a26034457410cdf3823dfeJim Ingham case 'c': 64949d5acde6684b5824a26034457410cdf3823dfeJim Ingham m_stop_on_continue = Args::StringToBoolean(option_arg, true, &success); 65949d5acde6684b5824a26034457410cdf3823dfeJim Ingham if (!success) 66949d5acde6684b5824a26034457410cdf3823dfeJim Ingham error.SetErrorStringWithFormat("Invalid value for stop-on-continue: %s.\n", option_arg); 67949d5acde6684b5824a26034457410cdf3823dfeJim Ingham break; 68949d5acde6684b5824a26034457410cdf3823dfeJim Ingham default: 69949d5acde6684b5824a26034457410cdf3823dfeJim Ingham error.SetErrorStringWithFormat ("Unrecognized option '%c'.\n", short_option); 70949d5acde6684b5824a26034457410cdf3823dfeJim Ingham break; 71949d5acde6684b5824a26034457410cdf3823dfeJim Ingham } 72949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 73949d5acde6684b5824a26034457410cdf3823dfeJim Ingham return error; 74949d5acde6684b5824a26034457410cdf3823dfeJim Ingham } 75949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 76949d5acde6684b5824a26034457410cdf3823dfeJim Ingham void 77143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton OptionParsingStarting () 78949d5acde6684b5824a26034457410cdf3823dfeJim Ingham { 79949d5acde6684b5824a26034457410cdf3823dfeJim Ingham m_stop_on_error = true; 80949d5acde6684b5824a26034457410cdf3823dfeJim Ingham m_stop_on_continue = true; 81949d5acde6684b5824a26034457410cdf3823dfeJim Ingham } 82949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 83b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton const OptionDefinition* 84949d5acde6684b5824a26034457410cdf3823dfeJim Ingham GetDefinitions () 85949d5acde6684b5824a26034457410cdf3823dfeJim Ingham { 86949d5acde6684b5824a26034457410cdf3823dfeJim Ingham return g_option_table; 87949d5acde6684b5824a26034457410cdf3823dfeJim Ingham } 88949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 89949d5acde6684b5824a26034457410cdf3823dfeJim Ingham // Options table: Required for subclasses of Options. 90949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 91b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static OptionDefinition g_option_table[]; 92949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 93949d5acde6684b5824a26034457410cdf3823dfeJim Ingham // Instance variables to hold the values for command options. 94949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 95949d5acde6684b5824a26034457410cdf3823dfeJim Ingham bool m_stop_on_error; 96949d5acde6684b5824a26034457410cdf3823dfeJim Ingham bool m_stop_on_continue; 97949d5acde6684b5824a26034457410cdf3823dfeJim Ingham }; 98949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 99949d5acde6684b5824a26034457410cdf3823dfeJim Ingham CommandOptions m_options; 100949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 101949d5acde6684b5824a26034457410cdf3823dfeJim Ingham virtual Options * 102949d5acde6684b5824a26034457410cdf3823dfeJim Ingham GetOptions () 103949d5acde6684b5824a26034457410cdf3823dfeJim Ingham { 104949d5acde6684b5824a26034457410cdf3823dfeJim Ingham return &m_options; 105949d5acde6684b5824a26034457410cdf3823dfeJim Ingham } 106949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 107767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 108238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectCommandsSource(CommandInterpreter &interpreter) : 109238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 11040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton "command source", 111238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton "Read in debugger commands from the file <filename> and execute them.", 112f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton NULL), 113f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton m_options (interpreter) 114767af88aa617288e584afcfed055f7755e408542Jim Ingham { 11543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 11643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData file_arg; 11743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 11843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 11943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_type = eArgTypeFilename; 12043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice file_arg.arg_repetition = eArgRepeatPlain; 12143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 12243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 12343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (file_arg); 12443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 12543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 12643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 127767af88aa617288e584afcfed055f7755e408542Jim Ingham } 128767af88aa617288e584afcfed055f7755e408542Jim Ingham 129767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectCommandsSource () 130767af88aa617288e584afcfed055f7755e408542Jim Ingham { 131767af88aa617288e584afcfed055f7755e408542Jim Ingham } 132767af88aa617288e584afcfed055f7755e408542Jim Ingham 133767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 134767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 135767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 136767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 137767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 138767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 139767af88aa617288e584afcfed055f7755e408542Jim Ingham { 140767af88aa617288e584afcfed055f7755e408542Jim Ingham const int argc = args.GetArgumentCount(); 141767af88aa617288e584afcfed055f7755e408542Jim Ingham if (argc == 1) 142767af88aa617288e584afcfed055f7755e408542Jim Ingham { 143767af88aa617288e584afcfed055f7755e408542Jim Ingham const char *filename = args.GetArgumentAtIndex(0); 144767af88aa617288e584afcfed055f7755e408542Jim Ingham 145767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendMessageWithFormat ("Executing commands in '%s'.\n", filename); 146767af88aa617288e584afcfed055f7755e408542Jim Ingham 147a83ea887f6165d59cfeac1bbb96011f3b0568af8Johnny Chen FileSpec cmd_file (filename, true); 148949d5acde6684b5824a26034457410cdf3823dfeJim Ingham ExecutionContext *exe_ctx = NULL; // Just use the default context. 149949d5acde6684b5824a26034457410cdf3823dfeJim Ingham bool echo_commands = true; 150949d5acde6684b5824a26034457410cdf3823dfeJim Ingham bool print_results = true; 151949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 152949d5acde6684b5824a26034457410cdf3823dfeJim Ingham m_interpreter.HandleCommandsFromFile (cmd_file, 153949d5acde6684b5824a26034457410cdf3823dfeJim Ingham exe_ctx, 154949d5acde6684b5824a26034457410cdf3823dfeJim Ingham m_options.m_stop_on_continue, 155949d5acde6684b5824a26034457410cdf3823dfeJim Ingham m_options.m_stop_on_error, 156949d5acde6684b5824a26034457410cdf3823dfeJim Ingham echo_commands, 157949d5acde6684b5824a26034457410cdf3823dfeJim Ingham print_results, 158949d5acde6684b5824a26034457410cdf3823dfeJim Ingham result); 159767af88aa617288e584afcfed055f7755e408542Jim Ingham } 160767af88aa617288e584afcfed055f7755e408542Jim Ingham else 161767af88aa617288e584afcfed055f7755e408542Jim Ingham { 162767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat("'%s' takes exactly one executable filename argument.\n", GetCommandName()); 163767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 164767af88aa617288e584afcfed055f7755e408542Jim Ingham } 165767af88aa617288e584afcfed055f7755e408542Jim Ingham return result.Succeeded(); 166767af88aa617288e584afcfed055f7755e408542Jim Ingham 167767af88aa617288e584afcfed055f7755e408542Jim Ingham } 168767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 169767af88aa617288e584afcfed055f7755e408542Jim Ingham 170b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition 171949d5acde6684b5824a26034457410cdf3823dfeJim InghamCommandObjectCommandsSource::CommandOptions::g_option_table[] = 172949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{ 173949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{ LLDB_OPT_SET_ALL, false, "stop-on-error", 'e', required_argument, NULL, 0, eArgTypeBoolean, "If true, stop executing commands on error."}, 174949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{ LLDB_OPT_SET_ALL, false, "stop-on-continue", 'c', required_argument, NULL, 0, eArgTypeBoolean, "If true, stop executing commands on continue."}, 175949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL } 176949d5acde6684b5824a26034457410cdf3823dfeJim Ingham}; 177949d5acde6684b5824a26034457410cdf3823dfeJim Ingham 178767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectCommandsAlias 179767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 180767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectCommandsAlias 181767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 182767af88aa617288e584afcfed055f7755e408542Jim Ingham 183767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectCommandsAlias : public CommandObject 184767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 185767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 186238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectCommandsAlias (CommandInterpreter &interpreter) : 187238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 18840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton "command alias", 189abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice "Allow users to define their own debugger command abbreviations.", 19043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 191767af88aa617288e584afcfed055f7755e408542Jim Ingham { 192767af88aa617288e584afcfed055f7755e408542Jim Ingham SetHelpLong( 193767af88aa617288e584afcfed055f7755e408542Jim Ingham "'alias' allows the user to create a short-cut or abbreviation for long \n\ 194767af88aa617288e584afcfed055f7755e408542Jim Ingham commands, multi-word commands, and commands that take particular options. \n\ 195767af88aa617288e584afcfed055f7755e408542Jim Ingham Below are some simple examples of how one might use the 'alias' command: \n\ 19631fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice \n 'commands alias sc script' // Creates the abbreviation 'sc' for the 'script' \n\ 19731fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice // command. \n\ 19831fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice 'commands alias bp breakpoint' // Creates the abbreviation 'bp' for the 'breakpoint' \n\ 19931fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice // command. Since breakpoint commands are two-word \n\ 20031fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice // commands, the user will still need to enter the \n\ 20131fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice // second word after 'bp', e.g. 'bp enable' or \n\ 20231fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice // 'bp delete'. \n\ 20331fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice 'commands alias bpl breakpoint list' // Creates the abbreviation 'bpl' for the \n\ 20431fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice // two-word command 'breakpoint list'. \n\ 205767af88aa617288e584afcfed055f7755e408542Jim Ingham \nAn alias can include some options for the command, with the values either \n\ 206767af88aa617288e584afcfed055f7755e408542Jim Ingham filled in at the time the alias is created, or specified as positional \n\ 207767af88aa617288e584afcfed055f7755e408542Jim Ingham arguments, to be filled in when the alias is invoked. The following example \n\ 208767af88aa617288e584afcfed055f7755e408542Jim Ingham shows how to create aliases with options: \n\ 209767af88aa617288e584afcfed055f7755e408542Jim Ingham \n\ 21031fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice 'commands alias bfl breakpoint set -f %1 -l %2' \n\ 211767af88aa617288e584afcfed055f7755e408542Jim Ingham \nThis creates the abbreviation 'bfl' (for break-file-line), with the -f and -l \n\ 212767af88aa617288e584afcfed055f7755e408542Jim Ingham options already part of the alias. So if the user wants to set a breakpoint \n\ 213767af88aa617288e584afcfed055f7755e408542Jim Ingham by file and line without explicitly having to use the -f and -l options, the \n\ 214767af88aa617288e584afcfed055f7755e408542Jim Ingham user can now use 'bfl' instead. The '%1' and '%2' are positional placeholders \n\ 215767af88aa617288e584afcfed055f7755e408542Jim Ingham for the actual arguments that will be passed when the alias command is used. \n\ 216767af88aa617288e584afcfed055f7755e408542Jim Ingham The number in the placeholder refers to the position/order the actual value \n\ 217767af88aa617288e584afcfed055f7755e408542Jim Ingham occupies when the alias is used. So all the occurrences of '%1' in the alias \n\ 218767af88aa617288e584afcfed055f7755e408542Jim Ingham will be replaced with the first argument, all the occurrences of '%2' in the \n\ 219767af88aa617288e584afcfed055f7755e408542Jim Ingham alias will be replaced with the second argument, and so on. This also allows \n\ 220767af88aa617288e584afcfed055f7755e408542Jim Ingham actual arguments to be used multiple times within an alias (see 'process \n\ 221767af88aa617288e584afcfed055f7755e408542Jim Ingham launch' example below). So in the 'bfl' case, the actual file value will be \n\ 222767af88aa617288e584afcfed055f7755e408542Jim Ingham filled in with the first argument following 'bfl' and the actual line number \n\ 223767af88aa617288e584afcfed055f7755e408542Jim Ingham value will be filled in with the second argument. The user would use this \n\ 224767af88aa617288e584afcfed055f7755e408542Jim Ingham alias as follows: \n\ 22531fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice \n (lldb) commands alias bfl breakpoint set -f %1 -l %2 \n\ 226a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan <... some time later ...> \n\ 22731fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice (lldb) bfl my-file.c 137 \n\ 228767af88aa617288e584afcfed055f7755e408542Jim Ingham \nThis would be the same as if the user had entered \n\ 229767af88aa617288e584afcfed055f7755e408542Jim Ingham 'breakpoint set -f my-file.c -l 137'. \n\ 230767af88aa617288e584afcfed055f7755e408542Jim Ingham \nAnother example: \n\ 23131fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice \n (lldb) commands alias pltty process launch -s -o %1 -e %1 \n\ 23231fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice (lldb) pltty /dev/tty0 \n\ 233a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan // becomes 'process launch -s -o /dev/tty0 -e /dev/tty0' \n\ 234767af88aa617288e584afcfed055f7755e408542Jim Ingham \nIf the user always wanted to pass the same value to a particular option, the \n\ 235767af88aa617288e584afcfed055f7755e408542Jim Ingham alias could be defined with that value directly in the alias as a constant, \n\ 236767af88aa617288e584afcfed055f7755e408542Jim Ingham rather than using a positional placeholder: \n\ 237a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan \n commands alias bl3 breakpoint set -f %1 -l 3 // Always sets a breakpoint on line \n\ 238a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan // 3 of whatever file is indicated. \n"); 239767af88aa617288e584afcfed055f7755e408542Jim Ingham 24043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg1; 24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg2; 24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg3; 24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData alias_arg; 24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData cmd_arg; 24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData options_arg; 24643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 24743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 24843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice alias_arg.arg_type = eArgTypeAliasName; 24943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice alias_arg.arg_repetition = eArgRepeatPlain; 25043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 25143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 25243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg1.push_back (alias_arg); 25343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 25443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 25543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice cmd_arg.arg_type = eArgTypeCommandName; 25643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice cmd_arg.arg_repetition = eArgRepeatPlain; 25743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 25843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 25943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg2.push_back (cmd_arg); 26043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 26143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 26243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice options_arg.arg_type = eArgTypeAliasOptions; 26343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice options_arg.arg_repetition = eArgRepeatOptional; 26443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 26543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 26643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg3.push_back (options_arg); 26743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 26843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 26943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg1); 27043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg2); 27143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg3); 272767af88aa617288e584afcfed055f7755e408542Jim Ingham } 273767af88aa617288e584afcfed055f7755e408542Jim Ingham 274767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectCommandsAlias () 275767af88aa617288e584afcfed055f7755e408542Jim Ingham { 276767af88aa617288e584afcfed055f7755e408542Jim Ingham } 277767af88aa617288e584afcfed055f7755e408542Jim Ingham 278e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice bool 279e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice WantsRawCommandString () 280e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 281e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return true; 282e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 283e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 284e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice bool 285e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice ExecuteRawCommandString (const char *raw_command_line, CommandReturnObject &result) 286e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 287e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice Args args (raw_command_line); 288e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice std::string raw_command_string (raw_command_line); 289e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 290e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice size_t argc = args.GetArgumentCount(); 291e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 292e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (argc < 2) 293e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 294e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.AppendError ("'alias' requires at least two arguments"); 295e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.SetStatus (eReturnStatusFailed); 296e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return false; 297e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 298e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 299e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Get the alias command. 300e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 301e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice const std::string alias_command = args.GetArgumentAtIndex (0); 302e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 303e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Strip the new alias name off 'raw_command_string' (leave it on args, which gets passed to 'Execute', which 304e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // does the stripping itself. 305e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice size_t pos = raw_command_string.find (alias_command); 306e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (pos == 0) 307e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 308e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice raw_command_string = raw_command_string.substr (alias_command.size()); 309e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice pos = raw_command_string.find_first_not_of (' '); 310e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if ((pos != std::string::npos) && (pos > 0)) 311e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice raw_command_string = raw_command_string.substr (pos); 312e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 313e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice else 314e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 315e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.AppendError ("Error parsing command string. No alias created."); 316e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.SetStatus (eReturnStatusFailed); 317e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return false; 318e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 319e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 320e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 321e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Verify that the command is alias-able. 322e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (m_interpreter.CommandExists (alias_command.c_str())) 323e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 324e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n", 325e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice alias_command.c_str()); 326e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.SetStatus (eReturnStatusFailed); 327e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return false; 328e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 329e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 330e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Get CommandObject that is being aliased. The command name is read from the front of raw_command_string. 331e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // raw_command_string is returned with the name of the command object stripped off the front. 332e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice CommandObject *cmd_obj = m_interpreter.GetCommandObjectForCommand (raw_command_string); 333e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 334e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (!cmd_obj) 335e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 336e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.AppendErrorWithFormat ("Invalid command given to 'alias'. '%s' does not begin with a valid command." 337e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice " No alias created.", raw_command_string.c_str()); 338e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.SetStatus (eReturnStatusFailed); 339e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return false; 340e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 341e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice else if (!cmd_obj->WantsRawCommandString ()) 342e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 343e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Note that args was initialized with the original command, and has not been updated to this point. 344e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Therefore can we pass it to the version of Execute that does not need/expect raw input in the alias. 345e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return Execute (args, result); 346e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 347e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice else 348e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 349e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Verify & handle any options/arguments passed to the alias command 350e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 351e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector); 352e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice OptionArgVector *option_arg_vector = option_arg_vector_sp.get(); 353e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 354e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Check to see if there's anything left in the input command string. 355e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (raw_command_string.size() > 0) 356e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 357e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 358e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Check to see if the command being aliased can take any command options. 359e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice Options *options = cmd_obj->GetOptions(); 360e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (options) 361e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 362e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // See if any options were specified as part of the alias; if so, handle them appropriately 363143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton options->NotifyOptionParsingStarting (); 364e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice Args tmp_args (raw_command_string.c_str()); 365e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice args.Unshift ("dummy_arg"); 366e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice args.ParseAliasOptions (*options, result, option_arg_vector, raw_command_string); 367e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice args.Shift (); 368e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (result.Succeeded()) 369e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice options->VerifyPartialOptions (result); 370e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted) 371e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 372e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.AppendError ("Unable to create requested alias.\n"); 373e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return false; 374e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 375e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 376e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Anything remaining must be plain raw input. Push it in as a single raw input argument. 377e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (raw_command_string.size() > 0) 378e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice option_arg_vector->push_back (OptionArgPair ("<argument>", 379e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice OptionArgValue (-1, 380e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice raw_command_string))); 381e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 382e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 383e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice // Create the alias 384e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (m_interpreter.AliasExists (alias_command.c_str()) 385e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice || m_interpreter.UserCommandExists (alias_command.c_str())) 386e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 387e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice OptionArgVectorSP temp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str())); 388e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (temp_option_arg_sp.get()) 389e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice { 390e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice if (option_arg_vector->size() == 0) 391e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice m_interpreter.RemoveAliasOptions (alias_command.c_str()); 392e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 393e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n", 394e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice alias_command.c_str()); 395e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 396e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice 397e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice CommandObjectSP cmd_obj_sp = m_interpreter.GetCommandSPExact (cmd_obj->GetCommandName(), false); 39856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice if (cmd_obj_sp) 39956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice { 40056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice m_interpreter.AddAlias (alias_command.c_str(), cmd_obj_sp); 40156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice if (option_arg_vector->size() > 0) 40256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp); 40356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice result.SetStatus (eReturnStatusSuccessFinishNoResult); 40456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice } 40556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice else 40656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice { 40756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice result.AppendError ("Unable to create requested alias.\n"); 40856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice result.SetStatus (eReturnStatusFailed); 40956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice } 410e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 411e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice return result.Succeeded(); 412e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice } 413767af88aa617288e584afcfed055f7755e408542Jim Ingham 414767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 415767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 416767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 417767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 418767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 419767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 420767af88aa617288e584afcfed055f7755e408542Jim Ingham { 4218bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice size_t argc = args.GetArgumentCount(); 422767af88aa617288e584afcfed055f7755e408542Jim Ingham 423767af88aa617288e584afcfed055f7755e408542Jim Ingham if (argc < 2) 42454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton { 425767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendError ("'alias' requires at least two arguments"); 426767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 427767af88aa617288e584afcfed055f7755e408542Jim Ingham return false; 42854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton } 429767af88aa617288e584afcfed055f7755e408542Jim Ingham 430767af88aa617288e584afcfed055f7755e408542Jim Ingham const std::string alias_command = args.GetArgumentAtIndex(0); 431767af88aa617288e584afcfed055f7755e408542Jim Ingham const std::string actual_command = args.GetArgumentAtIndex(1); 432767af88aa617288e584afcfed055f7755e408542Jim Ingham 433767af88aa617288e584afcfed055f7755e408542Jim Ingham args.Shift(); // Shift the alias command word off the argument vector. 434767af88aa617288e584afcfed055f7755e408542Jim Ingham args.Shift(); // Shift the old command word off the argument vector. 435767af88aa617288e584afcfed055f7755e408542Jim Ingham 436767af88aa617288e584afcfed055f7755e408542Jim Ingham // Verify that the command is alias'able, and get the appropriate command object. 437767af88aa617288e584afcfed055f7755e408542Jim Ingham 438238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.CommandExists (alias_command.c_str())) 439767af88aa617288e584afcfed055f7755e408542Jim Ingham { 440767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n", 441767af88aa617288e584afcfed055f7755e408542Jim Ingham alias_command.c_str()); 442767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 443767af88aa617288e584afcfed055f7755e408542Jim Ingham } 444767af88aa617288e584afcfed055f7755e408542Jim Ingham else 445767af88aa617288e584afcfed055f7755e408542Jim Ingham { 446238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectSP command_obj_sp(m_interpreter.GetCommandSPExact (actual_command.c_str(), true)); 447767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandObjectSP subcommand_obj_sp; 448767af88aa617288e584afcfed055f7755e408542Jim Ingham bool use_subcommand = false; 449767af88aa617288e584afcfed055f7755e408542Jim Ingham if (command_obj_sp.get()) 450767af88aa617288e584afcfed055f7755e408542Jim Ingham { 451767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandObject *cmd_obj = command_obj_sp.get(); 45254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton CommandObject *sub_cmd_obj = NULL; 453767af88aa617288e584afcfed055f7755e408542Jim Ingham OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector); 454767af88aa617288e584afcfed055f7755e408542Jim Ingham OptionArgVector *option_arg_vector = option_arg_vector_sp.get(); 455767af88aa617288e584afcfed055f7755e408542Jim Ingham 456e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice while (cmd_obj->IsMultiwordObject() && args.GetArgumentCount() > 0) 457767af88aa617288e584afcfed055f7755e408542Jim Ingham { 458767af88aa617288e584afcfed055f7755e408542Jim Ingham if (argc >= 3) 459767af88aa617288e584afcfed055f7755e408542Jim Ingham { 460767af88aa617288e584afcfed055f7755e408542Jim Ingham const std::string sub_command = args.GetArgumentAtIndex(0); 461767af88aa617288e584afcfed055f7755e408542Jim Ingham assert (sub_command.length() != 0); 462767af88aa617288e584afcfed055f7755e408542Jim Ingham subcommand_obj_sp = 463767af88aa617288e584afcfed055f7755e408542Jim Ingham (((CommandObjectMultiword *) cmd_obj)->GetSubcommandSP (sub_command.c_str())); 464767af88aa617288e584afcfed055f7755e408542Jim Ingham if (subcommand_obj_sp.get()) 465767af88aa617288e584afcfed055f7755e408542Jim Ingham { 466767af88aa617288e584afcfed055f7755e408542Jim Ingham sub_cmd_obj = subcommand_obj_sp.get(); 467767af88aa617288e584afcfed055f7755e408542Jim Ingham use_subcommand = true; 468767af88aa617288e584afcfed055f7755e408542Jim Ingham args.Shift(); // Shift the sub_command word off the argument vector. 469e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice cmd_obj = sub_cmd_obj; 470767af88aa617288e584afcfed055f7755e408542Jim Ingham } 471767af88aa617288e584afcfed055f7755e408542Jim Ingham else 472767af88aa617288e584afcfed055f7755e408542Jim Ingham { 4735d53b621dea6a2ca6ece7528b22d089f864ae18fCaroline Tice result.AppendErrorWithFormat("'%s' is not a valid sub-command of '%s'. " 4745d53b621dea6a2ca6ece7528b22d089f864ae18fCaroline Tice "Unable to create alias.\n", 4755d53b621dea6a2ca6ece7528b22d089f864ae18fCaroline Tice sub_command.c_str(), actual_command.c_str()); 476767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 477767af88aa617288e584afcfed055f7755e408542Jim Ingham return false; 478767af88aa617288e584afcfed055f7755e408542Jim Ingham } 479767af88aa617288e584afcfed055f7755e408542Jim Ingham } 480767af88aa617288e584afcfed055f7755e408542Jim Ingham } 481767af88aa617288e584afcfed055f7755e408542Jim Ingham 482767af88aa617288e584afcfed055f7755e408542Jim Ingham // Verify & handle any options/arguments passed to the alias command 483767af88aa617288e584afcfed055f7755e408542Jim Ingham 484767af88aa617288e584afcfed055f7755e408542Jim Ingham if (args.GetArgumentCount () > 0) 485767af88aa617288e584afcfed055f7755e408542Jim Ingham { 486767af88aa617288e584afcfed055f7755e408542Jim Ingham if ((!use_subcommand && (cmd_obj->GetOptions() != NULL)) 487767af88aa617288e584afcfed055f7755e408542Jim Ingham || (use_subcommand && (sub_cmd_obj->GetOptions() != NULL))) 488767af88aa617288e584afcfed055f7755e408542Jim Ingham { 489767af88aa617288e584afcfed055f7755e408542Jim Ingham Options *options; 490767af88aa617288e584afcfed055f7755e408542Jim Ingham if (use_subcommand) 491767af88aa617288e584afcfed055f7755e408542Jim Ingham options = sub_cmd_obj->GetOptions(); 492767af88aa617288e584afcfed055f7755e408542Jim Ingham else 493767af88aa617288e584afcfed055f7755e408542Jim Ingham options = cmd_obj->GetOptions(); 494143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton options->NotifyOptionParsingStarting (); 495e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice std::string empty_string; 496767af88aa617288e584afcfed055f7755e408542Jim Ingham args.Unshift ("dummy_arg"); 497e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice args.ParseAliasOptions (*options, result, option_arg_vector, empty_string); 498767af88aa617288e584afcfed055f7755e408542Jim Ingham args.Shift (); 499767af88aa617288e584afcfed055f7755e408542Jim Ingham if (result.Succeeded()) 500767af88aa617288e584afcfed055f7755e408542Jim Ingham options->VerifyPartialOptions (result); 5018bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted) 5028bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice { 5038bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice result.AppendError ("Unable to create requested command alias.\n"); 504e6866a3819d68be21004ffdf773e36e7f00a6a26Caroline Tice return false; 5058bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice } 506767af88aa617288e584afcfed055f7755e408542Jim Ingham } 5078bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice 5088bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice // Anything remaining in args must be a plain argument. 5098bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice 5108bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice argc = args.GetArgumentCount(); 5118bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice for (size_t i = 0; i < argc; ++i) 51244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice if (strcmp (args.GetArgumentAtIndex (i), "") != 0) 51344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice option_arg_vector->push_back 51444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice (OptionArgPair ("<argument>", 51544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice OptionArgValue (-1, 51644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice std::string (args.GetArgumentAtIndex (i))))); 517767af88aa617288e584afcfed055f7755e408542Jim Ingham } 518767af88aa617288e584afcfed055f7755e408542Jim Ingham 519767af88aa617288e584afcfed055f7755e408542Jim Ingham // Create the alias. 520767af88aa617288e584afcfed055f7755e408542Jim Ingham 521238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.AliasExists (alias_command.c_str()) 522238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton || m_interpreter.UserCommandExists (alias_command.c_str())) 523767af88aa617288e584afcfed055f7755e408542Jim Ingham { 524238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton OptionArgVectorSP tmp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str())); 525767af88aa617288e584afcfed055f7755e408542Jim Ingham if (tmp_option_arg_sp.get()) 526767af88aa617288e584afcfed055f7755e408542Jim Ingham { 527767af88aa617288e584afcfed055f7755e408542Jim Ingham if (option_arg_vector->size() == 0) 528238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.RemoveAliasOptions (alias_command.c_str()); 529767af88aa617288e584afcfed055f7755e408542Jim Ingham } 530767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n", 531767af88aa617288e584afcfed055f7755e408542Jim Ingham alias_command.c_str()); 532767af88aa617288e584afcfed055f7755e408542Jim Ingham } 533767af88aa617288e584afcfed055f7755e408542Jim Ingham 534767af88aa617288e584afcfed055f7755e408542Jim Ingham if (use_subcommand) 535238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.AddAlias (alias_command.c_str(), subcommand_obj_sp); 536767af88aa617288e584afcfed055f7755e408542Jim Ingham else 537238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.AddAlias (alias_command.c_str(), command_obj_sp); 538767af88aa617288e584afcfed055f7755e408542Jim Ingham if (option_arg_vector->size() > 0) 539238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp); 540767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 541767af88aa617288e584afcfed055f7755e408542Jim Ingham } 542767af88aa617288e584afcfed055f7755e408542Jim Ingham else 543767af88aa617288e584afcfed055f7755e408542Jim Ingham { 544767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat ("'%s' is not an existing command.\n", actual_command.c_str()); 545767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 546e6866a3819d68be21004ffdf773e36e7f00a6a26Caroline Tice return false; 547767af88aa617288e584afcfed055f7755e408542Jim Ingham } 548767af88aa617288e584afcfed055f7755e408542Jim Ingham } 549767af88aa617288e584afcfed055f7755e408542Jim Ingham 550767af88aa617288e584afcfed055f7755e408542Jim Ingham return result.Succeeded(); 551767af88aa617288e584afcfed055f7755e408542Jim Ingham } 552767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 553767af88aa617288e584afcfed055f7755e408542Jim Ingham 554767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectCommandsUnalias 555767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 556767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectCommandsUnalias 557767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 558767af88aa617288e584afcfed055f7755e408542Jim Ingham 559767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectCommandsUnalias : public CommandObject 560767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 561767af88aa617288e584afcfed055f7755e408542Jim Inghampublic: 562238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectCommandsUnalias (CommandInterpreter &interpreter) : 563238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObject (interpreter, 56440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton "command unalias", 565146292c83470680b98a4e4046428e0849e1ffe8fCaroline Tice "Allow the user to remove/delete a user-defined command abbreviation.", 56643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice NULL) 567767af88aa617288e584afcfed055f7755e408542Jim Ingham { 56843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentEntry arg; 56943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice CommandArgumentData alias_arg; 57043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 57143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Define the first (and only) variant of this arg. 57243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice alias_arg.arg_type = eArgTypeAliasName; 57343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice alias_arg.arg_repetition = eArgRepeatPlain; 57443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 57543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 57643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice arg.push_back (alias_arg); 57743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice 57843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice // Push the data for the first argument into the m_arguments vector. 57943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice m_arguments.push_back (arg); 580767af88aa617288e584afcfed055f7755e408542Jim Ingham } 581767af88aa617288e584afcfed055f7755e408542Jim Ingham 582767af88aa617288e584afcfed055f7755e408542Jim Ingham ~CommandObjectCommandsUnalias() 583767af88aa617288e584afcfed055f7755e408542Jim Ingham { 584767af88aa617288e584afcfed055f7755e408542Jim Ingham } 585767af88aa617288e584afcfed055f7755e408542Jim Ingham 586767af88aa617288e584afcfed055f7755e408542Jim Ingham 587767af88aa617288e584afcfed055f7755e408542Jim Ingham bool 588767af88aa617288e584afcfed055f7755e408542Jim Ingham Execute 589767af88aa617288e584afcfed055f7755e408542Jim Ingham ( 590767af88aa617288e584afcfed055f7755e408542Jim Ingham Args& args, 591767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandReturnObject &result 592767af88aa617288e584afcfed055f7755e408542Jim Ingham ) 593767af88aa617288e584afcfed055f7755e408542Jim Ingham { 594767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandObject::CommandMap::iterator pos; 595767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandObject *cmd_obj; 596767af88aa617288e584afcfed055f7755e408542Jim Ingham 597767af88aa617288e584afcfed055f7755e408542Jim Ingham if (args.GetArgumentCount() != 0) 598767af88aa617288e584afcfed055f7755e408542Jim Ingham { 599767af88aa617288e584afcfed055f7755e408542Jim Ingham const char *command_name = args.GetArgumentAtIndex(0); 600238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton cmd_obj = m_interpreter.GetCommandObject(command_name); 601767af88aa617288e584afcfed055f7755e408542Jim Ingham if (cmd_obj) 602767af88aa617288e584afcfed055f7755e408542Jim Ingham { 603238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.CommandExists (command_name)) 604767af88aa617288e584afcfed055f7755e408542Jim Ingham { 605767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be removed.\n", 606767af88aa617288e584afcfed055f7755e408542Jim Ingham command_name); 607767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 608767af88aa617288e584afcfed055f7755e408542Jim Ingham } 609767af88aa617288e584afcfed055f7755e408542Jim Ingham else 610767af88aa617288e584afcfed055f7755e408542Jim Ingham { 611767af88aa617288e584afcfed055f7755e408542Jim Ingham 612238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.RemoveAlias (command_name) == false) 613767af88aa617288e584afcfed055f7755e408542Jim Ingham { 614238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton if (m_interpreter.AliasExists (command_name)) 615767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat ("Error occurred while attempting to unalias '%s'.\n", 616767af88aa617288e584afcfed055f7755e408542Jim Ingham command_name); 617767af88aa617288e584afcfed055f7755e408542Jim Ingham else 618767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat ("'%s' is not an existing alias.\n", command_name); 619767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 620767af88aa617288e584afcfed055f7755e408542Jim Ingham } 621767af88aa617288e584afcfed055f7755e408542Jim Ingham else 622767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 623767af88aa617288e584afcfed055f7755e408542Jim Ingham } 624767af88aa617288e584afcfed055f7755e408542Jim Ingham } 625767af88aa617288e584afcfed055f7755e408542Jim Ingham else 626767af88aa617288e584afcfed055f7755e408542Jim Ingham { 627767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendErrorWithFormat ("'%s' is not a known command.\nTry 'help' to see a " 628767af88aa617288e584afcfed055f7755e408542Jim Ingham "current list of commands.\n", 629767af88aa617288e584afcfed055f7755e408542Jim Ingham command_name); 630767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 631767af88aa617288e584afcfed055f7755e408542Jim Ingham } 632767af88aa617288e584afcfed055f7755e408542Jim Ingham } 633767af88aa617288e584afcfed055f7755e408542Jim Ingham else 634767af88aa617288e584afcfed055f7755e408542Jim Ingham { 635767af88aa617288e584afcfed055f7755e408542Jim Ingham result.AppendError ("must call 'unalias' with a valid alias"); 636767af88aa617288e584afcfed055f7755e408542Jim Ingham result.SetStatus (eReturnStatusFailed); 637767af88aa617288e584afcfed055f7755e408542Jim Ingham } 638767af88aa617288e584afcfed055f7755e408542Jim Ingham 639767af88aa617288e584afcfed055f7755e408542Jim Ingham return result.Succeeded(); 640767af88aa617288e584afcfed055f7755e408542Jim Ingham } 641767af88aa617288e584afcfed055f7755e408542Jim Ingham}; 642767af88aa617288e584afcfed055f7755e408542Jim Ingham 643d12aeab33bab559e138307f599077da3918a3238Greg Clayton#pragma mark CommandObjectCommandsAddRegex 644d12aeab33bab559e138307f599077da3918a3238Greg Clayton//------------------------------------------------------------------------- 645d12aeab33bab559e138307f599077da3918a3238Greg Clayton// CommandObjectCommandsAddRegex 646d12aeab33bab559e138307f599077da3918a3238Greg Clayton//------------------------------------------------------------------------- 647d12aeab33bab559e138307f599077da3918a3238Greg Clayton 648d12aeab33bab559e138307f599077da3918a3238Greg Claytonclass CommandObjectCommandsAddRegex : public CommandObject 649d12aeab33bab559e138307f599077da3918a3238Greg Clayton{ 650d12aeab33bab559e138307f599077da3918a3238Greg Claytonpublic: 651d12aeab33bab559e138307f599077da3918a3238Greg Clayton CommandObjectCommandsAddRegex (CommandInterpreter &interpreter) : 652d12aeab33bab559e138307f599077da3918a3238Greg Clayton CommandObject (interpreter, 65340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton "command regex", 654d12aeab33bab559e138307f599077da3918a3238Greg Clayton "Allow the user to create a regular expression command.", 65540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton "command regex <cmd-name> [s/<regex>/<subst>/ ...]"), 656d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_options (interpreter) 657d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 65840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton SetHelpLong( 65940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"This command allows the user to create powerful regular expression commands\n" 66040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"with substitutions. The regular expressions and substitutions are specified\n" 66140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"using the regular exression substitution format of:\n" 66240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n" 66340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton" s/<regex>/<subst>/\n" 66440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n" 66540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"<regex> is a regular expression that can use parenthesis to capture regular\n" 66640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"expression input and substitute the captured matches in the output using %1\n" 66740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"for the first match, %2 for the second, and so on.\n" 66840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n" 66940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"The regular expressions can all be specified on the command line if more than\n" 67040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"one argument is provided. If just the command name is provided on the command\n" 67140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"line, then the regular expressions and substitutions can be entered on separate\n" 67240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton" lines, followed by an empty line to terminate the command definition.\n" 67340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n" 67440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"EXAMPLES\n" 67540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n" 67640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"The following example with define a regular expression command named 'f' that\n" 67740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"will call 'finish' if there are no arguments, or 'frame select <frame-idx>' if\n" 67840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"a number follows 'f':\n" 67940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"(lldb) command regex f s/^$/finish/ 's/([0-9]+)/frame select %1/'\n" 68040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton ); 681d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 682d12aeab33bab559e138307f599077da3918a3238Greg Clayton 683d12aeab33bab559e138307f599077da3918a3238Greg Clayton ~CommandObjectCommandsAddRegex() 684d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 685d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 686d12aeab33bab559e138307f599077da3918a3238Greg Clayton 687d12aeab33bab559e138307f599077da3918a3238Greg Clayton 688d12aeab33bab559e138307f599077da3918a3238Greg Clayton bool 689d12aeab33bab559e138307f599077da3918a3238Greg Clayton Execute (Args& args, CommandReturnObject &result) 690d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 69140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton const size_t argc = args.GetArgumentCount(); 69240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (argc == 0) 693d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 69440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton result.AppendError ("usage: 'commands regex <command-name> [s/<regex1>/<subst1>/ s/<regex2>/<subst2>/ ...]'\n"); 69540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton result.SetStatus (eReturnStatusFailed); 69640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 69740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton else 69840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 69940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton Error error; 700d12aeab33bab559e138307f599077da3918a3238Greg Clayton const char *name = args.GetArgumentAtIndex(0); 701d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_regex_cmd_ap.reset (new CommandObjectRegexCommand (m_interpreter, 702d12aeab33bab559e138307f599077da3918a3238Greg Clayton name, 703d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_options.GetHelp (), 704d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_options.GetSyntax (), 705d12aeab33bab559e138307f599077da3918a3238Greg Clayton 10)); 70640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 70740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (argc == 1) 708d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 70940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger())); 71040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (reader_sp) 71140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 71240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error =reader_sp->Initialize (CommandObjectCommandsAddRegex::InputReaderCallback, 713d12aeab33bab559e138307f599077da3918a3238Greg Clayton this, // baton 714d12aeab33bab559e138307f599077da3918a3238Greg Clayton eInputReaderGranularityLine, // token size, to pass to callback function 71540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton NULL, // end token 716d12aeab33bab559e138307f599077da3918a3238Greg Clayton "> ", // prompt 71740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton true); // echo input 71840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (error.Success()) 71940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 72040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton m_interpreter.GetDebugger().PushInputReader (reader_sp); 72140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton result.SetStatus (eReturnStatusSuccessFinishNoResult); 72240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return true; 72340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 72440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 72540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 72640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton else 72740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 72840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton for (size_t arg_idx = 1; arg_idx < argc; ++arg_idx) 729d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 73040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton llvm::StringRef arg_strref (args.GetArgumentAtIndex(arg_idx)); 73140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error = AppendRegexSubstitution (arg_strref); 73240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (error.Fail()) 73340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton break; 734d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 73540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 73640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (error.Success()) 737d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 73840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton AddRegexCommandToInterpreter(); 739d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 740d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 74140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (error.Fail()) 74240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 74340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton result.AppendError (error.AsCString()); 74440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton result.SetStatus (eReturnStatusFailed); 74540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 746d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 74740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 748d12aeab33bab559e138307f599077da3918a3238Greg Clayton return result.Succeeded(); 749d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 750d12aeab33bab559e138307f599077da3918a3238Greg Clayton 75140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton Error 75240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton AppendRegexSubstitution (const llvm::StringRef ®ex_sed) 753d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 75440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton Error error; 75540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 75640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (m_regex_cmd_ap.get() == NULL) 75740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 75840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("invalid regular expression command object for: '%.*s'", 75940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)regex_sed.size(), 76040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data()); 76140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 76240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 76340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 76440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton size_t regex_sed_size = regex_sed.size(); 76540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 76640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (regex_sed_size <= 1) 767d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 76840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("regular expression substitution string is too short: '%.*s'", 76940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)regex_sed.size(), 77040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data()); 77140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 772d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 77340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 77440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (regex_sed[0] != 's') 77540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 77640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("regular expression substitution string doesn't start with 's': '%.*s'", 77740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)regex_sed.size(), 77840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data()); 77940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 78040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 78140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton const size_t first_separator_char_pos = 1; 78240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton // use the char that follows 's' as the regex separator character 78340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton // so we can have "s/<regex>/<subst>/" or "s|<regex>|<subst>|" 78440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton const char separator_char = regex_sed[first_separator_char_pos]; 78540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton const size_t second_separator_char_pos = regex_sed.find (separator_char, first_separator_char_pos + 1); 78640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 78740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (second_separator_char_pos == std::string::npos) 78840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 78940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("missing second '%c' separator char after '%.*s'", 79040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 79140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)(regex_sed.size() - first_separator_char_pos - 1), 79240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data() + (first_separator_char_pos + 1)); 79340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 79440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 79540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 79640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton const size_t third_separator_char_pos = regex_sed.find (separator_char, second_separator_char_pos + 1); 79740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 79840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (third_separator_char_pos == std::string::npos) 79940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 80040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("missing third '%c' separator char after '%.*s'", 80140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 80240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)(regex_sed.size() - second_separator_char_pos - 1), 80340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data() + (second_separator_char_pos + 1)); 80440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 80540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 80640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 80740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (third_separator_char_pos != regex_sed_size - 1) 80840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 80940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton // Make sure that everything that follows the last regex 81040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton // separator char 81140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (regex_sed.find_first_not_of("\t\n\v\f\r ", third_separator_char_pos + 1) != std::string::npos) 81240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 81340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("extra data found after the '%.*s' regular expression substitution string: '%.*s'", 81440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)third_separator_char_pos + 1, 81540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data(), 81640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)(regex_sed.size() - third_separator_char_pos - 1), 81740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data() + (third_separator_char_pos + 1)); 81840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 81940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 82040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 82140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 82240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton else if (first_separator_char_pos + 1 == second_separator_char_pos) 82340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 82440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("<regex> can't be empty in 's%c<regex>%c<subst>%c' string: '%.*s'", 82540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 82640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 82740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 82840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)regex_sed.size(), 82940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data()); 83040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 83140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 83240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton else if (second_separator_char_pos + 1 == third_separator_char_pos) 83340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 83440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton error.SetErrorStringWithFormat("<subst> can't be empty in 's%c<regex>%c<subst>%c' string: '%.*s'", 83540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 83640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 83740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton separator_char, 83840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton (int)regex_sed.size(), 83940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton regex_sed.data()); 84040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 84140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 84240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton std::string regex(regex_sed.substr(first_separator_char_pos + 1, second_separator_char_pos - first_separator_char_pos - 1)); 84340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton std::string subst(regex_sed.substr(second_separator_char_pos + 1, third_separator_char_pos - second_separator_char_pos - 1)); 84440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton m_regex_cmd_ap->AddRegexCommand (regex.c_str(), 84540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton subst.c_str()); 84640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton return error; 847d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 848d12aeab33bab559e138307f599077da3918a3238Greg Clayton 849d12aeab33bab559e138307f599077da3918a3238Greg Clayton void 85040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton AddRegexCommandToInterpreter() 851d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 852d12aeab33bab559e138307f599077da3918a3238Greg Clayton if (m_regex_cmd_ap.get()) 853d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 854d12aeab33bab559e138307f599077da3918a3238Greg Clayton if (m_regex_cmd_ap->HasRegexEntries()) 855d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 856d12aeab33bab559e138307f599077da3918a3238Greg Clayton CommandObjectSP cmd_sp (m_regex_cmd_ap.release()); 857d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_interpreter.AddCommand(cmd_sp->GetCommandName(), cmd_sp, true); 858d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 859d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 860d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 861d12aeab33bab559e138307f599077da3918a3238Greg Clayton 86240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton void 86340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton InputReaderDidCancel() 86440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton { 86540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton m_regex_cmd_ap.reset(); 86640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton } 86740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton 868d12aeab33bab559e138307f599077da3918a3238Greg Clayton static size_t 869d12aeab33bab559e138307f599077da3918a3238Greg Clayton InputReaderCallback (void *baton, 870d12aeab33bab559e138307f599077da3918a3238Greg Clayton InputReader &reader, 871d12aeab33bab559e138307f599077da3918a3238Greg Clayton lldb::InputReaderAction notification, 872d12aeab33bab559e138307f599077da3918a3238Greg Clayton const char *bytes, 873d12aeab33bab559e138307f599077da3918a3238Greg Clayton size_t bytes_len); 874d12aeab33bab559e138307f599077da3918a3238Greg Claytonprivate: 875d12aeab33bab559e138307f599077da3918a3238Greg Clayton std::auto_ptr<CommandObjectRegexCommand> m_regex_cmd_ap; 876d12aeab33bab559e138307f599077da3918a3238Greg Clayton 877d12aeab33bab559e138307f599077da3918a3238Greg Clayton class CommandOptions : public Options 878d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 879d12aeab33bab559e138307f599077da3918a3238Greg Clayton public: 880d12aeab33bab559e138307f599077da3918a3238Greg Clayton 881d12aeab33bab559e138307f599077da3918a3238Greg Clayton CommandOptions (CommandInterpreter &interpreter) : 882d12aeab33bab559e138307f599077da3918a3238Greg Clayton Options (interpreter) 883d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 884d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 885d12aeab33bab559e138307f599077da3918a3238Greg Clayton 886d12aeab33bab559e138307f599077da3918a3238Greg Clayton virtual 887d12aeab33bab559e138307f599077da3918a3238Greg Clayton ~CommandOptions (){} 888d12aeab33bab559e138307f599077da3918a3238Greg Clayton 889d12aeab33bab559e138307f599077da3918a3238Greg Clayton virtual Error 890d12aeab33bab559e138307f599077da3918a3238Greg Clayton SetOptionValue (uint32_t option_idx, const char *option_arg) 891d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 892d12aeab33bab559e138307f599077da3918a3238Greg Clayton Error error; 893d12aeab33bab559e138307f599077da3918a3238Greg Clayton char short_option = (char) m_getopt_table[option_idx].val; 894d12aeab33bab559e138307f599077da3918a3238Greg Clayton 895d12aeab33bab559e138307f599077da3918a3238Greg Clayton switch (short_option) 896d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 897d12aeab33bab559e138307f599077da3918a3238Greg Clayton case 'h': 898d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_help.assign (option_arg); 899d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 900d12aeab33bab559e138307f599077da3918a3238Greg Clayton case 's': 901d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_syntax.assign (option_arg); 902d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 903d12aeab33bab559e138307f599077da3918a3238Greg Clayton 904d12aeab33bab559e138307f599077da3918a3238Greg Clayton default: 905d12aeab33bab559e138307f599077da3918a3238Greg Clayton error.SetErrorStringWithFormat ("Unrecognized option '%c'.\n", short_option); 906d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 907d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 908d12aeab33bab559e138307f599077da3918a3238Greg Clayton 909d12aeab33bab559e138307f599077da3918a3238Greg Clayton return error; 910d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 911d12aeab33bab559e138307f599077da3918a3238Greg Clayton 912d12aeab33bab559e138307f599077da3918a3238Greg Clayton void 913d12aeab33bab559e138307f599077da3918a3238Greg Clayton OptionParsingStarting () 914d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 915d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_help.clear(); 916d12aeab33bab559e138307f599077da3918a3238Greg Clayton m_syntax.clear(); 917d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 918d12aeab33bab559e138307f599077da3918a3238Greg Clayton 919d12aeab33bab559e138307f599077da3918a3238Greg Clayton const OptionDefinition* 920d12aeab33bab559e138307f599077da3918a3238Greg Clayton GetDefinitions () 921d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 922d12aeab33bab559e138307f599077da3918a3238Greg Clayton return g_option_table; 923d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 924d12aeab33bab559e138307f599077da3918a3238Greg Clayton 925d12aeab33bab559e138307f599077da3918a3238Greg Clayton // Options table: Required for subclasses of Options. 926d12aeab33bab559e138307f599077da3918a3238Greg Clayton 927d12aeab33bab559e138307f599077da3918a3238Greg Clayton static OptionDefinition g_option_table[]; 928d12aeab33bab559e138307f599077da3918a3238Greg Clayton 929d12aeab33bab559e138307f599077da3918a3238Greg Clayton const char * 930d12aeab33bab559e138307f599077da3918a3238Greg Clayton GetHelp () 931d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 932d12aeab33bab559e138307f599077da3918a3238Greg Clayton if (m_help.empty()) 933d12aeab33bab559e138307f599077da3918a3238Greg Clayton return NULL; 934d12aeab33bab559e138307f599077da3918a3238Greg Clayton return m_help.c_str(); 935d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 936d12aeab33bab559e138307f599077da3918a3238Greg Clayton const char * 937d12aeab33bab559e138307f599077da3918a3238Greg Clayton GetSyntax () 938d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 939d12aeab33bab559e138307f599077da3918a3238Greg Clayton if (m_syntax.empty()) 940d12aeab33bab559e138307f599077da3918a3238Greg Clayton return NULL; 941d12aeab33bab559e138307f599077da3918a3238Greg Clayton return m_syntax.c_str(); 942d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 943d12aeab33bab559e138307f599077da3918a3238Greg Clayton // Instance variables to hold the values for command options. 944d12aeab33bab559e138307f599077da3918a3238Greg Clayton protected: 945d12aeab33bab559e138307f599077da3918a3238Greg Clayton std::string m_help; 946d12aeab33bab559e138307f599077da3918a3238Greg Clayton std::string m_syntax; 947d12aeab33bab559e138307f599077da3918a3238Greg Clayton }; 948d12aeab33bab559e138307f599077da3918a3238Greg Clayton 949d12aeab33bab559e138307f599077da3918a3238Greg Clayton CommandOptions m_options; 950d12aeab33bab559e138307f599077da3918a3238Greg Clayton 951d12aeab33bab559e138307f599077da3918a3238Greg Clayton virtual Options * 952d12aeab33bab559e138307f599077da3918a3238Greg Clayton GetOptions () 953d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 954d12aeab33bab559e138307f599077da3918a3238Greg Clayton return &m_options; 955d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 956d12aeab33bab559e138307f599077da3918a3238Greg Clayton 957d12aeab33bab559e138307f599077da3918a3238Greg Clayton}; 958d12aeab33bab559e138307f599077da3918a3238Greg Clayton 959d12aeab33bab559e138307f599077da3918a3238Greg Claytonsize_t 960d12aeab33bab559e138307f599077da3918a3238Greg ClaytonCommandObjectCommandsAddRegex::InputReaderCallback (void *baton, 961d12aeab33bab559e138307f599077da3918a3238Greg Clayton InputReader &reader, 962d12aeab33bab559e138307f599077da3918a3238Greg Clayton lldb::InputReaderAction notification, 963d12aeab33bab559e138307f599077da3918a3238Greg Clayton const char *bytes, 964d12aeab33bab559e138307f599077da3918a3238Greg Clayton size_t bytes_len) 965d12aeab33bab559e138307f599077da3918a3238Greg Clayton{ 966d12aeab33bab559e138307f599077da3918a3238Greg Clayton CommandObjectCommandsAddRegex *add_regex_cmd = (CommandObjectCommandsAddRegex *) baton; 967d12aeab33bab559e138307f599077da3918a3238Greg Clayton 968d12aeab33bab559e138307f599077da3918a3238Greg Clayton switch (notification) 969d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 970d12aeab33bab559e138307f599077da3918a3238Greg Clayton case eInputReaderActivate: 97140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton reader.GetDebugger().GetOutputStream().Printf("%s\n", "Enter regular expressions in the form 's/<regex>/<subst>/' and terminate with an empty line:"); 972d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 973d12aeab33bab559e138307f599077da3918a3238Greg Clayton case eInputReaderReactivate: 974d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 975d12aeab33bab559e138307f599077da3918a3238Greg Clayton 976d12aeab33bab559e138307f599077da3918a3238Greg Clayton case eInputReaderDeactivate: 977d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 978d12aeab33bab559e138307f599077da3918a3238Greg Clayton 979d12aeab33bab559e138307f599077da3918a3238Greg Clayton case eInputReaderGotToken: 98040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton while (bytes_len > 0 && (bytes[bytes_len-1] == '\r' || bytes[bytes_len-1] == '\n')) 98140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton --bytes_len; 982d12aeab33bab559e138307f599077da3918a3238Greg Clayton if (bytes_len == 0) 983d12aeab33bab559e138307f599077da3918a3238Greg Clayton reader.SetIsDone(true); 984d12aeab33bab559e138307f599077da3918a3238Greg Clayton else if (bytes) 985d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 98640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton llvm::StringRef bytes_strref (bytes, bytes_len); 98740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton Error error (add_regex_cmd->AppendRegexSubstitution (bytes_strref)); 98840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton if (error.Fail()) 989d12aeab33bab559e138307f599077da3918a3238Greg Clayton { 99040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton reader.GetDebugger().GetOutputStream().Printf("error: %s\n", error.AsCString()); 99140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton add_regex_cmd->InputReaderDidCancel (); 99240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton reader.SetIsDone (true); 993d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 994d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 995d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 996d12aeab33bab559e138307f599077da3918a3238Greg Clayton 997d12aeab33bab559e138307f599077da3918a3238Greg Clayton case eInputReaderInterrupt: 998d12aeab33bab559e138307f599077da3918a3238Greg Clayton reader.SetIsDone (true); 999d12aeab33bab559e138307f599077da3918a3238Greg Clayton reader.GetDebugger().GetOutputStream().PutCString("Regular expression command creations was cancelled.\n"); 100040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton add_regex_cmd->InputReaderDidCancel (); 1001d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 1002d12aeab33bab559e138307f599077da3918a3238Greg Clayton 1003d12aeab33bab559e138307f599077da3918a3238Greg Clayton case eInputReaderEndOfFile: 1004d12aeab33bab559e138307f599077da3918a3238Greg Clayton reader.SetIsDone (true); 1005d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 1006d12aeab33bab559e138307f599077da3918a3238Greg Clayton 1007d12aeab33bab559e138307f599077da3918a3238Greg Clayton case eInputReaderDone: 100840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton add_regex_cmd->AddRegexCommandToInterpreter(); 1009d12aeab33bab559e138307f599077da3918a3238Greg Clayton break; 1010d12aeab33bab559e138307f599077da3918a3238Greg Clayton } 1011d12aeab33bab559e138307f599077da3918a3238Greg Clayton 1012d12aeab33bab559e138307f599077da3918a3238Greg Clayton return bytes_len; 1013d12aeab33bab559e138307f599077da3918a3238Greg Clayton} 1014d12aeab33bab559e138307f599077da3918a3238Greg Clayton 1015d12aeab33bab559e138307f599077da3918a3238Greg Clayton 1016d12aeab33bab559e138307f599077da3918a3238Greg ClaytonOptionDefinition 1017d12aeab33bab559e138307f599077da3918a3238Greg ClaytonCommandObjectCommandsAddRegex::CommandOptions::g_option_table[] = 1018d12aeab33bab559e138307f599077da3918a3238Greg Clayton{ 101940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton{ LLDB_OPT_SET_1, false, "help" , 'h', required_argument, NULL, 0, eArgTypeNone, "The help text to display for this command."}, 1020d12aeab33bab559e138307f599077da3918a3238Greg Clayton{ LLDB_OPT_SET_1, false, "syntax", 's', required_argument, NULL, 0, eArgTypeNone, "A syntax string showing the typical usage syntax."}, 102140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton{ 0 , false, NULL , 0 , 0 , NULL, 0, eArgTypeNone, NULL } 1022d12aeab33bab559e138307f599077da3918a3238Greg Clayton}; 1023d12aeab33bab559e138307f599077da3918a3238Greg Clayton 1024d12aeab33bab559e138307f599077da3918a3238Greg Clayton 1025767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordCommands 1026767af88aa617288e584afcfed055f7755e408542Jim Ingham 1027767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 1028767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordCommands 1029767af88aa617288e584afcfed055f7755e408542Jim Ingham//------------------------------------------------------------------------- 1030767af88aa617288e584afcfed055f7755e408542Jim Ingham 1031767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordCommands::CommandObjectMultiwordCommands (CommandInterpreter &interpreter) : 1032238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton CommandObjectMultiword (interpreter, 103340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton "command", 1034c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice "A set of commands for managing or customizing the debugger commands.", 103540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton "command <subcommand> [<subcommand-options>]") 1036767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 1037238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("source", CommandObjectSP (new CommandObjectCommandsSource (interpreter))); 1038238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("alias", CommandObjectSP (new CommandObjectCommandsAlias (interpreter))); 1039238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton LoadSubCommand ("unalias", CommandObjectSP (new CommandObjectCommandsUnalias (interpreter))); 1040d12aeab33bab559e138307f599077da3918a3238Greg Clayton LoadSubCommand ("regex", CommandObjectSP (new CommandObjectCommandsAddRegex (interpreter))); 1041767af88aa617288e584afcfed055f7755e408542Jim Ingham} 1042767af88aa617288e584afcfed055f7755e408542Jim Ingham 1043767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordCommands::~CommandObjectMultiwordCommands () 1044767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 1045767af88aa617288e584afcfed055f7755e408542Jim Ingham} 1046767af88aa617288e584afcfed055f7755e408542Jim Ingham 1047