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.", 38ebc09c36SJim Ingham "command source <filename>") 39ebc09c36SJim Ingham { 40ebc09c36SJim Ingham } 41ebc09c36SJim Ingham 42ebc09c36SJim Ingham ~CommandObjectCommandsSource () 43ebc09c36SJim Ingham { 44ebc09c36SJim Ingham } 45ebc09c36SJim Ingham 46ebc09c36SJim Ingham bool 47ebc09c36SJim Ingham Execute 48ebc09c36SJim Ingham ( 49ebc09c36SJim Ingham Args& args, 50ebc09c36SJim Ingham CommandReturnObject &result 51ebc09c36SJim Ingham ) 52ebc09c36SJim Ingham { 53ebc09c36SJim Ingham const int argc = args.GetArgumentCount(); 54ebc09c36SJim Ingham if (argc == 1) 55ebc09c36SJim Ingham { 56ebc09c36SJim Ingham const char *filename = args.GetArgumentAtIndex(0); 57ebc09c36SJim Ingham bool success = true; 58ebc09c36SJim Ingham 59ebc09c36SJim Ingham result.AppendMessageWithFormat ("Executing commands in '%s'.\n", filename); 60ebc09c36SJim Ingham 61ebc09c36SJim Ingham FileSpec cmd_file (filename); 62ebc09c36SJim Ingham if (cmd_file.Exists()) 63ebc09c36SJim Ingham { 64ebc09c36SJim Ingham STLStringArray commands; 65ebc09c36SJim Ingham success = cmd_file.ReadFileLines (commands); 66ebc09c36SJim Ingham 67ebc09c36SJim Ingham STLStringArray::iterator pos = commands.begin(); 68ebc09c36SJim Ingham 69ebc09c36SJim Ingham // Trim out any empty lines or lines that start with the comment 70ebc09c36SJim Ingham // char '#' 71ebc09c36SJim Ingham while (pos != commands.end()) 72ebc09c36SJim Ingham { 73ebc09c36SJim Ingham bool remove_string = false; 74ebc09c36SJim Ingham size_t non_space = pos->find_first_not_of (k_space_characters); 75ebc09c36SJim Ingham if (non_space == std::string::npos) 76ebc09c36SJim Ingham remove_string = true; // Empty line 77ebc09c36SJim Ingham else if ((*pos)[non_space] == '#') 78ebc09c36SJim Ingham remove_string = true; // Comment line that starts with '#' 79ebc09c36SJim Ingham 80ebc09c36SJim Ingham if (remove_string) 81ebc09c36SJim Ingham pos = commands.erase(pos); 82ebc09c36SJim Ingham else 83ebc09c36SJim Ingham ++pos; 84ebc09c36SJim Ingham } 85ebc09c36SJim Ingham 86ebc09c36SJim Ingham if (commands.size() > 0) 87ebc09c36SJim Ingham { 88ebc09c36SJim Ingham const size_t num_commands = commands.size(); 89ebc09c36SJim Ingham size_t i; 90ebc09c36SJim Ingham for (i = 0; i<num_commands; ++i) 91ebc09c36SJim Ingham { 92a7015092SGreg Clayton result.GetOutputStream().Printf ("%s %s\n", 93a7015092SGreg Clayton m_interpreter.GetPrompt(), 94a7015092SGreg Clayton commands[i].c_str()); 95a7015092SGreg Clayton if (!m_interpreter.HandleCommand(commands[i].c_str(), false, result)) 96ebc09c36SJim Ingham break; 97ebc09c36SJim Ingham } 98ebc09c36SJim Ingham 99ebc09c36SJim Ingham if (i < num_commands) 100ebc09c36SJim Ingham { 101ebc09c36SJim Ingham result.AppendErrorWithFormat("Aborting source of '%s' after command '%s' failed.\n", 102ebc09c36SJim Ingham filename, commands[i].c_str()); 103ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishResult); 104ebc09c36SJim Ingham } 105ebc09c36SJim Ingham else 106ebc09c36SJim Ingham { 107ebc09c36SJim Ingham success = true; 108ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 109ebc09c36SJim Ingham } 110ebc09c36SJim Ingham } 111ebc09c36SJim Ingham } 112ebc09c36SJim Ingham else 113ebc09c36SJim Ingham { 114ebc09c36SJim Ingham result.AppendErrorWithFormat ("File '%s' does not exist.\n", filename); 115ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 116ebc09c36SJim Ingham success = false; 117ebc09c36SJim Ingham } 118ebc09c36SJim Ingham 119ebc09c36SJim Ingham if (success) 120ebc09c36SJim Ingham { 121ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 122ebc09c36SJim Ingham } 123ebc09c36SJim Ingham } 124ebc09c36SJim Ingham else 125ebc09c36SJim Ingham { 126ebc09c36SJim Ingham result.AppendErrorWithFormat("'%s' takes exactly one executable filename argument.\n", GetCommandName()); 127ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 128ebc09c36SJim Ingham } 129ebc09c36SJim Ingham return result.Succeeded(); 130ebc09c36SJim Ingham 131ebc09c36SJim Ingham } 132ebc09c36SJim Ingham }; 133ebc09c36SJim Ingham 134ebc09c36SJim Ingham #pragma mark CommandObjectCommandsAlias 135ebc09c36SJim Ingham //------------------------------------------------------------------------- 136ebc09c36SJim Ingham // CommandObjectCommandsAlias 137ebc09c36SJim Ingham //------------------------------------------------------------------------- 138ebc09c36SJim Ingham 139ebc09c36SJim Ingham class CommandObjectCommandsAlias : public CommandObject 140ebc09c36SJim Ingham { 141ebc09c36SJim Ingham public: 142a7015092SGreg Clayton CommandObjectCommandsAlias (CommandInterpreter &interpreter) : 143a7015092SGreg Clayton CommandObject (interpreter, 144a7015092SGreg Clayton "commands alias", 145e3d26315SCaroline Tice "Allow users to define their own debugger command abbreviations.", 1460708e2c2SSean Callanan "commands alias <new_command> <old_command> [<options-for-aliased-command>]") 147ebc09c36SJim Ingham { 148ebc09c36SJim Ingham SetHelpLong( 149ebc09c36SJim Ingham "'alias' allows the user to create a short-cut or abbreviation for long \n\ 150ebc09c36SJim Ingham commands, multi-word commands, and commands that take particular options. \n\ 151ebc09c36SJim Ingham Below are some simple examples of how one might use the 'alias' command: \n\ 15209799af6SCaroline Tice \n 'commands alias sc script' // Creates the abbreviation 'sc' for the 'script' \n\ 153ebc09c36SJim Ingham // command. \n\ 15409799af6SCaroline Tice 'commands alias bp breakpoint' // Creates the abbreviation 'bp' for the 'breakpoint' \n\ 155ebc09c36SJim Ingham // command. Since breakpoint commands are two-word \n\ 156ebc09c36SJim Ingham // commands, the user will still need to enter the \n\ 157ebc09c36SJim Ingham // second word after 'bp', e.g. 'bp enable' or \n\ 158ebc09c36SJim Ingham // 'bp delete'. \n\ 15909799af6SCaroline Tice 'commands alias bpl breakpoint list' // Creates the abbreviation 'bpl' for the \n\ 160ebc09c36SJim Ingham // two-word command 'breakpoint list'. \n\ 161ebc09c36SJim Ingham \nAn alias can include some options for the command, with the values either \n\ 162ebc09c36SJim Ingham filled in at the time the alias is created, or specified as positional \n\ 163ebc09c36SJim Ingham arguments, to be filled in when the alias is invoked. The following example \n\ 164ebc09c36SJim Ingham shows how to create aliases with options: \n\ 165ebc09c36SJim Ingham \n\ 16609799af6SCaroline Tice 'commands alias bfl breakpoint set -f %1 -l %2' \n\ 167ebc09c36SJim Ingham \nThis creates the abbreviation 'bfl' (for break-file-line), with the -f and -l \n\ 168ebc09c36SJim Ingham options already part of the alias. So if the user wants to set a breakpoint \n\ 169ebc09c36SJim Ingham by file and line without explicitly having to use the -f and -l options, the \n\ 170ebc09c36SJim Ingham user can now use 'bfl' instead. The '%1' and '%2' are positional placeholders \n\ 171ebc09c36SJim Ingham for the actual arguments that will be passed when the alias command is used. \n\ 172ebc09c36SJim Ingham The number in the placeholder refers to the position/order the actual value \n\ 173ebc09c36SJim Ingham occupies when the alias is used. So all the occurrences of '%1' in the alias \n\ 174ebc09c36SJim Ingham will be replaced with the first argument, all the occurrences of '%2' in the \n\ 175ebc09c36SJim Ingham alias will be replaced with the second argument, and so on. This also allows \n\ 176ebc09c36SJim Ingham actual arguments to be used multiple times within an alias (see 'process \n\ 177ebc09c36SJim Ingham launch' example below). So in the 'bfl' case, the actual file value will be \n\ 178ebc09c36SJim Ingham filled in with the first argument following 'bfl' and the actual line number \n\ 179ebc09c36SJim Ingham value will be filled in with the second argument. The user would use this \n\ 180ebc09c36SJim Ingham alias as follows: \n\ 18109799af6SCaroline Tice \n (lldb) commands alias bfl breakpoint set -f %1 -l %2 \n\ 182ebc09c36SJim Ingham <... some time later ...> \n\ 18309799af6SCaroline Tice (lldb) bfl my-file.c 137 \n\ 184ebc09c36SJim Ingham \nThis would be the same as if the user had entered \n\ 185ebc09c36SJim Ingham 'breakpoint set -f my-file.c -l 137'. \n\ 186ebc09c36SJim Ingham \nAnother example: \n\ 18709799af6SCaroline Tice \n (lldb) commands alias pltty process launch -s -o %1 -e %1 \n\ 18809799af6SCaroline Tice (lldb) pltty /dev/tty0 \n\ 189ebc09c36SJim Ingham // becomes 'process launch -s -o /dev/tty0 -e /dev/tty0' \n\ 190ebc09c36SJim Ingham \nIf the user always wanted to pass the same value to a particular option, the \n\ 191ebc09c36SJim Ingham alias could be defined with that value directly in the alias as a constant, \n\ 192ebc09c36SJim Ingham rather than using a positional placeholder: \n\ 1930708e2c2SSean Callanan \n commands alias bl3 breakpoint set -f %1 -l 3 // Always sets a breakpoint on line \n\ 194ebc09c36SJim Ingham // 3 of whatever file is indicated. \n"); 195ebc09c36SJim Ingham 196ebc09c36SJim Ingham } 197ebc09c36SJim Ingham 198ebc09c36SJim Ingham ~CommandObjectCommandsAlias () 199ebc09c36SJim Ingham { 200ebc09c36SJim Ingham } 201ebc09c36SJim Ingham 202ebc09c36SJim Ingham 203ebc09c36SJim Ingham bool 204ebc09c36SJim Ingham Execute 205ebc09c36SJim Ingham ( 206ebc09c36SJim Ingham Args& args, 207ebc09c36SJim Ingham CommandReturnObject &result 208ebc09c36SJim Ingham ) 209ebc09c36SJim Ingham { 210*867b185dSCaroline Tice size_t argc = args.GetArgumentCount(); 211ebc09c36SJim Ingham 212ebc09c36SJim Ingham if (argc < 2) 213ebc09c36SJim Ingham { 214ebc09c36SJim Ingham result.AppendError ("'alias' requires at least two arguments"); 215ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 216ebc09c36SJim Ingham return false; 217ebc09c36SJim Ingham } 218ebc09c36SJim Ingham 219ebc09c36SJim Ingham const std::string alias_command = args.GetArgumentAtIndex(0); 220ebc09c36SJim Ingham const std::string actual_command = args.GetArgumentAtIndex(1); 221ebc09c36SJim Ingham 222ebc09c36SJim Ingham args.Shift(); // Shift the alias command word off the argument vector. 223ebc09c36SJim Ingham args.Shift(); // Shift the old command word off the argument vector. 224ebc09c36SJim Ingham 225ebc09c36SJim Ingham // Verify that the command is alias'able, and get the appropriate command object. 226ebc09c36SJim Ingham 227a7015092SGreg Clayton if (m_interpreter.CommandExists (alias_command.c_str())) 228ebc09c36SJim Ingham { 229ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n", 230ebc09c36SJim Ingham alias_command.c_str()); 231ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 232ebc09c36SJim Ingham } 233ebc09c36SJim Ingham else 234ebc09c36SJim Ingham { 235a7015092SGreg Clayton CommandObjectSP command_obj_sp(m_interpreter.GetCommandSPExact (actual_command.c_str(), true)); 236ebc09c36SJim Ingham CommandObjectSP subcommand_obj_sp; 237ebc09c36SJim Ingham bool use_subcommand = false; 238ebc09c36SJim Ingham if (command_obj_sp.get()) 239ebc09c36SJim Ingham { 240ebc09c36SJim Ingham CommandObject *cmd_obj = command_obj_sp.get(); 241c982c768SGreg Clayton CommandObject *sub_cmd_obj = NULL; 242ebc09c36SJim Ingham OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector); 243ebc09c36SJim Ingham OptionArgVector *option_arg_vector = option_arg_vector_sp.get(); 244ebc09c36SJim Ingham 245ebc09c36SJim Ingham if (cmd_obj->IsMultiwordObject()) 246ebc09c36SJim Ingham { 247ebc09c36SJim Ingham if (argc >= 3) 248ebc09c36SJim Ingham { 249ebc09c36SJim Ingham const std::string sub_command = args.GetArgumentAtIndex(0); 250ebc09c36SJim Ingham assert (sub_command.length() != 0); 251ebc09c36SJim Ingham subcommand_obj_sp = 252ebc09c36SJim Ingham (((CommandObjectMultiword *) cmd_obj)->GetSubcommandSP (sub_command.c_str())); 253ebc09c36SJim Ingham if (subcommand_obj_sp.get()) 254ebc09c36SJim Ingham { 255ebc09c36SJim Ingham sub_cmd_obj = subcommand_obj_sp.get(); 256ebc09c36SJim Ingham use_subcommand = true; 257ebc09c36SJim Ingham args.Shift(); // Shift the sub_command word off the argument vector. 258ebc09c36SJim Ingham } 259ebc09c36SJim Ingham else 260ebc09c36SJim Ingham { 261ebc09c36SJim Ingham result.AppendErrorWithFormat ("Error occurred while attempting to look up command '%s %s'.\n", 262ebc09c36SJim Ingham alias_command.c_str(), sub_command.c_str()); 263ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 264ebc09c36SJim Ingham return false; 265ebc09c36SJim Ingham } 266ebc09c36SJim Ingham } 267ebc09c36SJim Ingham } 268ebc09c36SJim Ingham 269ebc09c36SJim Ingham // Verify & handle any options/arguments passed to the alias command 270ebc09c36SJim Ingham 271ebc09c36SJim Ingham if (args.GetArgumentCount () > 0) 272ebc09c36SJim Ingham { 273ebc09c36SJim Ingham if ((!use_subcommand && (cmd_obj->WantsRawCommandString())) 274ebc09c36SJim Ingham || (use_subcommand && (sub_cmd_obj->WantsRawCommandString()))) 275ebc09c36SJim Ingham { 276ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' cannot be aliased with any options or arguments.\n", 277ebc09c36SJim Ingham (use_subcommand ? sub_cmd_obj->GetCommandName() 278ebc09c36SJim Ingham : cmd_obj->GetCommandName())); 279ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 280ebc09c36SJim Ingham return false; 281ebc09c36SJim Ingham } 282ebc09c36SJim Ingham 283ebc09c36SJim Ingham // options or arguments have been passed to the alias command, and must be 284ebc09c36SJim Ingham // verified & processed here. 285ebc09c36SJim Ingham if ((!use_subcommand && (cmd_obj->GetOptions() != NULL)) 286ebc09c36SJim Ingham || (use_subcommand && (sub_cmd_obj->GetOptions() != NULL))) 287ebc09c36SJim Ingham { 288ebc09c36SJim Ingham Options *options; 289ebc09c36SJim Ingham if (use_subcommand) 290ebc09c36SJim Ingham options = sub_cmd_obj->GetOptions(); 291ebc09c36SJim Ingham else 292ebc09c36SJim Ingham options = cmd_obj->GetOptions(); 293ebc09c36SJim Ingham options->ResetOptionValues (); 294ebc09c36SJim Ingham args.Unshift ("dummy_arg"); 295ebc09c36SJim Ingham args.ParseAliasOptions (*options, result, option_arg_vector); 296ebc09c36SJim Ingham args.Shift (); 297ebc09c36SJim Ingham if (result.Succeeded()) 298ebc09c36SJim Ingham options->VerifyPartialOptions (result); 299*867b185dSCaroline Tice if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted) 300ebc09c36SJim Ingham { 301*867b185dSCaroline Tice result.AppendError ("Unable to create requested command alias.\n"); 302*867b185dSCaroline Tice } 303*867b185dSCaroline Tice } 304*867b185dSCaroline Tice 305*867b185dSCaroline Tice // Anything remaining in args must be a plain argument. 306*867b185dSCaroline Tice 307*867b185dSCaroline Tice argc = args.GetArgumentCount(); 308c982c768SGreg Clayton for (size_t i = 0; i < argc; ++i) 309ebc09c36SJim Ingham option_arg_vector->push_back (OptionArgPair ("<argument>", 310ebc09c36SJim Ingham std::string (args.GetArgumentAtIndex (i)))); 311ebc09c36SJim Ingham } 312ebc09c36SJim Ingham 313ebc09c36SJim Ingham // Create the alias. 314ebc09c36SJim Ingham 315a7015092SGreg Clayton if (m_interpreter.AliasExists (alias_command.c_str()) 316a7015092SGreg Clayton || m_interpreter.UserCommandExists (alias_command.c_str())) 317ebc09c36SJim Ingham { 318a7015092SGreg Clayton OptionArgVectorSP tmp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str())); 319ebc09c36SJim Ingham if (tmp_option_arg_sp.get()) 320ebc09c36SJim Ingham { 321ebc09c36SJim Ingham if (option_arg_vector->size() == 0) 322a7015092SGreg Clayton m_interpreter.RemoveAliasOptions (alias_command.c_str()); 323ebc09c36SJim Ingham } 324ebc09c36SJim Ingham result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n", 325ebc09c36SJim Ingham alias_command.c_str()); 326ebc09c36SJim Ingham } 327ebc09c36SJim Ingham 328ebc09c36SJim Ingham if (use_subcommand) 329a7015092SGreg Clayton m_interpreter.AddAlias (alias_command.c_str(), subcommand_obj_sp); 330ebc09c36SJim Ingham else 331a7015092SGreg Clayton m_interpreter.AddAlias (alias_command.c_str(), command_obj_sp); 332ebc09c36SJim Ingham if (option_arg_vector->size() > 0) 333a7015092SGreg Clayton m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp); 334ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 335ebc09c36SJim Ingham } 336ebc09c36SJim Ingham else 337ebc09c36SJim Ingham { 338ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is not an existing command.\n", actual_command.c_str()); 339ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 340ebc09c36SJim Ingham } 341ebc09c36SJim Ingham } 342ebc09c36SJim Ingham 343ebc09c36SJim Ingham return result.Succeeded(); 344ebc09c36SJim Ingham } 345ebc09c36SJim Ingham }; 346ebc09c36SJim Ingham 347ebc09c36SJim Ingham #pragma mark CommandObjectCommandsUnalias 348ebc09c36SJim Ingham //------------------------------------------------------------------------- 349ebc09c36SJim Ingham // CommandObjectCommandsUnalias 350ebc09c36SJim Ingham //------------------------------------------------------------------------- 351ebc09c36SJim Ingham 352ebc09c36SJim Ingham class CommandObjectCommandsUnalias : public CommandObject 353ebc09c36SJim Ingham { 354ebc09c36SJim Ingham public: 355a7015092SGreg Clayton CommandObjectCommandsUnalias (CommandInterpreter &interpreter) : 356a7015092SGreg Clayton CommandObject (interpreter, 357a7015092SGreg Clayton "commands unalias", 35886ddae50SCaroline Tice "Allow the user to remove/delete a user-defined command abbreviation.", 359ebc09c36SJim Ingham "unalias <alias-name-to-be-removed>") 360ebc09c36SJim Ingham { 361ebc09c36SJim Ingham } 362ebc09c36SJim Ingham 363ebc09c36SJim Ingham ~CommandObjectCommandsUnalias() 364ebc09c36SJim Ingham { 365ebc09c36SJim Ingham } 366ebc09c36SJim Ingham 367ebc09c36SJim Ingham 368ebc09c36SJim Ingham bool 369ebc09c36SJim Ingham Execute 370ebc09c36SJim Ingham ( 371ebc09c36SJim Ingham Args& args, 372ebc09c36SJim Ingham CommandReturnObject &result 373ebc09c36SJim Ingham ) 374ebc09c36SJim Ingham { 375ebc09c36SJim Ingham CommandObject::CommandMap::iterator pos; 376ebc09c36SJim Ingham CommandObject *cmd_obj; 377ebc09c36SJim Ingham 378ebc09c36SJim Ingham if (args.GetArgumentCount() != 0) 379ebc09c36SJim Ingham { 380ebc09c36SJim Ingham const char *command_name = args.GetArgumentAtIndex(0); 381a7015092SGreg Clayton cmd_obj = m_interpreter.GetCommandObject(command_name); 382ebc09c36SJim Ingham if (cmd_obj) 383ebc09c36SJim Ingham { 384a7015092SGreg Clayton if (m_interpreter.CommandExists (command_name)) 385ebc09c36SJim Ingham { 386ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be removed.\n", 387ebc09c36SJim Ingham command_name); 388ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 389ebc09c36SJim Ingham } 390ebc09c36SJim Ingham else 391ebc09c36SJim Ingham { 392ebc09c36SJim Ingham 393a7015092SGreg Clayton if (m_interpreter.RemoveAlias (command_name) == false) 394ebc09c36SJim Ingham { 395a7015092SGreg Clayton if (m_interpreter.AliasExists (command_name)) 396ebc09c36SJim Ingham result.AppendErrorWithFormat ("Error occurred while attempting to unalias '%s'.\n", 397ebc09c36SJim Ingham command_name); 398ebc09c36SJim Ingham else 399ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is not an existing alias.\n", command_name); 400ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 401ebc09c36SJim Ingham } 402ebc09c36SJim Ingham else 403ebc09c36SJim Ingham result.SetStatus (eReturnStatusSuccessFinishNoResult); 404ebc09c36SJim Ingham } 405ebc09c36SJim Ingham } 406ebc09c36SJim Ingham else 407ebc09c36SJim Ingham { 408ebc09c36SJim Ingham result.AppendErrorWithFormat ("'%s' is not a known command.\nTry 'help' to see a " 409ebc09c36SJim Ingham "current list of commands.\n", 410ebc09c36SJim Ingham command_name); 411ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 412ebc09c36SJim Ingham } 413ebc09c36SJim Ingham } 414ebc09c36SJim Ingham else 415ebc09c36SJim Ingham { 416ebc09c36SJim Ingham result.AppendError ("must call 'unalias' with a valid alias"); 417ebc09c36SJim Ingham result.SetStatus (eReturnStatusFailed); 418ebc09c36SJim Ingham } 419ebc09c36SJim Ingham 420ebc09c36SJim Ingham return result.Succeeded(); 421ebc09c36SJim Ingham } 422ebc09c36SJim Ingham }; 423ebc09c36SJim Ingham 424ebc09c36SJim Ingham #pragma mark CommandObjectMultiwordCommands 425ebc09c36SJim Ingham 426ebc09c36SJim Ingham //------------------------------------------------------------------------- 427ebc09c36SJim Ingham // CommandObjectMultiwordCommands 428ebc09c36SJim Ingham //------------------------------------------------------------------------- 429ebc09c36SJim Ingham 430ebc09c36SJim Ingham CommandObjectMultiwordCommands::CommandObjectMultiwordCommands (CommandInterpreter &interpreter) : 431a7015092SGreg Clayton CommandObjectMultiword (interpreter, 432a7015092SGreg Clayton "commands", 4333f4c09c1SCaroline Tice "A set of commands for managing or customizing the debugger commands.", 434ebc09c36SJim Ingham "commands <subcommand> [<subcommand-options>]") 435ebc09c36SJim Ingham { 436a7015092SGreg Clayton LoadSubCommand ("source", CommandObjectSP (new CommandObjectCommandsSource (interpreter))); 437a7015092SGreg Clayton LoadSubCommand ("alias", CommandObjectSP (new CommandObjectCommandsAlias (interpreter))); 438a7015092SGreg Clayton LoadSubCommand ("unalias", CommandObjectSP (new CommandObjectCommandsUnalias (interpreter))); 439ebc09c36SJim Ingham } 440ebc09c36SJim Ingham 441ebc09c36SJim Ingham CommandObjectMultiwordCommands::~CommandObjectMultiwordCommands () 442ebc09c36SJim Ingham { 443ebc09c36SJim Ingham } 444ebc09c36SJim Ingham 445