CommandObject.cpp revision 802f8b0e11525a61f6becfd3562222b2cfaea965
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- CommandObject.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/CommandObject.h"
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <getopt.h>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h>
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <ctype.h>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
2084cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h"
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// These are for the Sourcename completers.
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: Make a separate file for the completers.
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/FileSpec.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/FileSpecList.h"
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/ScriptInterpreter.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/ScriptInterpreterPython.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObject
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::CommandObject (const char *name, const char *help, const char *syntax, uint32_t flags) :
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_name (name),
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_short (),
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_long (),
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_syntax (),
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_flags (flags)
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (help && help[0])
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_cmd_help_short = help;
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (syntax && syntax[0])
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_cmd_syntax = syntax;
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::~CommandObject ()
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetHelp ()
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_help_short.c_str();
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetHelpLong ()
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_help_long.c_str();
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetSyntax ()
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_syntax.c_str();
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::Translate ()
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //return m_cmd_func_name.c_str();
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return "This function is currently not implemented.";
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetCommandName ()
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_name.c_str();
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetCommandName (const char *name)
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_name = name;
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetHelp (const char *cstr)
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_short = cstr;
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetHelpLong (const char *cstr)
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_long = cstr;
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetSyntax (const char *cstr)
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_syntax = cstr;
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerOptions *
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetOptions ()
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // By default commands don't have options unless this virtual function
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is overridden by base classes.
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerFlags&
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetFlags()
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_flags;
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst Flags&
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetFlags() const
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_flags;
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::ExecuteCommandString
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
13663094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *command_line,
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject &result
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args command_args(command_line);
14263094e0bb161580564954dee512955c1c79d3476Greg Clayton    return ExecuteWithOptions (interpreter, command_args, result);
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::ParseOptions
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
14863094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args& args,
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject &result
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // See if the subclass has options?
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *options = GetOptions();
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (options != NULL)
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Error error;
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        options->ResetOptionValues();
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // ParseOptions calls getopt_long, which always skips the zero'th item in the array and starts at position 1,
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // so we need to push a dummy value into position zero.
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        args.Unshift("dummy_string");
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error = args.ParseOptions (*options);
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The "dummy_string" will have already been removed by ParseOptions,
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // so no need to remove it.
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (error.Fail() || !options->VerifyOptions (result))
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *error_cstr = error.AsCString();
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error_cstr)
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
17324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We got an error string, lets use that
17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.GetErrorStream().PutCString(error_cstr);
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // No error string, output the usage information into result
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                options->GenerateOptionUsage (result.GetErrorStream(), this);
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Set the return status to failed (this was an error).
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::ExecuteWithOptions
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
19163094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args& args,
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject &result
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    for (size_t i = 0; i < args.GetArgumentCount();  ++i)
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *tmp_str = args.GetArgumentAtIndex (i);
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (tmp_str[0] == '`')  // back-quote
20063094e0bb161580564954dee512955c1c79d3476Greg Clayton            args.ReplaceArgumentAtIndex (i, interpreter.ProcessEmbeddedScriptCommands (tmp_str));
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20363094e0bb161580564954dee512955c1c79d3476Greg Clayton    Process *process = interpreter.GetDebugger().GetExecutionContext().process;
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (process == NULL)
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (GetFlags().IsSet(CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused))
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.AppendError ("Process must exist.");
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            result.SetStatus (eReturnStatusFailed);
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return false;
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StateType state = process->GetState();
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        switch (state)
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateAttaching:
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateLaunching:
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateSuspended:
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateCrashed:
22424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStopped:
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateDetached:
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateExited:
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateUnloaded:
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (GetFlags().IsSet(CommandObject::eFlagProcessMustBeLaunched))
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
23224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("Process must be launched.");
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            break;
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
23824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateRunning:
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        case eStateStepping:
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (GetFlags().IsSet(CommandObject::eFlagProcessMustBePaused))
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                result.SetStatus (eReturnStatusFailed);
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return false;
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24963094e0bb161580564954dee512955c1c79d3476Greg Clayton    if (!ParseOptions (interpreter, args, result))
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return false;
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Call the command-specific version of 'Execute', passing it the already processed arguments.
25363094e0bb161580564954dee512955c1c79d3476Greg Clayton    return Execute (interpreter, args, result);
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandDictCommandPartialMatch
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandDictCommandPartialMatch (const char *match_str)
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_match_str = match_str;
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // A NULL or empty string matches everything.
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_match_str == NULL || *m_match_str == '\0')
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 1;
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            size_t found = map_element.first.find (m_match_str, 0);
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (found == std::string::npos)
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return 0;
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return found == 0;
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    private:
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *m_match_str;
27824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str,
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              StringList &matches)
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int number_added = 0;
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandDictCommandPartialMatch matcher(cmd_str);
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher);
28824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (matching_cmds != in_map.end())
29024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ++number_added;
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.AppendString((*matching_cmds).first.c_str());
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);;
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return number_added;
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
29724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
29924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::HandleCompletion
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
30163094e0bb161580564954dee512955c1c79d3476Greg Clayton    CommandInterpreter &interpreter,
30224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args &input,
30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int &cursor_index,
30424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int &cursor_char_position,
30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int match_start_point,
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int max_return_elements,
307802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    bool &word_complete,
30824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringList &matches
30924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
31124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (WantsRawCommandString())
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // FIXME: Abstract telling the completion to insert the completion character.
31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.Clear();
31524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Can we do anything generic with the options?
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Options *cur_options = GetOptions();
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandReturnObject result;
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionElementVector opt_element_vector;
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (cur_options != NULL)
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Re-insert the dummy command name string which will have been
32724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // stripped off:
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            input.Unshift ("dummy-string");
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_index++;
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // I stick an element on the end of the input, because if the last element is
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // option that requires an argument, getopt_long will freak out.
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            input.AppendArgument ("<FAKE-VALUE>");
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
337adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham            input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool handled_by_options;
34263094e0bb161580564954dee512955c1c79d3476Greg Clayton            handled_by_options = cur_options->HandleOptionCompletion (interpreter,
34363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      input,
34463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      opt_element_vector,
34563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      cursor_index,
34663094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      cursor_char_position,
34763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      match_start_point,
34863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      max_return_elements,
349802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                                      word_complete,
35063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      matches);
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (handled_by_options)
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return matches.GetSize();
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we got here, the last word is not an option or an option argument.
35663094e0bb161580564954dee512955c1c79d3476Greg Clayton        return HandleArgumentCompletion (interpreter,
35763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         input,
35863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         cursor_index,
35963094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         cursor_char_position,
36063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         opt_element_vector,
36163094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         match_start_point,
36263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         max_return_elements,
363802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                         word_complete,
36463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         matches);
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Case insensitive version of ::strstr()
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Returns true if s2 is contained within s1.
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerstatic bool
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnercontains_string (const char *s1, const char *s2)
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  char *locase_s1 = (char *) malloc (strlen (s1) + 1);
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  char *locase_s2 = (char *) malloc (strlen (s2) + 1);
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  int i;
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  for (i = 0; s1 && s1[i] != '\0'; i++)
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    locase_s1[i] = ::tolower (s1[i]);
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  locase_s1[i] = '\0';
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  for (i = 0; s2 && s2[i] != '\0'; i++)
38124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    locase_s2[i] = ::tolower (s2[i]);
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  locase_s2[i] = '\0';
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  const char *result = ::strstr (locase_s1, locase_s2);
38524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  free (locase_s1);
38624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  free (locase_s2);
38724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  // 'result' points into freed memory - but we're not
38824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  // deref'ing it so hopefully current/future compilers
38924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  // won't complain..
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  if (result == NULL)
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      return false;
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner  else
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner      return true;
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::HelpTextContainsWord (const char *search_word)
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *short_help;
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *long_help;
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const char *syntax_help;
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string options_usage_help;
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool found_word = false;
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    short_help = GetHelp();
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    long_help = GetHelpLong();
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    syntax_help = GetSyntax();
41124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (contains_string (short_help, search_word))
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        found_word = true;
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (contains_string (long_help, search_word))
41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        found_word = true;
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else if (contains_string (syntax_help, search_word))
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        found_word = true;
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!found_word
42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        && GetOptions() != NULL)
42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StreamString usage_help;
42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        GetOptions()->GenerateOptionUsage (usage_help, this);
42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (usage_help.GetSize() > 0)
42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *usage_text = usage_help.GetData();
42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (contains_string (usage_text, search_word))
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              found_word = true;
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return found_word;
43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
434