1ebc09c36SJim Ingham //===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===// 2ebc09c36SJim Ingham // 3ebc09c36SJim Ingham // The LLVM Compiler Infrastructure 4ebc09c36SJim Ingham // 5ebc09c36SJim Ingham // This file is distributed under the University of Illinois Open Source 6ebc09c36SJim Ingham // License. See LICENSE.TXT for details. 7ebc09c36SJim Ingham // 8ebc09c36SJim Ingham //===----------------------------------------------------------------------===// 9ebc09c36SJim Ingham 10ebc09c36SJim Ingham #include "CommandObjectCommands.h" 11ebc09c36SJim Ingham 12ebc09c36SJim Ingham // C Includes 13ebc09c36SJim Ingham // C++ Includes 14ebc09c36SJim Ingham // Other libraries and framework includes 15ebc09c36SJim Ingham // Project includes 16ebc09c36SJim Ingham #include "lldb/Interpreter/Args.h" 17ebc09c36SJim Ingham #include "lldb/Core/Debugger.h" 18ebc09c36SJim Ingham #include "lldb/Interpreter/CommandInterpreter.h" 19ebc09c36SJim Ingham #include "lldb/Interpreter/CommandReturnObject.h" 20ebc09c36SJim Ingham #include "lldb/Interpreter/Options.h" 21ebc09c36SJim Ingham 22ebc09c36SJim Ingham using namespace lldb; 23ebc09c36SJim Ingham using namespace lldb_private; 24ebc09c36SJim Ingham 25ebc09c36SJim Ingham const char *k_space_characters = "\t\n\v\f\r "; 26ebc09c36SJim Ingham 27ebc09c36SJim Ingham //------------------------------------------------------------------------- 28ebc09c36SJim Ingham // CommandObjectCommandsSource 29ebc09c36SJim Ingham //------------------------------------------------------------------------- 30ebc09c36SJim Ingham 31ebc09c36SJim Ingham class CommandObjectCommandsSource : public CommandObject 32ebc09c36SJim Ingham { 33ebc09c36SJim Ingham public: 34a7015092SGreg Clayton CommandObjectCommandsSource(CommandInterpreter &interpreter) : 35a7015092SGreg Clayton CommandObject (interpreter, 36a7015092SGreg Clayton "commands source", 37e3d26315SCaroline Tice "Read in debugger commands from the file <filename> and execute them.", 38*405fe67fSCaroline Tice NULL) 39ebc09c36SJim Ingham { 40*405fe67fSCaroline Tice CommandArgumentEntry arg; 41*405fe67fSCaroline Tice CommandArgumentData file_arg; 42*405fe67fSCaroline Tice 43*405fe67fSCaroline Tice // Define the first (and only) variant of this arg. 44*405fe67fSCaroline Tice file_arg.arg_type = eArgTypeFilename; 45*405fe67fSCaroline Tice file_arg.arg_repetition = eArgRepeatPlain; 46*405fe67fSCaroline Tice 47*405fe67fSCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 48*405fe67fSCaroline Tice arg.push_back (file_arg); 49*405fe67fSCaroline Tice 50*405fe67fSCaroline Tice // Push the data for the first argument into the m_arguments vector. 51*405fe67fSCaroline Tice m_arguments.push_back (arg); 52ebc09c36SJim Ingham } 53ebc09c36SJim Ingham 54ebc09c36SJim Ingham ~CommandObjectCommandsSource () 55ebc09c36SJim Ingham { 56ebc09c36SJim Ingham } 57ebc09c36SJim Ingham 58ebc09c36SJim Ingham bool 59ebc09c36SJim Ingham Execute 60ebc09c36SJim Ingham ( 61ebc09c36SJim Ingham Args& args, 62ebc09c36SJim Ingham CommandReturnObject &result 63ebc09c36SJim Ingham ) 64ebc09c36SJim Ingham { 65ebc09c36SJim Ingham const int argc = args.GetArgumentCount(); 66ebc09c36SJim Ingham if (argc == 1) 67ebc09c36SJim Ingham { 68ebc09c36SJim Ingham const char *filename = args.GetArgumentAtIndex(0); 69ebc09c36SJim Ingham bool success = true; 70ebc09c36SJim Ingham 71ebc09c36SJim Ingham result.AppendMessageWithFormat ("Executing commands in '%s'.\n", filename); 72ebc09c36SJim Ingham 73ebc09c36SJim Ingham FileSpec cmd_file (filename); 74ebc09c36SJim Ingham if (cmd_file.Exists()) 75ebc09c36SJim Ingham { 76ebc09c36SJim Ingham STLStringArray commands; 77ebc09c36SJim Ingham success = cmd_file.ReadFileLines (commands); 78ebc09c36SJim Ingham 79ebc09c36SJim Ingham STLStringArray::iterator pos = commands.begin(); 80ebc09c36SJim Ingham 81ebc09c36SJim Ingham // Trim out any empty lines or lines that start with the comment 82ebc09c36SJim Ingham // char '#' 83ebc09c36SJim Ingham while (pos != commands.end()) 84ebc09c36SJim Ingham { 85ebc09c36SJim Ingham size_t non_space = pos->find_first_not_of (k_space_characters); 860603aa9dSGreg Clayton // Check for empty line or comment line (lines whose first 870603aa9dSGreg Clayton // non-space character is a '#') 880603aa9dSGreg Clayton if (non_space == std::string::npos || (*pos)[non_space] == '#') 89ebc09c36SJim Ingham pos = commands.erase(pos); 90ebc09c36SJim Ingham else 91ebc09c36SJim Ingham ++pos; 92ebc09c36SJim Ingham } 93ebc09c36SJim Ingham 94ebc09c36SJim Ingham if (commands.size() > 0) 95ebc09c36SJim Ingham { 96ebc09c36SJim Ingham const size_t num_commands = commands.size(); 97ebc09c36SJim Ingham size_t i; 98ebc09c36SJim Ingham for (i = 0; i<num_commands; ++i) 99ebc09c36SJim Ingham { 100a7015092SGreg Clayton result.GetOutputStream().Printf ("%s %s\n", 101a7015092SGreg Clayton m_interpreter.GetPrompt(), 102a7015092SGreg Clayton commands[i].c_str()); 103a7015092SGreg Clayton if (!m_interpreter.HandleCommand(commands[i].c_str(), false, result)) 104ebc09c36SJim Ingham break; 105ebc09c36SJim Ingham } 106ebc09c36SJim Ingham 107ebc09c36SJim Ingham if (i < num_commands) 108ebc09c36SJim Ingham { 109ebc09c36SJim Ingham result.AppendErrorWithFormat("Aborting source of '%s' after command '%s' failed.\n", 110ebc09c36SJim Ingham filename, commands[i].c_str()); 111ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 112ebc09c36SJim Ingham } 113ebc09c36SJim Ingham else 114ebc09c36SJim Ingham { 115ebc09c36SJim Ingham success = true; 116ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 117ebc09c36SJim Ingham } 118ebc09c36SJim Ingham } 119ebc09c36SJim Ingham } 120ebc09c36SJim Ingham else 121ebc09c36SJim Ingham { 122ebc09c36SJim Ingham result.AppendErrorWithFormat ("File '%s' does not exist.\n", filename); 123ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 124ebc09c36SJim Ingham success = false; 125ebc09c36SJim Ingham } 126ebc09c36SJim Ingham 127ebc09c36SJim Ingham if (success) 128ebc09c36SJim Ingham { 129ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 130ebc09c36SJim Ingham } 131ebc09c36SJim Ingham } 132ebc09c36SJim Ingham else 133ebc09c36SJim Ingham { 134ebc09c36SJim Ingham result.AppendErrorWithFormat("'%s' takes exactly one executable filename argument.\n", GetCommandName()); 135ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 136ebc09c36SJim Ingham } 137ebc09c36SJim Ingham return result.Succeeded(); 138ebc09c36SJim Ingham 139ebc09c36SJim Ingham } 140ebc09c36SJim Ingham }; 141ebc09c36SJim Ingham 142ebc09c36SJim Ingham #pragma mark CommandObjectCommandsAlias 143ebc09c36SJim Ingham //------------------------------------------------------------------------- 144ebc09c36SJim Ingham // CommandObjectCommandsAlias 145ebc09c36SJim Ingham //------------------------------------------------------------------------- 146ebc09c36SJim Ingham 147ebc09c36SJim Ingham class CommandObjectCommandsAlias : public CommandObject 148ebc09c36SJim Ingham { 149ebc09c36SJim Ingham public: 150a7015092SGreg Clayton CommandObjectCommandsAlias (CommandInterpreter &interpreter) : 151a7015092SGreg Clayton CommandObject (interpreter, 152a7015092SGreg Clayton "commands alias", 153e3d26315SCaroline Tice "Allow users to define their own debugger command abbreviations.", 154*405fe67fSCaroline Tice NULL) 155ebc09c36SJim Ingham { 156ebc09c36SJim Ingham SetHelpLong( 157ebc09c36SJim Ingham "'alias' allows the user to create a short-cut or abbreviation for long \n\ 158ebc09c36SJim Ingham commands, multi-word commands, and commands that take particular options. \n\ 159ebc09c36SJim Ingham Below are some simple examples of how one might use the 'alias' command: \n\ 16009799af6SCaroline Tice \n 'commands alias sc script' // Creates the abbreviation 'sc' for the 'script' \n\ 161ebc09c36SJim Ingham // command. \n\ 16209799af6SCaroline Tice 'commands alias bp breakpoint' // Creates the abbreviation 'bp' for the 'breakpoint' \n\ 163ebc09c36SJim Ingham // command. Since breakpoint commands are two-word \n\ 164ebc09c36SJim Ingham // commands, the user will still need to enter the \n\ 165ebc09c36SJim Ingham // second word after 'bp', e.g. 'bp enable' or \n\ 166ebc09c36SJim Ingham // 'bp delete'. \n\ 16709799af6SCaroline Tice 'commands alias bpl breakpoint list' // Creates the abbreviation 'bpl' for the \n\ 168ebc09c36SJim Ingham // two-word command 'breakpoint list'. \n\ 169ebc09c36SJim Ingham \nAn alias can include some options for the command, with the values either \n\ 170ebc09c36SJim Ingham filled in at the time the alias is created, or specified as positional \n\ 171ebc09c36SJim Ingham arguments, to be filled in when the alias is invoked. The following example \n\ 172ebc09c36SJim Ingham shows how to create aliases with options: \n\ 173ebc09c36SJim Ingham \n\ 17409799af6SCaroline Tice 'commands alias bfl breakpoint set -f %1 -l %2' \n\ 175ebc09c36SJim Ingham \nThis creates the abbreviation 'bfl' (for break-file-line), with the -f and -l \n\ 176ebc09c36SJim Ingham options already part of the alias. So if the user wants to set a breakpoint \n\ 177ebc09c36SJim Ingham by file and line without explicitly having to use the -f and -l options, the \n\ 178ebc09c36SJim Ingham user can now use 'bfl' instead. The '%1' and '%2' are positional placeholders \n\ 179ebc09c36SJim Ingham for the actual arguments that will be passed when the alias command is used. \n\ 180ebc09c36SJim Ingham The number in the placeholder refers to the position/order the actual value \n\ 181ebc09c36SJim Ingham occupies when the alias is used. So all the occurrences of '%1' in the alias \n\ 182ebc09c36SJim Ingham will be replaced with the first argument, all the occurrences of '%2' in the \n\ 183ebc09c36SJim Ingham alias will be replaced with the second argument, and so on. This also allows \n\ 184ebc09c36SJim Ingham actual arguments to be used multiple times within an alias (see 'process \n\ 185ebc09c36SJim Ingham launch' example below). So in the 'bfl' case, the actual file value will be \n\ 186ebc09c36SJim Ingham filled in with the first argument following 'bfl' and the actual line number \n\ 187ebc09c36SJim Ingham value will be filled in with the second argument. The user would use this \n\ 188ebc09c36SJim Ingham alias as follows: \n\ 18909799af6SCaroline Tice \n (lldb) commands alias bfl breakpoint set -f %1 -l %2 \n\ 190ebc09c36SJim Ingham <... some time later ...> \n\ 19109799af6SCaroline Tice (lldb) bfl my-file.c 137 \n\ 192ebc09c36SJim Ingham \nThis would be the same as if the user had entered \n\ 193ebc09c36SJim Ingham 'breakpoint set -f my-file.c -l 137'. \n\ 194ebc09c36SJim Ingham \nAnother example: \n\ 19509799af6SCaroline Tice \n (lldb) commands alias pltty process launch -s -o %1 -e %1 \n\ 19609799af6SCaroline Tice (lldb) pltty /dev/tty0 \n\ 197ebc09c36SJim Ingham // becomes 'process launch -s -o /dev/tty0 -e /dev/tty0' \n\ 198ebc09c36SJim Ingham \nIf the user always wanted to pass the same value to a particular option, the \n\ 199ebc09c36SJim Ingham alias could be defined with that value directly in the alias as a constant, \n\ 200ebc09c36SJim Ingham rather than using a positional placeholder: \n\ 2010708e2c2SSean Callanan \n commands alias bl3 breakpoint set -f %1 -l 3 // Always sets a breakpoint on line \n\ 202ebc09c36SJim Ingham // 3 of whatever file is indicated. \n"); 203ebc09c36SJim Ingham 204*405fe67fSCaroline Tice CommandArgumentEntry arg1; 205*405fe67fSCaroline Tice CommandArgumentEntry arg2; 206*405fe67fSCaroline Tice CommandArgumentEntry arg3; 207*405fe67fSCaroline Tice CommandArgumentData alias_arg; 208*405fe67fSCaroline Tice CommandArgumentData cmd_arg; 209*405fe67fSCaroline Tice CommandArgumentData options_arg; 210*405fe67fSCaroline Tice 211*405fe67fSCaroline Tice // Define the first (and only) variant of this arg. 212*405fe67fSCaroline Tice alias_arg.arg_type = eArgTypeAliasName; 213*405fe67fSCaroline Tice alias_arg.arg_repetition = eArgRepeatPlain; 214*405fe67fSCaroline Tice 215*405fe67fSCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 216*405fe67fSCaroline Tice arg1.push_back (alias_arg); 217*405fe67fSCaroline Tice 218*405fe67fSCaroline Tice // Define the first (and only) variant of this arg. 219*405fe67fSCaroline Tice cmd_arg.arg_type = eArgTypeCommandName; 220*405fe67fSCaroline Tice cmd_arg.arg_repetition = eArgRepeatPlain; 221*405fe67fSCaroline Tice 222*405fe67fSCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 223*405fe67fSCaroline Tice arg2.push_back (cmd_arg); 224*405fe67fSCaroline Tice 225*405fe67fSCaroline Tice // Define the first (and only) variant of this arg. 226*405fe67fSCaroline Tice options_arg.arg_type = eArgTypeAliasOptions; 227*405fe67fSCaroline Tice options_arg.arg_repetition = eArgRepeatOptional; 228*405fe67fSCaroline Tice 229*405fe67fSCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 230*405fe67fSCaroline Tice arg3.push_back (options_arg); 231*405fe67fSCaroline Tice 232*405fe67fSCaroline Tice // Push the data for the first argument into the m_arguments vector. 233*405fe67fSCaroline Tice m_arguments.push_back (arg1); 234*405fe67fSCaroline Tice m_arguments.push_back (arg2); 235*405fe67fSCaroline Tice m_arguments.push_back (arg3); 236ebc09c36SJim Ingham } 237ebc09c36SJim Ingham 238ebc09c36SJim Ingham ~CommandObjectCommandsAlias () 239ebc09c36SJim Ingham { 240ebc09c36SJim Ingham } 241ebc09c36SJim Ingham 242ebc09c36SJim Ingham 243ebc09c36SJim Ingham bool 244ebc09c36SJim Ingham Execute 245ebc09c36SJim Ingham ( 246ebc09c36SJim Ingham Args& args, 247ebc09c36SJim Ingham CommandReturnObject &result 248ebc09c36SJim Ingham ) 249ebc09c36SJim Ingham { 250867b185dSCaroline Tice size_t argc = args.GetArgumentCount(); 251ebc09c36SJim Ingham 252ebc09c36SJim Ingham if (argc < 2) 253ebc09c36SJim Ingham { 254ebc09c36SJim Ingham result.AppendError ("'alias' requires at least two arguments"); 255ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 256ebc09c36SJim Ingham return false; 257ebc09c36SJim Ingham } 258ebc09c36SJim Ingham 259ebc09c36SJim Ingham const std::string alias_command = args.GetArgumentAtIndex(0); 260ebc09c36SJim Ingham const std::string actual_command = args.GetArgumentAtIndex(1); 261ebc09c36SJim Ingham 262ebc09c36SJim Ingham args.Shift(); // Shift the alias command word off the argument vector. 263ebc09c36SJim Ingham args.Shift(); // Shift the old command word off the argument vector. 264ebc09c36SJim Ingham 265ebc09c36SJim Ingham // Verify that the command is alias'able, and get the appropriate command object. 266ebc09c36SJim Ingham 267a7015092SGreg Clayton if (m_interpreter.CommandExists (alias_command.c_str())) 268ebc09c36SJim Ingham { 269ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n", 270ebc09c36SJim Ingham alias_command.c_str()); 271ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 272ebc09c36SJim Ingham } 273ebc09c36SJim Ingham else 274ebc09c36SJim Ingham { 275a7015092SGreg Clayton CommandObjectSP command_obj_sp(m_interpreter.GetCommandSPExact (actual_command.c_str(), true)); 276ebc09c36SJim Ingham CommandObjectSP subcommand_obj_sp; 277ebc09c36SJim Ingham bool use_subcommand = false; 278ebc09c36SJim Ingham if (command_obj_sp.get()) 279ebc09c36SJim Ingham { 280ebc09c36SJim Ingham CommandObject *cmd_obj = command_obj_sp.get(); 281c982c768SGreg Clayton CommandObject *sub_cmd_obj = NULL; 282ebc09c36SJim Ingham OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector); 283ebc09c36SJim Ingham OptionArgVector *option_arg_vector = option_arg_vector_sp.get(); 284ebc09c36SJim Ingham 285ebc09c36SJim Ingham if (cmd_obj->IsMultiwordObject()) 286ebc09c36SJim Ingham { 287ebc09c36SJim Ingham if (argc >= 3) 288ebc09c36SJim Ingham { 289ebc09c36SJim Ingham const std::string sub_command = args.GetArgumentAtIndex(0); 290ebc09c36SJim Ingham assert (sub_command.length() != 0); 291ebc09c36SJim Ingham subcommand_obj_sp = 292ebc09c36SJim Ingham (((CommandObjectMultiword *) cmd_obj)->GetSubcommandSP (sub_command.c_str())); 293ebc09c36SJim Ingham if (subcommand_obj_sp.get()) 294ebc09c36SJim Ingham { 295ebc09c36SJim Ingham sub_cmd_obj = subcommand_obj_sp.get(); 296ebc09c36SJim Ingham use_subcommand = true; 297ebc09c36SJim Ingham args.Shift(); // Shift the sub_command word off the argument vector. 298ebc09c36SJim Ingham } 299ebc09c36SJim Ingham else 300ebc09c36SJim Ingham { 301ebc09c36SJim Ingham result.AppendErrorWithFormat ("Error occurred while attempting to look up command '%s %s'.\n", 302ebc09c36SJim Ingham alias_command.c_str(), sub_command.c_str()); 303ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 304ebc09c36SJim Ingham return false; 305ebc09c36SJim Ingham } 306ebc09c36SJim Ingham } 307ebc09c36SJim Ingham } 308ebc09c36SJim Ingham 309ebc09c36SJim Ingham // Verify & handle any options/arguments passed to the alias command 310ebc09c36SJim Ingham 311ebc09c36SJim Ingham if (args.GetArgumentCount () > 0) 312ebc09c36SJim Ingham { 313ebc09c36SJim Ingham if ((!use_subcommand && (cmd_obj->WantsRawCommandString())) 314ebc09c36SJim Ingham || (use_subcommand && (sub_cmd_obj->WantsRawCommandString()))) 315ebc09c36SJim Ingham { 316ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' cannot be aliased with any options or arguments.\n", 317ebc09c36SJim Ingham (use_subcommand ? sub_cmd_obj->GetCommandName() 318ebc09c36SJim Ingham : cmd_obj->GetCommandName())); 319ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 320ebc09c36SJim Ingham return false; 321ebc09c36SJim Ingham } 322ebc09c36SJim Ingham 323ebc09c36SJim Ingham // options or arguments have been passed to the alias command, and must be 324ebc09c36SJim Ingham // verified & processed here. 325ebc09c36SJim Ingham if ((!use_subcommand && (cmd_obj->GetOptions() != NULL)) 326ebc09c36SJim Ingham || (use_subcommand && (sub_cmd_obj->GetOptions() != NULL))) 327ebc09c36SJim Ingham { 328ebc09c36SJim Ingham Options *options; 329ebc09c36SJim Ingham if (use_subcommand) 330ebc09c36SJim Ingham options = sub_cmd_obj->GetOptions(); 331ebc09c36SJim Ingham else 332ebc09c36SJim Ingham options = cmd_obj->GetOptions(); 333ebc09c36SJim Ingham options->ResetOptionValues (); 334ebc09c36SJim Ingham args.Unshift ("dummy_arg"); 335ebc09c36SJim Ingham args.ParseAliasOptions (*options, result, option_arg_vector); 336ebc09c36SJim Ingham args.Shift (); 337ebc09c36SJim Ingham if (result.Succeeded()) 338ebc09c36SJim Ingham options->VerifyPartialOptions (result); 339867b185dSCaroline Tice if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted) 340ebc09c36SJim Ingham { 341867b185dSCaroline Tice result.AppendError ("Unable to create requested command alias.\n"); 342867b185dSCaroline Tice } 343867b185dSCaroline Tice } 344867b185dSCaroline Tice 345867b185dSCaroline Tice // Anything remaining in args must be a plain argument. 346867b185dSCaroline Tice 347867b185dSCaroline Tice argc = args.GetArgumentCount(); 348c982c768SGreg Clayton for (size_t i = 0; i < argc; ++i) 349ebc09c36SJim Ingham option_arg_vector->push_back (OptionArgPair ("<argument>", 350ebc09c36SJim Ingham std::string (args.GetArgumentAtIndex (i)))); 351ebc09c36SJim Ingham } 352ebc09c36SJim Ingham 353ebc09c36SJim Ingham // Create the alias. 354ebc09c36SJim Ingham 355a7015092SGreg Clayton if (m_interpreter.AliasExists (alias_command.c_str()) 356a7015092SGreg Clayton || m_interpreter.UserCommandExists (alias_command.c_str())) 357ebc09c36SJim Ingham { 358a7015092SGreg Clayton OptionArgVectorSP tmp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str())); 359ebc09c36SJim Ingham if (tmp_option_arg_sp.get()) 360ebc09c36SJim Ingham { 361ebc09c36SJim Ingham if (option_arg_vector->size() == 0) 362a7015092SGreg Clayton m_interpreter.RemoveAliasOptions (alias_command.c_str()); 363ebc09c36SJim Ingham } 364ebc09c36SJim Ingham result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n", 365ebc09c36SJim Ingham alias_command.c_str()); 366ebc09c36SJim Ingham } 367ebc09c36SJim Ingham 368ebc09c36SJim Ingham if (use_subcommand) 369a7015092SGreg Clayton m_interpreter.AddAlias (alias_command.c_str(), subcommand_obj_sp); 370ebc09c36SJim Ingham else 371a7015092SGreg Clayton m_interpreter.AddAlias (alias_command.c_str(), command_obj_sp); 372ebc09c36SJim Ingham if (option_arg_vector->size() > 0) 373a7015092SGreg Clayton m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp); 374ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 375ebc09c36SJim Ingham } 376ebc09c36SJim Ingham else 377ebc09c36SJim Ingham { 378ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is not an existing command.\n", actual_command.c_str()); 379ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 380ebc09c36SJim Ingham } 381ebc09c36SJim Ingham } 382ebc09c36SJim Ingham 383ebc09c36SJim Ingham return result.Succeeded(); 384ebc09c36SJim Ingham } 385ebc09c36SJim Ingham }; 386ebc09c36SJim Ingham 387ebc09c36SJim Ingham #pragma mark CommandObjectCommandsUnalias 388ebc09c36SJim Ingham //------------------------------------------------------------------------- 389ebc09c36SJim Ingham // CommandObjectCommandsUnalias 390ebc09c36SJim Ingham //------------------------------------------------------------------------- 391ebc09c36SJim Ingham 392ebc09c36SJim Ingham class CommandObjectCommandsUnalias : public CommandObject 393ebc09c36SJim Ingham { 394ebc09c36SJim Ingham public: 395a7015092SGreg Clayton CommandObjectCommandsUnalias (CommandInterpreter &interpreter) : 396a7015092SGreg Clayton CommandObject (interpreter, 397a7015092SGreg Clayton "commands unalias", 39886ddae50SCaroline Tice "Allow the user to remove/delete a user-defined command abbreviation.", 399*405fe67fSCaroline Tice NULL) 400ebc09c36SJim Ingham { 401*405fe67fSCaroline Tice CommandArgumentEntry arg; 402*405fe67fSCaroline Tice CommandArgumentData alias_arg; 403*405fe67fSCaroline Tice 404*405fe67fSCaroline Tice // Define the first (and only) variant of this arg. 405*405fe67fSCaroline Tice alias_arg.arg_type = eArgTypeAliasName; 406*405fe67fSCaroline Tice alias_arg.arg_repetition = eArgRepeatPlain; 407*405fe67fSCaroline Tice 408*405fe67fSCaroline Tice // There is only one variant this argument could be; put it into the argument entry. 409*405fe67fSCaroline Tice arg.push_back (alias_arg); 410*405fe67fSCaroline Tice 411*405fe67fSCaroline Tice // Push the data for the first argument into the m_arguments vector. 412*405fe67fSCaroline Tice m_arguments.push_back (arg); 413ebc09c36SJim Ingham } 414ebc09c36SJim Ingham 415ebc09c36SJim Ingham ~CommandObjectCommandsUnalias() 416ebc09c36SJim Ingham { 417ebc09c36SJim Ingham } 418ebc09c36SJim Ingham 419ebc09c36SJim Ingham 420ebc09c36SJim Ingham bool 421ebc09c36SJim Ingham Execute 422ebc09c36SJim Ingham ( 423ebc09c36SJim Ingham Args& args, 424ebc09c36SJim Ingham CommandReturnObject &result 425ebc09c36SJim Ingham ) 426ebc09c36SJim Ingham { 427ebc09c36SJim Ingham CommandObject::CommandMap::iterator pos; 428ebc09c36SJim Ingham CommandObject *cmd_obj; 429ebc09c36SJim Ingham 430ebc09c36SJim Ingham if (args.GetArgumentCount() != 0) 431ebc09c36SJim Ingham { 432ebc09c36SJim Ingham const char *command_name = args.GetArgumentAtIndex(0); 433a7015092SGreg Clayton cmd_obj = m_interpreter.GetCommandObject(command_name); 434ebc09c36SJim Ingham if (cmd_obj) 435ebc09c36SJim Ingham { 436a7015092SGreg Clayton if (m_interpreter.CommandExists (command_name)) 437ebc09c36SJim Ingham { 438ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be removed.\n", 439ebc09c36SJim Ingham command_name); 440ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 441ebc09c36SJim Ingham } 442ebc09c36SJim Ingham else 443ebc09c36SJim Ingham { 444ebc09c36SJim Ingham 445a7015092SGreg Clayton if (m_interpreter.RemoveAlias (command_name) == false) 446ebc09c36SJim Ingham { 447a7015092SGreg Clayton if (m_interpreter.AliasExists (command_name)) 448ebc09c36SJim Ingham result.AppendErrorWithFormat ("Error occurred while attempting to unalias '%s'.\n", 449ebc09c36SJim Ingham command_name); 450ebc09c36SJim Ingham else 451ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is not an existing alias.\n", command_name); 452ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 453ebc09c36SJim Ingham } 454ebc09c36SJim Ingham else 455ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 456ebc09c36SJim Ingham } 457ebc09c36SJim Ingham } 458ebc09c36SJim Ingham else 459ebc09c36SJim Ingham { 460ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is not a known command.\nTry 'help' to see a " 461ebc09c36SJim Ingham "current list of commands.\n", 462ebc09c36SJim Ingham command_name); 463ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 464ebc09c36SJim Ingham } 465ebc09c36SJim Ingham } 466ebc09c36SJim Ingham else 467ebc09c36SJim Ingham { 468ebc09c36SJim Ingham result.AppendError ("must call 'unalias' with a valid alias"); 469ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 470ebc09c36SJim Ingham } 471ebc09c36SJim Ingham 472ebc09c36SJim Ingham return result.Succeeded(); 473ebc09c36SJim Ingham } 474ebc09c36SJim Ingham }; 475ebc09c36SJim Ingham 476ebc09c36SJim Ingham #pragma mark CommandObjectMultiwordCommands 477ebc09c36SJim Ingham 478ebc09c36SJim Ingham //------------------------------------------------------------------------- 479ebc09c36SJim Ingham // CommandObjectMultiwordCommands 480ebc09c36SJim Ingham //------------------------------------------------------------------------- 481ebc09c36SJim Ingham 482ebc09c36SJim Ingham CommandObjectMultiwordCommands::CommandObjectMultiwordCommands (CommandInterpreter &interpreter) : 483a7015092SGreg Clayton CommandObjectMultiword (interpreter, 484a7015092SGreg Clayton "commands", 4853f4c09c1SCaroline Tice "A set of commands for managing or customizing the debugger commands.", 486ebc09c36SJim Ingham "commands <subcommand> [<subcommand-options>]") 487ebc09c36SJim Ingham { 488a7015092SGreg Clayton LoadSubCommand ("source", CommandObjectSP (new CommandObjectCommandsSource (interpreter))); 489a7015092SGreg Clayton LoadSubCommand ("alias", CommandObjectSP (new CommandObjectCommandsAlias (interpreter))); 490a7015092SGreg Clayton LoadSubCommand ("unalias", CommandObjectSP (new CommandObjectCommandsUnalias (interpreter))); 491ebc09c36SJim Ingham } 492ebc09c36SJim Ingham 493ebc09c36SJim Ingham CommandObjectMultiwordCommands::~CommandObjectMultiwordCommands () 494ebc09c36SJim Ingham { 495ebc09c36SJim Ingham } 496ebc09c36SJim Ingham 497