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 &current_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