CommandObjectMultiword.cpp revision 767af88aa617288e584afcfed055f7755e408542
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObjectMultiword.cpp ------------------------------*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandObjectMultiword.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes 1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 1563094e0bb161580564954dee512955c1c79d3476Greg Clayton#include "lldb/Core/Debugger.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h" 1784cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h" 1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h" 1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObjectMultiword 2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//------------------------------------------------------------------------- 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiword::CommandObjectMultiword 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *name, 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *help, 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *syntax, 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t flags 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) : 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject (name, help, syntax, flags) 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiword::~CommandObjectMultiword () 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectSP 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiword::GetSubcommandSP (const char *sub_cmd, StringList *matches) 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObjectSP return_cmd_sp; 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject::CommandMap::iterator pos; 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_subcommand_dict.empty()) 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos = m_subcommand_dict.find (sub_cmd); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_subcommand_dict.end()) 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_cmd_sp = pos->second; 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringList local_matches; 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (matches == NULL) 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner matches = &local_matches; 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int num_matches = CommandObject::AddNamesMatchingPartialString (m_subcommand_dict, sub_cmd, *matches); 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_matches == 1) 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Cleaner, but slightly less efficient would be to call back into this function, since I now 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // know I have an exact match... 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sub_cmd = matches->GetStringAtIndex(0); 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos = m_subcommand_dict.find(sub_cmd); 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos != m_subcommand_dict.end()) 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return_cmd_sp = pos->second; 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return return_cmd_sp; 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject * 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiword::GetSubcommandObject (const char *sub_cmd, StringList *matches) 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return GetSubcommandSP(sub_cmd, matches).get(); 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 8363094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiword::LoadSubCommand 8463094e0bb161580564954dee512955c1c79d3476Greg Clayton( 8563094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 8663094e0bb161580564954dee512955c1c79d3476Greg Clayton const char *name, 8763094e0bb161580564954dee512955c1c79d3476Greg Clayton const CommandObjectSP& cmd_obj 8863094e0bb161580564954dee512955c1c79d3476Greg Clayton) 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandMap::iterator pos; 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool success = true; 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner pos = m_subcommand_dict.find(name); 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (pos == m_subcommand_dict.end()) 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_subcommand_dict[name] = cmd_obj; 9763094e0bb161580564954dee512955c1c79d3476Greg Clayton interpreter.CrossRegisterCommand (name, GetCommandName()); 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner success = false; 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return success; 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiword::Execute 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 10863094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args& args, 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandReturnObject &result 11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const size_t argc = args.GetArgumentCount(); 11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (argc == 0) 11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11663094e0bb161580564954dee512955c1c79d3476Greg Clayton GenerateHelpText (interpreter, result); 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const char *sub_command = args.GetArgumentAtIndex (0); 12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sub_command) 12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (::strcasecmp (sub_command, "help") == 0) 12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 12663094e0bb161580564954dee512955c1c79d3476Greg Clayton GenerateHelpText (interpreter, result); 12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else if (!m_subcommand_dict.empty()) 12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringList matches; 13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandObject *sub_cmd_obj = GetSubcommandObject(sub_command, &matches); 13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sub_cmd_obj != NULL) 13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Now call CommandObject::Execute to process and options in 'rest_of_line'. From there 13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // the command-specific version of Execute will be called, with the processed arguments. 13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner args.Shift(); 13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 13963094e0bb161580564954dee512955c1c79d3476Greg Clayton sub_cmd_obj->ExecuteWithOptions (interpreter, args, result); 14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string error_msg; 14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int num_subcmd_matches = matches.GetSize(); 14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_subcmd_matches > 0) 14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.assign ("ambiguous command "); 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.assign ("invalid command "); 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append ("'"); 15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append (GetCommandName()); 15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append (" "); 15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append (sub_command); 15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append ("'"); 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (num_subcmd_matches > 0) 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append (" Possible completions:"); 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (int i = 0; i < num_subcmd_matches; i++) 16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append ("\n\t"); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append (matches.GetStringAtIndex (i)); 16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner error_msg.append ("\n"); 16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendRawError (error_msg.c_str(), error_msg.size()); 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.AppendErrorWithFormat ("'%s' does not have any subcommands.\n", GetCommandName()); 17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusFailed); 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return result.Succeeded(); 17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 18263094e0bb161580564954dee512955c1c79d3476Greg ClaytonCommandObjectMultiword::GenerateHelpText (CommandInterpreter &interpreter, CommandReturnObject &result) 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // First time through here, generate the help text for the object and 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // push it to the return result object as well 18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString &output_stream = result.GetOutputStream(); 18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner output_stream.PutCString ("The following subcommands are supported:\n\n"); 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CommandMap::iterator pos; 19163094e0bb161580564954dee512955c1c79d3476Greg Clayton std::string longest_word = interpreter.FindLongestCommandWord (m_subcommand_dict); 19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t max_len = 0; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (! longest_word.empty()) 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner max_len = strlen (longest_word.c_str()) + 4; // Indent the output by 4 spaces. 19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_subcommand_dict.begin(); pos != m_subcommand_dict.end(); ++pos) 19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::string indented_command (" "); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner indented_command.append (pos->first); 20163094e0bb161580564954dee512955c1c79d3476Greg Clayton interpreter.OutputFormattedHelpText (result.GetOutputStream(), 20263094e0bb161580564954dee512955c1c79d3476Greg Clayton indented_command.c_str(), 20363094e0bb161580564954dee512955c1c79d3476Greg Clayton "--", 20463094e0bb161580564954dee512955c1c79d3476Greg Clayton pos->second->GetHelp(), 20563094e0bb161580564954dee512955c1c79d3476Greg Clayton max_len); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner output_stream.PutCString ("\nFor more help on any particular subcommand, type 'help <command> <subcommand>'.\n"); 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner result.SetStatus (eReturnStatusSuccessFinishNoResult); 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObjectMultiword::HandleCompletion 21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 21663094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandInterpreter &interpreter, 21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Args &input, 21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int &cursor_index, 21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int &cursor_char_position, 22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int match_start_point, 22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner int max_return_elements, 222802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham bool &word_complete, 22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringList &matches 22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) 22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 226802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham // Any of the command matches will provide a complete word, otherwise the individual 227802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham // completers will override this. 228802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham word_complete = true; 229802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham 23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cursor_index == 0) 23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 23263094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandObject::AddNamesMatchingPartialString (m_subcommand_dict, 23363094e0bb161580564954dee512955c1c79d3476Greg Clayton input.GetArgumentAtIndex(0), 23463094e0bb161580564954dee512955c1c79d3476Greg Clayton matches); 23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (matches.GetSize() == 1 23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && matches.GetStringAtIndex(0) != NULL 23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner && strcmp (input.GetArgumentAtIndex(0), matches.GetStringAtIndex(0)) == 0) 23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringList temp_matches; 24163094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandObject *cmd_obj = GetSubcommandObject (input.GetArgumentAtIndex(0), 24263094e0bb161580564954dee512955c1c79d3476Greg Clayton &temp_matches); 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (cmd_obj != NULL) 24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner matches.DeleteStringAtIndex (0); 24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner input.Shift(); 24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cursor_char_position = 0; 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner input.AppendArgument (""); 24963094e0bb161580564954dee512955c1c79d3476Greg Clayton return cmd_obj->HandleCompletion (interpreter, 25063094e0bb161580564954dee512955c1c79d3476Greg Clayton input, cursor_index, 25163094e0bb161580564954dee512955c1c79d3476Greg Clayton cursor_char_position, 25263094e0bb161580564954dee512955c1c79d3476Greg Clayton match_start_point, 253802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham max_return_elements, 254802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham word_complete, 25563094e0bb161580564954dee512955c1c79d3476Greg Clayton matches); 25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return matches.GetSize(); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return matches.GetSize(); 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26563094e0bb161580564954dee512955c1c79d3476Greg Clayton CommandObject *sub_command_object = GetSubcommandObject (input.GetArgumentAtIndex(0), 26663094e0bb161580564954dee512955c1c79d3476Greg Clayton &matches); 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sub_command_object == NULL) 26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return matches.GetSize(); 27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Remove the one match that we got from calling GetSubcommandObject. 27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner matches.DeleteStringAtIndex(0); 27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner input.Shift(); 27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner cursor_index--; 27763094e0bb161580564954dee512955c1c79d3476Greg Clayton return sub_command_object->HandleCompletion (interpreter, 27863094e0bb161580564954dee512955c1c79d3476Greg Clayton input, 27963094e0bb161580564954dee512955c1c79d3476Greg Clayton cursor_index, 28063094e0bb161580564954dee512955c1c79d3476Greg Clayton cursor_char_position, 28163094e0bb161580564954dee512955c1c79d3476Greg Clayton match_start_point, 282802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham max_return_elements, 283802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham word_complete, 28463094e0bb161580564954dee512955c1c79d3476Greg Clayton matches); 28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 290767af88aa617288e584afcfed055f7755e408542Jim Inghamconst char * 291767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiword::GetRepeatCommand (Args ¤t_command_args, uint32_t index) 292767af88aa617288e584afcfed055f7755e408542Jim Ingham{ 293767af88aa617288e584afcfed055f7755e408542Jim Ingham if (current_command_args.GetArgumentCount() == 0) 294767af88aa617288e584afcfed055f7755e408542Jim Ingham return NULL; 295767af88aa617288e584afcfed055f7755e408542Jim Ingham index++; 296767af88aa617288e584afcfed055f7755e408542Jim Ingham CommandObject *sub_command_object = GetSubcommandObject (current_command_args.GetArgumentAtIndex(index)); 297767af88aa617288e584afcfed055f7755e408542Jim Ingham if (sub_command_object == NULL) 298767af88aa617288e584afcfed055f7755e408542Jim Ingham return NULL; 299767af88aa617288e584afcfed055f7755e408542Jim Ingham else 300767af88aa617288e584afcfed055f7755e408542Jim Ingham return sub_command_object->GetRepeatCommand(current_command_args, index); 301767af88aa617288e584afcfed055f7755e408542Jim Ingham} 302767af88aa617288e584afcfed055f7755e408542Jim Ingham 303