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
10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h"
11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandObject.h"
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <string>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <getopt.h>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <stdlib.h>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <ctype.h>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Address.h"
22746323a3deff83edfc0cfd60aab136d43a78b7c8Johnny Chen#include "lldb/Core/ArchSpec.h"
2384cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Options.h"
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// These are for the Sourcename completers.
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: Make a separate file for the completers.
275f54ac373b119a4c6693e4875c48aa761fba0c86Greg Clayton#include "lldb/Host/FileSpec.h"
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/FileSpecList.h"
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Process.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Target/Target.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandInterpreter.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/CommandReturnObject.h"
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/ScriptInterpreter.h"
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Interpreter/ScriptInterpreterPython.h"
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb;
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private;
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// CommandObject
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//-------------------------------------------------------------------------
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44238c0a1e7b733cee539258faa656159c63f9e893Greg ClaytonCommandObject::CommandObject
45238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton(
46238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandInterpreter &interpreter,
47238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    const char *name,
48238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    const char *help,
49238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    const char *syntax,
50238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    uint32_t flags
51238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton) :
52238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    m_interpreter (interpreter),
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_name (name),
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_short (),
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_long (),
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_syntax (),
57d40f8a68b49a43264ff41a0f0ef51bef6372e8b3Jim Ingham    m_is_alias (false),
58fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    m_flags (flags),
59f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    m_arguments(),
60f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    m_command_override_callback (NULL),
61f125250ba7bcaa2ea5ee95539a309e3fd2f8b5d7Greg Clayton    m_command_override_baton (NULL)
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (help && help[0])
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_cmd_help_short = help;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (syntax && syntax[0])
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        m_cmd_syntax = syntax;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::~CommandObject ()
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetHelp ()
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_help_short.c_str();
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetHelpLong ()
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_help_long.c_str();
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetSyntax ()
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
88fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    if (m_cmd_syntax.length() == 0)
89fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    {
90fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        StreamString syntax_str;
91fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        syntax_str.Printf ("%s", GetCommandName());
92fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        if (GetOptions() != NULL)
9343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            syntax_str.Printf (" <cmd-options>");
94fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        if (m_arguments.size() > 0)
95fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        {
96fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice            syntax_str.Printf (" ");
97c3580681c3876a323ea1b02c3dc9dde390cabfdfEnrico Granata            if (WantsRawCommandString() && GetOptions() && GetOptions()->NumCommandOptions())
989798d7b0999b189d9ba64c4f1c9c635bdfda9a7bSean Callanan                syntax_str.Printf("-- ");
99fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice            GetFormattedCommandArguments (syntax_str);
100fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        }
101fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        m_cmd_syntax = syntax_str.GetData ();
102fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    }
103fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_syntax.c_str();
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char *
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetCommandName ()
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return m_cmd_name.c_str();
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetCommandName (const char *name)
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_name = name;
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetHelp (const char *cstr)
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_short = cstr;
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetHelpLong (const char *cstr)
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_help_long = cstr;
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid
132e5e34cb15f031237004b05abfa623c71f879f6c0Enrico GranataCommandObject::SetHelpLong (std::string str)
133e5e34cb15f031237004b05abfa623c71f879f6c0Enrico Granata{
134e5e34cb15f031237004b05abfa623c71f879f6c0Enrico Granata    m_cmd_help_long = str;
135e5e34cb15f031237004b05abfa623c71f879f6c0Enrico Granata}
136e5e34cb15f031237004b05abfa623c71f879f6c0Enrico Granata
137e5e34cb15f031237004b05abfa623c71f879f6c0Enrico Granatavoid
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::SetSyntax (const char *cstr)
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    m_cmd_syntax = cstr;
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerOptions *
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::GetOptions ()
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // By default commands don't have options unless this virtual function
14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // is overridden by base classes.
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return NULL;
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::ParseOptions
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args& args,
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandReturnObject &result
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // See if the subclass has options?
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Options *options = GetOptions();
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (options != NULL)
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Error error;
163143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        options->NotifyOptionParsingStarting();
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1653f2f741bb533b78e2fac5332c4698338ea2fd3acGreg Clayton        // ParseOptions calls getopt_long_only, which always skips the zero'th item in the array and starts at position 1,
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // so we need to push a dummy value into position zero.
16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        args.Unshift("dummy_string");
16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        error = args.ParseOptions (*options);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // The "dummy_string" will have already been removed by ParseOptions,
17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // so no need to remove it.
17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
173143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        if (error.Success())
174143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            error = options->NotifyOptionParsingFinished();
175143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
176143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        if (error.Success())
177143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
178143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            if (options->VerifyOptions (result))
179143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                return true;
180143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
181143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        else
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *error_cstr = error.AsCString();
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (error_cstr)
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // We got an error string, lets use that
1879c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton                result.AppendError(error_cstr);
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            else
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                // No error string, output the usage information into result
192f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                options->GenerateOptionUsage (result.GetErrorStream(), this);
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
195143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        result.SetStatus (eReturnStatusFailed);
196143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        return false;
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return true;
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
200da26bd203cbb104291b39891febf7481794f205fJim Ingham
201da26bd203cbb104291b39891febf7481794f205fJim Ingham
202da26bd203cbb104291b39891febf7481794f205fJim Ingham
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
204ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg ClaytonCommandObject::CheckRequirements (CommandReturnObject &result)
205ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton{
206ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton#ifdef LLDB_CONFIGURATION_DEBUG
207ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // Nothing should be stored in m_exe_ctx between running commands as m_exe_ctx
208ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // has shared pointers to the target, process, thread and frame and we don't
209ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // want any CommandObject instances to keep any of these objects around
210ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // longer than for a single command. Every command should call
211ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // CommandObject::Cleanup() after it has completed
212ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    assert (m_exe_ctx.GetTargetPtr() == NULL);
213ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    assert (m_exe_ctx.GetProcessPtr() == NULL);
214ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    assert (m_exe_ctx.GetThreadPtr() == NULL);
215ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    assert (m_exe_ctx.GetFramePtr() == NULL);
216ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton#endif
217ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
218ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // Lock down the interpreter's execution context prior to running the
219ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // command so we guarantee the selected target, process, thread and frame
220ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    // can't go away during the execution
221ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    m_exe_ctx = m_interpreter.GetExecutionContext();
222ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
223ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    const uint32_t flags = GetFlags().Get();
224ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    if (flags & (eFlagRequiresTarget   |
225ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                 eFlagRequiresProcess  |
226ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                 eFlagRequiresThread   |
227ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                 eFlagRequiresFrame    |
228ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                 eFlagTryTargetAPILock ))
229ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    {
230ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
231ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if ((flags & eFlagRequiresTarget) && !m_exe_ctx.HasTargetScope())
232ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
233ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            result.AppendError (GetInvalidTargetDescription());
234ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            return false;
235ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
236ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
237ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if ((flags & eFlagRequiresProcess) && !m_exe_ctx.HasProcessScope())
238ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
239ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            result.AppendError (GetInvalidProcessDescription());
240ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            return false;
241ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
242ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
243ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if ((flags & eFlagRequiresThread) && !m_exe_ctx.HasThreadScope())
244ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
245ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            result.AppendError (GetInvalidThreadDescription());
246ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            return false;
247ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
248ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
249ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if ((flags & eFlagRequiresFrame) && !m_exe_ctx.HasFrameScope())
250ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
251ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            result.AppendError (GetInvalidFrameDescription());
252ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            return false;
253ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
254ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
255ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if ((flags & eFlagRequiresRegContext) && (m_exe_ctx.GetRegisterContext() == NULL))
256ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
257ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            result.AppendError (GetInvalidRegContextDescription());
258ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            return false;
259ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
260ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
261ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if (flags & eFlagTryTargetAPILock)
262ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
263ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            Target *target = m_exe_ctx.GetTargetPtr();
264ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            if (target)
265ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            {
266ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                if (m_api_locker.TryLock (target->GetAPIMutex(), NULL) == false)
267ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                {
268ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    result.AppendError ("failed to get API lock");
269ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                    return false;
270ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                }
271ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            }
272ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
273ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    }
274ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
275e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton    if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused))
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
277567e7f3ba16eb48cb9fd6a2f26f2f7269eb6983cGreg Clayton        Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
278e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        if (process == NULL)
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
2808cc3f6977c8401769aab07b19ea84d87c018113bJim Ingham            // A process that is not running is considered paused.
2818cc3f6977c8401769aab07b19ea84d87c018113bJim Ingham            if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
2828cc3f6977c8401769aab07b19ea84d87c018113bJim Ingham            {
2838cc3f6977c8401769aab07b19ea84d87c018113bJim Ingham                result.AppendError ("Process must exist.");
2848cc3f6977c8401769aab07b19ea84d87c018113bJim Ingham                result.SetStatus (eReturnStatusFailed);
2858cc3f6977c8401769aab07b19ea84d87c018113bJim Ingham                return false;
2868cc3f6977c8401769aab07b19ea84d87c018113bJim Ingham            }
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
288e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton        else
28924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
290e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            StateType state = process->GetState();
291e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            switch (state)
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            {
2934fdf7602bedd8be648f3c549074cf13d90a05f03Greg Clayton            case eStateInvalid:
294e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateSuspended:
295e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateCrashed:
296e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateStopped:
297e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                break;
298e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton
299e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateConnected:
300e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateAttaching:
301e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateLaunching:
302e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateDetached:
303e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateExited:
304e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateUnloaded:
305e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
306e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                {
307e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                    result.AppendError ("Process must be launched.");
308e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                    result.SetStatus (eReturnStatusFailed);
309e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                    return false;
310e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                }
311e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                break;
312e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton
313e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateRunning:
314e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton            case eStateStepping:
315e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                if (GetFlags().Test(CommandObject::eFlagProcessMustBePaused))
316e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                {
317e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                    result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
318e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                    result.SetStatus (eReturnStatusFailed);
319e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                    return false;
320e71e258286a1713dbb2d366d8b81ff2f28e0216fGreg Clayton                }
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            }
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
324da26bd203cbb104291b39891febf7481794f205fJim Ingham    return true;
32524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
32624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
327ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Claytonvoid
328ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg ClaytonCommandObject::Cleanup ()
329ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton{
330ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    m_exe_ctx.Clear();
331ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton    m_api_locker.Unlock();
332ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton}
333ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
334ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass CommandDictCommandPartialMatch
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
33724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    public:
33824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandDictCommandPartialMatch (const char *match_str)
33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            m_match_str = match_str;
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const
34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // A NULL or empty string matches everything.
34524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (m_match_str == NULL || *m_match_str == '\0')
34636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton                return true;
34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
34836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton            return map_element.first.find (m_match_str, 0) == 0;
34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    private:
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        const char *m_match_str;
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
35424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
35524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
35624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str,
35724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                                              StringList &matches)
35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
35924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int number_added = 0;
36024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandDictCommandPartialMatch matcher(cmd_str);
36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher);
36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    while (matching_cmds != in_map.end())
36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        ++number_added;
36724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.AppendString((*matching_cmds).first.c_str());
36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);;
36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return number_added;
37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
37324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerint
37424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerCommandObject::HandleCompletion
37524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner(
37624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    Args &input,
37724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int &cursor_index,
37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int &cursor_char_position,
37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int match_start_point,
38024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    int max_return_elements,
381802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    bool &word_complete,
38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    StringList &matches
38324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner)
38424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
3858042eedf450752196b1ae347400f6a0bb9a2c729Johnny Chen    // Default implmentation of WantsCompletion() is !WantsRawCommandString().
3868042eedf450752196b1ae347400f6a0bb9a2c729Johnny Chen    // Subclasses who want raw command string but desire, for example,
3878042eedf450752196b1ae347400f6a0bb9a2c729Johnny Chen    // argument completion should override WantsCompletion() to return true,
3888042eedf450752196b1ae347400f6a0bb9a2c729Johnny Chen    // instead.
389120d94de65fd5979f885768c8ddeada63897c9baJohnny Chen    if (WantsRawCommandString() && !WantsCompletion())
39024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // FIXME: Abstract telling the completion to insert the completion character.
39224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        matches.Clear();
39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return -1;
39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
39524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    else
39624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // Can we do anything generic with the options?
39824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        Options *cur_options = GetOptions();
39924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        CommandReturnObject result;
40024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        OptionElementVector opt_element_vector;
40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (cur_options != NULL)
40324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
40424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // Re-insert the dummy command name string which will have been
40524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // stripped off:
40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            input.Unshift ("dummy-string");
40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            cursor_index++;
40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
40924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            // I stick an element on the end of the input, because if the last element is
4113f2f741bb533b78e2fac5332c4698338ea2fd3acGreg Clayton            // option that requires an argument, getopt_long_only will freak out.
41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            input.AppendArgument ("<FAKE-VALUE>");
41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
415adb8429ff57c3d54300dd6a8a1ed993d655c1931Jim Ingham            input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
41824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
41924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool handled_by_options;
420f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            handled_by_options = cur_options->HandleOptionCompletion (input,
42163094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      opt_element_vector,
42263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      cursor_index,
42363094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      cursor_char_position,
42463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      match_start_point,
42563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      max_return_elements,
426802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                                                      word_complete,
42763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                                                      matches);
42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            if (handled_by_options)
42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                return matches.GetSize();
43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        // If we got here, the last word is not an option or an option argument.
433238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        return HandleArgumentCompletion (input,
43463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         cursor_index,
43563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         cursor_char_position,
43663094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         opt_element_vector,
43763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         match_start_point,
43863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         max_return_elements,
439802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                         word_complete,
44063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                         matches);
44124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
44324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool
445238c0a1e7b733cee539258faa656159c63f9e893Greg ClaytonCommandObject::HelpTextContainsWord (const char *search_word)
44624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
44724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::string options_usage_help;
44824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
44924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool found_word = false;
45024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45113193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    const char *short_help = GetHelp();
45213193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    const char *long_help = GetHelpLong();
45313193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    const char *syntax_help = GetSyntax();
45424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
45513193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    if (short_help && strcasestr (short_help, search_word))
45624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        found_word = true;
45713193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    else if (long_help && strcasestr (long_help, search_word))
45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        found_word = true;
45913193d5ae15f194102c14a5ccdc46e8db5c3d95fGreg Clayton    else if (syntax_help && strcasestr (syntax_help, search_word))
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        found_word = true;
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    if (!found_word
46324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        && GetOptions() != NULL)
46424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
46524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        StreamString usage_help;
466f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        GetOptions()->GenerateOptionUsage (usage_help, this);
46724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (usage_help.GetSize() > 0)
46824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        {
46924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            const char *usage_text = usage_help.GetData();
4703439178f12feba0e4ef31865051361664c9a80a1Caroline Tice            if (strcasestr (usage_text, search_word))
47124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner              found_word = true;
47224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        }
47324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
47424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
47524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    return found_word;
47624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner}
477fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
478fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Ticeint
479fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::GetNumArgumentEntries  ()
480fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
481fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    return m_arguments.size();
482fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
483fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
484fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::CommandArgumentEntry *
485fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::GetArgumentEntryAtIndex (int idx)
486fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
487fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    if (idx < m_arguments.size())
488fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        return &(m_arguments[idx]);
489fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
490fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    return NULL;
491fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
492fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
493fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::ArgumentTableEntry *
494fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::FindArgumentDataByType (CommandArgumentType arg_type)
495fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
496fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    const ArgumentTableEntry *table = CommandObject::GetArgumentTable();
497fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
498fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    for (int i = 0; i < eArgTypeLastArg; ++i)
499fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        if (table[i].arg_type == arg_type)
500fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice            return (ArgumentTableEntry *) &(table[i]);
501fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
502fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    return NULL;
503fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
504fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
505fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Ticevoid
506fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter)
507fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
508fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    const ArgumentTableEntry* table = CommandObject::GetArgumentTable();
509fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    ArgumentTableEntry *entry = (ArgumentTableEntry *) &(table[arg_type]);
510fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
511fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
512fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
513fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    if (entry->arg_type != arg_type)
514fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        entry = CommandObject::FindArgumentDataByType (arg_type);
515fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
516fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    if (!entry)
517fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        return;
518fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
519fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    StreamString name_str;
520fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    name_str.Printf ("<%s>", entry->arg_name);
521fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
522ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata    if (entry->help_function)
5231bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    {
524ff78238a2ebc66a683dded02c2f99fba85077d05Enrico Granata        const char* help_text = entry->help_function();
5251bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        if (!entry->help_function.self_formatting)
5261bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        {
5271bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text,
5281bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                                 name_str.GetSize());
5291bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        }
5301bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        else
5311bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        {
5321bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text,
5331bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata                                       name_str.GetSize());
5341bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        }
5351bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    }
536fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    else
537fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize());
538fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
539fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
540fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Ticeconst char *
541fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::GetArgumentName (CommandArgumentType arg_type)
542fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
5434d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice    ArgumentTableEntry *entry = (ArgumentTableEntry *) &(CommandObject::GetArgumentTable()[arg_type]);
5444d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice
5454d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice    // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
5464d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice
5474d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice    if (entry->arg_type != arg_type)
5484d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice        entry = CommandObject::FindArgumentDataByType (arg_type);
5494d6675c8e1cab6360f59865229835ae137d6f68aCaroline Tice
55025ca984eabbf6a8004d0440968fd18d19ddeb814Johnny Chen    if (entry)
55125ca984eabbf6a8004d0440968fd18d19ddeb814Johnny Chen        return entry->arg_name;
55225ca984eabbf6a8004d0440968fd18d19ddeb814Johnny Chen
55325ca984eabbf6a8004d0440968fd18d19ddeb814Johnny Chen    StreamString str;
55425ca984eabbf6a8004d0440968fd18d19ddeb814Johnny Chen    str << "Arg name for type (" << arg_type << ") not in arg table!";
55525ca984eabbf6a8004d0440968fd18d19ddeb814Johnny Chen    return str.GetData();
556fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
557fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
55843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Ticebool
559b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonCommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type)
56043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice{
56143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice    if ((arg_repeat_type == eArgRepeatPairPlain)
56243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        ||  (arg_repeat_type == eArgRepeatPairOptional)
56343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        ||  (arg_repeat_type == eArgRepeatPairPlus)
56443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        ||  (arg_repeat_type == eArgRepeatPairStar)
56543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        ||  (arg_repeat_type == eArgRepeatPairRange)
56643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        ||  (arg_repeat_type == eArgRepeatPairRangeOptional))
56743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        return true;
56843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
56943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice    return false;
57043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice}
57143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
5726183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chenstatic CommandObject::CommandArgumentEntry
5736183fccd61b67e814d9e7e85b25516a28edfe864Johnny ChenOptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry)
5746183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen{
5756183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen    CommandObject::CommandArgumentEntry ret_val;
5766183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen    for (unsigned i = 0; i < cmd_arg_entry.size(); ++i)
5776183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen        if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association)
5786183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen            ret_val.push_back(cmd_arg_entry[i]);
5796183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen    return ret_val;
5806183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen}
5816183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen
5826183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen// Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take
5836183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen// all the argument data into account.  On rare cases where some argument sticks
5846183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen// with certain option sets, this function returns the option set filtered args.
585fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Ticevoid
5866183fccd61b67e814d9e7e85b25516a28edfe864Johnny ChenCommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask)
587fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
588fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    int num_args = m_arguments.size();
589fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    for (int i = 0; i < num_args; ++i)
590fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    {
591fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        if (i > 0)
592fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice            str.Printf (" ");
5936183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen        CommandArgumentEntry arg_entry =
5946183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen            opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i]
5956183fccd61b67e814d9e7e85b25516a28edfe864Johnny Chen                                             : OptSetFiltered(opt_set_mask, m_arguments[i]);
596fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        int num_alternatives = arg_entry.size();
59743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
59843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        if ((num_alternatives == 2)
59943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            && IsPairType (arg_entry[0].arg_repetition))
600fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        {
60143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            const char *first_name = GetArgumentName (arg_entry[0].arg_type);
60243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            const char *second_name = GetArgumentName (arg_entry[1].arg_type);
60343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            switch (arg_entry[0].arg_repetition)
60443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            {
60543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPairPlain:
60643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("<%s> <%s>", first_name, second_name);
60743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
60843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPairOptional:
60943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("[<%s> <%s>]", first_name, second_name);
61043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
61143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPairPlus:
61243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name);
61343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
61443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPairStar:
61543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name);
61643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
61743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPairRange:
61843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name);
61943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
62043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPairRangeOptional:
62143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name);
62243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
623b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                // Explicitly test for all the rest of the cases, so if new types get added we will notice the
624b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                // missing case statement(s).
625b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPlain:
626b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatOptional:
627b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPlus:
628b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatStar:
629b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatRange:
630b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                    // These should not be reached, as they should fail the IsPairType test above.
631b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                    break;
63243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            }
633fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        }
63443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        else
635fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        {
63643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            StreamString names;
63743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            for (int j = 0; j < num_alternatives; ++j)
63843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            {
63943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                if (j > 0)
64043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    names.Printf (" | ");
64143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type));
64243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            }
64343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            switch (arg_entry[0].arg_repetition)
64443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            {
64543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPlain:
64643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("<%s>", names.GetData());
64743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
64843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatPlus:
64943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData());
65043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
65143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatStar:
65243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData());
65343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
65443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatOptional:
65543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    str.Printf ("[<%s>]", names.GetData());
65643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                    break;
65743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                case eArgRepeatRange:
6587e5fa7fc1f8efd24c078e063b2c4b5e13ba5be20Jason Molenda                    str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData());
659b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                    break;
660b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                // Explicitly test for all the rest of the cases, so if new types get added we will notice the
661b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                // missing case statement(s).
662b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPairPlain:
663b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPairOptional:
664b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPairPlus:
665b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPairStar:
666b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPairRange:
667b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                case eArgRepeatPairRangeOptional:
668b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                    // These should not be hit, as they should pass the IsPairType test above, and control should
669b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                    // have gone into the other branch of the if statement.
670b5772848dfcbce2d05815d0a5878a6dfe147c9fcCaroline Tice                    break;
67143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice            }
672fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        }
673fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    }
674fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
675fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
67647f07856222a1d2032ecfb346f04836b3660d449Stephen WilsonCommandArgumentType
677fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::LookupArgumentName (const char *arg_name)
678fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
679fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    CommandArgumentType return_type = eArgTypeLastArg;
680fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
681fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    std::string arg_name_str (arg_name);
682fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    size_t len = arg_name_str.length();
683fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    if (arg_name[0] == '<'
684fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        && arg_name[len-1] == '>')
685fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice        arg_name_str = arg_name_str.substr (1, len-2);
686fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
687309c89decd7a62212ed45cb902112fe280ec9c0cJohnny Chen    const ArgumentTableEntry *table = GetArgumentTable();
688fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    for (int i = 0; i < eArgTypeLastArg; ++i)
689309c89decd7a62212ed45cb902112fe280ec9c0cJohnny Chen        if (arg_name_str.compare (table[i].arg_name) == 0)
690fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice            return_type = g_arguments_data[i].arg_type;
691fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
692fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    return return_type;
693fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
694fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
695fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Ticestatic const char *
696811708c938da75d9c7448a65490ee8dc3e5433f7Jim InghamRegisterNameHelpTextCallback ()
697811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham{
698811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    return "Register names can be specified using the architecture specific names.  "
699ff72cd0a987a81049589f40e1feecd9ad92ef550Jim Ingham    "They can also be specified using generic names.  Not all generic entities have "
700ff72cd0a987a81049589f40e1feecd9ad92ef550Jim Ingham    "registers backing them on all architectures.  When they don't the generic name "
701ff72cd0a987a81049589f40e1feecd9ad92ef550Jim Ingham    "will return an error.\n"
702811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    "The generic names defined in lldb are:\n"
703811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    "\n"
704811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    "pc       - program counter register\n"
705811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    "ra       - return address register\n"
706811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    "fp       - frame pointer register\n"
707811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    "sp       - stack pointer register\n"
708ff72cd0a987a81049589f40e1feecd9ad92ef550Jim Ingham    "flags    - the flags register\n"
709811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    "arg{1-6} - integer argument passing registers.\n";
710811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham}
711811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham
712811708c938da75d9c7448a65490ee8dc3e5433f7Jim Inghamstatic const char *
713fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceBreakpointIDHelpTextCallback ()
714fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
7159c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    return "Breakpoint ID's consist major and minor numbers;  the major number "
7169c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "corresponds to the single entity that was created with a 'breakpoint set' "
7179c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "command; the minor numbers correspond to all the locations that were actually "
7189c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "found/set based on the major breakpoint.  A full breakpoint ID might look like "
7199c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "3.14, meaning the 14th location set for the 3rd breakpoint.  You can specify "
7209c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "all the locations of a breakpoint by just indicating the major breakpoint "
7219c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "number. A valid breakpoint id consists either of just the major id number, "
7229c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "or the major number, a dot, and the location number (e.g. 3 or 3.2 could "
7239c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "both be valid breakpoint ids).";
724fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
725fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
726fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Ticestatic const char *
727fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceBreakpointIDRangeHelpTextCallback ()
728fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
7299c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. "
7309c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "This can be done  through several mechanisms.  The easiest way is to just "
7319c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "enter a space-separated list of breakpoint ids.  To specify all the "
7329c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "breakpoint locations under a major breakpoint, you can use the major "
7339c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "breakpoint number followed by '.*', eg. '5.*' means all the locations under "
7349c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "breakpoint 5.  You can also indicate a range of breakpoints by using "
7359c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "<start-bp-id> - <end-bp-id>.  The start-bp-id and end-bp-id for a range can "
7369c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "be any valid breakpoint ids.  It is not legal, however, to specify a range "
7379c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    "using specific locations that cross major breakpoint numbers.  I.e. 3.2 - 3.7"
7389c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal.";
739fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
740fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
741886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatastatic const char *
7429c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg ClaytonGDBFormatHelpTextCallback ()
7439c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton{
744966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    return "A GDB format consists of a repeat count, a format letter and a size letter. "
745966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "The repeat count is optional and defaults to 1. The format letter is optional "
746966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "and defaults to the previous format that was used. The size letter is optional "
747966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "and defaults to the previous size that was used.\n"
748966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "\n"
749966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "Format letters include:\n"
750966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "o - octal\n"
751966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "x - hexadecimal\n"
752966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "d - decimal\n"
753966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "u - unsigned decimal\n"
754966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "t - binary\n"
755966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "f - float\n"
756966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "a - address\n"
757966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "i - instruction\n"
758966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "c - char\n"
759966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "s - string\n"
760966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "T - OSType\n"
761966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "A - float as hex\n"
762966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "\n"
763966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "Size letters include:\n"
764966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "b - 1 byte  (byte)\n"
765966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "h - 2 bytes (halfword)\n"
766966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "w - 4 bytes (word)\n"
767966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "g - 8 bytes (giant)\n"
768966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "\n"
769966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "Example formats:\n"
770966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "32xb - show 32 1 byte hexadecimal integer values\n"
771966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "16xh - show 16 2 byte hexadecimal integer values\n"
772966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "64   - show 64 2 byte hexadecimal integer values (format and size from the last format)\n"
773966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    "dw   - show 1 4 byte decimal integer value\n"
774966096b3b9c4d27f03adcc73eddb17cdb796ad0cGreg Clayton    ;
7759c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton}
7769c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton
7779c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Claytonstatic const char *
778886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico GranataFormatHelpTextCallback ()
779886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata{
7801bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
7811bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    static char* help_text_ptr = NULL;
7821bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
7831bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    if (help_text_ptr)
7841bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        return help_text_ptr;
7851bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
786886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    StreamString sstr;
787886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n";
788886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1))
789886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    {
7901bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        if (f != eFormatDefault)
7911bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata            sstr.PutChar('\n');
7921bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata
793886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        char format_char = FormatManager::GetFormatAsFormatChar(f);
794886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata        if (format_char)
795886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata            sstr.Printf("'%c' or ", format_char);
796886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
7971bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f));
798886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    }
799886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
800886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    sstr.Flush();
801886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
802886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata    std::string data = sstr.GetString();
803886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
8041bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    help_text_ptr = new char[data.length()+1];
805886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
8061bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    data.copy(help_text_ptr, data.length());
807886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
8081bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    return help_text_ptr;
809886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata}
810886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
811886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granatastatic const char *
81261ff3a37c7141c672f30b32f3d94cafa2d326e3eSean CallananLanguageTypeHelpTextCallback ()
81361ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan{
81461ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    static char* help_text_ptr = NULL;
81561ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
81661ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    if (help_text_ptr)
81761ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan        return help_text_ptr;
81861ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
81961ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    StreamString sstr;
82061ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    sstr << "One of the following languages:\n";
82161ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
82225b2109486963038a436bdb82fd327a6e5bb8d6dDaniel Malea    for (unsigned int l = eLanguageTypeUnknown; l < eNumLanguageTypes; ++l)
82361ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    {
82425b2109486963038a436bdb82fd327a6e5bb8d6dDaniel Malea        sstr << "  " << LanguageRuntime::GetNameForLanguageType(static_cast<LanguageType>(l)) << "\n";
82561ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    }
82661ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
82761ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    sstr.Flush();
82861ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
82961ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    std::string data = sstr.GetString();
83061ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
83161ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    help_text_ptr = new char[data.length()+1];
83261ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
83361ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    data.copy(help_text_ptr, data.length());
83461ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
83561ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    return help_text_ptr;
83661ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan}
83761ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan
83861ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callananstatic const char *
8391bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico GranataSummaryStringHelpTextCallback()
8401bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata{
8411bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata    return
8421bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "A summary string is a way to extract information from variables in order to present them using a summary.\n"
8431bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "Summary strings contain static text, variables, scopes and control sequences:\n"
8441bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "  - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n"
8451bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "  - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n"
8461bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "  - Scopes are any sequence of text between { and }. Anything included in a scope will only appear in the output summary if there were no errors.\n"
8471bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "  - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n"
8481bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "A summary string works by copying static text verbatim, turning control sequences into their character counterpart, expanding variables and trying to expand scopes.\n"
8491bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "A variable is expanded by giving it a value other than its textual representation, and the way this is done depends on what comes after the ${ marker.\n"
8501bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "The most common sequence if ${var followed by an expression path, which is the text one would type to access a member of an aggregate types, given a variable of that type"
8511bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        " (e.g. if type T has a member named x, which has a member named y, and if t is of type T, the expression path would be .x.y and the way to fit that into a summary string would be"
852915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        " ${var.x.y}). You can also use ${*var followed by an expression path and in that case the object referred by the path will be dereferenced before being displayed."
853915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        " If the object is not a pointer, doing so will cause an error. For additional details on expression paths, you can type 'help expr-path'. \n"
8541bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "By default, summary strings attempt to display the summary for any variable they reference, and if that fails the value. If neither can be shown, nothing is displayed."
8551bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "In a summary string, you can also use an array index [n], or a slice-like range [n-m]. This can have two different meanings depending on what kind of object the expression"
8561bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        " path refers to:\n"
8571bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "  - if it is a scalar type (any basic type like int, float, ...) the expression is a bitfield, i.e. the bits indicated by the indexing operator are extracted out of the number"
8581bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        " and displayed as an individual variable\n"
8591bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        "  - if it is an array or pointer the array items indicated by the indexing operator are shown as the result of the variable. if the expression is an array, real array items are"
8601bba6e50d400090eb81efd7ab51957dfcbef06c0Enrico Granata        " printed; if it is a pointer, the pointer-as-array syntax is used to obtain the values (this means, the latter case can have no range checking)\n"
861915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "If you are trying to display an array for which the size is known, you can also use [] instead of giving an exact range. This has the effect of showing items 0 thru size - 1.\n"
862915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "Additionally, a variable can contain an (optional) format code, as in ${var.x.y%code}, where code can be any of the valid formats described in 'help format', or one of the"
863915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        " special symbols only allowed as part of a variable:\n"
864915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "    %V: show the value of the object by default\n"
865915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "    %S: show the summary of the object by default\n"
866915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "    %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n"
867915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "    %L: show the location of the object (memory address or a register name)\n"
868915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "    %#: show the number of children of the object\n"
869915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "    %T: show the type of the object\n"
870915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "Another variable that you can use in summary strings is ${svar . This sequence works exactly like ${var, including the fact that ${*svar is an allowed sequence, but uses"
871915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        " the object's synthetic children provider instead of the actual objects. For instance, if you are using STL synthetic children providers, the following summary string would"
872915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        " count the number of actual elements stored in an std::list:\n"
873915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata        "type summary add -s \"${svar%#}\" -x \"std::list<\"";
874915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata}
875915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata
876915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granatastatic const char *
877915448044bac6fdac22a33cc46697dcb771a8df2Enrico GranataExprPathHelpTextCallback()
878915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata{
879915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    return
880915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "An expression path is the sequence of symbols that is used in C/C++ to access a member variable of an aggregate object (class).\n"
881915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "For instance, given a class:\n"
882915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "  class foo {\n"
883915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "      int a;\n"
884915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "      int b; .\n"
885915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "      foo* next;\n"
886915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "  };\n"
887915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n"
888915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "Given that aFoo could just be any object of type foo, the string '.next->b' is the expression path, because it can be attached to any foo instance to achieve the effect.\n"
889915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "Expression paths in LLDB include dot (.) and arrow (->) operators, and most commands using expression paths have ways to also accept the star (*) operator.\n"
890915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n"
891915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "LLDB also has support for indexing ([ ]) in expression paths, and extends the traditional meaning of the square brackets operator to allow bitfield extraction:\n"
892915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    "for objects of native types (int, float, char, ...) saying '[n-m]' as an expression path (where n and m are any positive integers, e.g. [3-5]) causes LLDB to extract"
893915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    " bits n thru m from the value of the variable. If n == m, [n] is also allowed as a shortcut syntax. For arrays and pointers, expression paths can only contain one index"
894915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    " and the meaning of the operation is the same as the one defined by C/C++ (item extraction). Some commands extend bitfield-like syntax for arrays and pointers with the"
895915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory).";
896886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata}
897886bc3e5cb48e9660692609a7be69ec15b898bd7Enrico Granata
8980576c24a13668fc77109122c5331bd784222f70dJohnny Chenvoid
899035ef3d0a0136f2b9028b4695a681e58ba899651Enrico GranataCommandObject::GenerateHelpText (CommandReturnObject &result)
900035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata{
901035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    GenerateHelpText(result.GetOutputStream());
902035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata
903035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    result.SetStatus (eReturnStatusSuccessFinishNoResult);
904035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata}
905035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata
906035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granatavoid
907035ef3d0a0136f2b9028b4695a681e58ba899651Enrico GranataCommandObject::GenerateHelpText (Stream &output_strm)
908035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata{
909035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    CommandInterpreter& interpreter = GetCommandInterpreter();
910035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    if (GetOptions() != NULL)
911035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    {
912035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        if (WantsRawCommandString())
913035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        {
914035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            std::string help_text (GetHelp());
915035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
916035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
917035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        }
918035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        else
919035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
920035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
921035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        GetOptions()->GenerateOptionUsage (output_strm, this);
922035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        const char *long_help = GetHelpLong();
923035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        if ((long_help != NULL)
924035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            && (strlen (long_help) > 0))
925035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            output_strm.Printf ("\n%s", long_help);
926035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        if (WantsRawCommandString() && !WantsCompletion())
927035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        {
928035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            // Emit the message about using ' -- ' between the end of the command options and the raw input
929035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            // conditionally, i.e., only if the command object does not want completion.
930035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "",
931035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata                                                 "\nIMPORTANT NOTE:  Because this command takes 'raw' input, if you use any command options"
932035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata                                                 " you must use ' -- ' between the end of the command options and the beginning of the raw input.", 1);
933035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        }
934035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        else if (GetNumArgumentEntries() > 0
935035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata                 && GetOptions()
936035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata                 && GetOptions()->NumCommandOptions() > 0)
937035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        {
938035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            // Also emit a warning about using "--" in case you are using a command that takes options and arguments.
939035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "",
940035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata                                                 "\nThis command takes options and free-form arguments.  If your arguments resemble"
941035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata                                                 " option specifiers (i.e., they start with a - or --), you must use ' -- ' between"
942035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata                                                 " the end of the command options and the beginning of the arguments.", 1);
943035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        }
944035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    }
945035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    else if (IsMultiwordObject())
946035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    {
947035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        if (WantsRawCommandString())
948035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        {
949035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            std::string help_text (GetHelp());
950035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
951035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
952035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        }
953035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        else
954035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
955035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        GenerateHelpText (output_strm);
956035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    }
957035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    else
958035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    {
959035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        const char *long_help = GetHelpLong();
960035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        if ((long_help != NULL)
961035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            && (strlen (long_help) > 0))
962035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            output_strm.Printf ("%s", long_help);
963035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        else if (WantsRawCommandString())
964035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        {
965035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            std::string help_text (GetHelp());
966035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            help_text.append ("  This command takes 'raw' input (no need to quote stuff).");
967035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "", help_text.c_str(), 1);
968035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        }
969035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        else
970035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata            interpreter.OutputFormattedHelpText (output_strm, "", "", GetHelp(), 1);
971035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata        output_strm.Printf ("\nSyntax: %s\n", GetSyntax());
972035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata    }
973035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata}
974035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granata
975035ef3d0a0136f2b9028b4695a681e58ba899651Enrico Granatavoid
976cacedfb1c5db4da1cbbcf6326486ced8174f9b64Johnny ChenCommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
9770576c24a13668fc77109122c5331bd784222f70dJohnny Chen{
9780576c24a13668fc77109122c5331bd784222f70dJohnny Chen    CommandArgumentData id_arg;
9790576c24a13668fc77109122c5331bd784222f70dJohnny Chen    CommandArgumentData id_range_arg;
9800576c24a13668fc77109122c5331bd784222f70dJohnny Chen
9810576c24a13668fc77109122c5331bd784222f70dJohnny Chen    // Create the first variant for the first (and only) argument for this command.
982cacedfb1c5db4da1cbbcf6326486ced8174f9b64Johnny Chen    id_arg.arg_type = ID;
9830576c24a13668fc77109122c5331bd784222f70dJohnny Chen    id_arg.arg_repetition = eArgRepeatOptional;
9840576c24a13668fc77109122c5331bd784222f70dJohnny Chen
9850576c24a13668fc77109122c5331bd784222f70dJohnny Chen    // Create the second variant for the first (and only) argument for this command.
986cacedfb1c5db4da1cbbcf6326486ced8174f9b64Johnny Chen    id_range_arg.arg_type = IDRange;
9870576c24a13668fc77109122c5331bd784222f70dJohnny Chen    id_range_arg.arg_repetition = eArgRepeatOptional;
9880576c24a13668fc77109122c5331bd784222f70dJohnny Chen
989f0734cc92ec144a1980c68f07584074c8d625c49Johnny Chen    // The first (and only) argument for this command could be either an id or an id_range.
9900576c24a13668fc77109122c5331bd784222f70dJohnny Chen    // Push both variants into the entry for the first argument for this command.
9910576c24a13668fc77109122c5331bd784222f70dJohnny Chen    arg.push_back(id_arg);
9920576c24a13668fc77109122c5331bd784222f70dJohnny Chen    arg.push_back(id_range_arg);
9930576c24a13668fc77109122c5331bd784222f70dJohnny Chen}
9940576c24a13668fc77109122c5331bd784222f70dJohnny Chen
995aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Claytonconst char *
996aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg ClaytonCommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
997aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton{
998aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton    if (arg_type >=0 && arg_type < eArgTypeLastArg)
999aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton        return g_arguments_data[arg_type].arg_name;
1000aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton    return NULL;
1001aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton
1002aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton}
1003aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton
1004aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Claytonconst char *
1005aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg ClaytonCommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
1006aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton{
1007aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton    if (arg_type >=0 && arg_type < eArgTypeLastArg)
1008aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton        return g_arguments_data[arg_type].help_text;
1009aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton    return NULL;
1010aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton}
1011aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton
1012da26bd203cbb104291b39891febf7481794f205fJim Inghambool
1013da26bd203cbb104291b39891febf7481794f205fJim InghamCommandObjectParsed::Execute (const char *args_string, CommandReturnObject &result)
1014da26bd203cbb104291b39891febf7481794f205fJim Ingham{
1015da26bd203cbb104291b39891febf7481794f205fJim Ingham    CommandOverrideCallback command_callback = GetOverrideCallback();
1016da26bd203cbb104291b39891febf7481794f205fJim Ingham    bool handled = false;
1017da26bd203cbb104291b39891febf7481794f205fJim Ingham    Args cmd_args (args_string);
1018da26bd203cbb104291b39891febf7481794f205fJim Ingham    if (command_callback)
1019da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
1020da26bd203cbb104291b39891febf7481794f205fJim Ingham        Args full_args (GetCommandName ());
1021da26bd203cbb104291b39891febf7481794f205fJim Ingham        full_args.AppendArguments(cmd_args);
1022da26bd203cbb104291b39891febf7481794f205fJim Ingham        handled = command_callback (GetOverrideCallbackBaton(), full_args.GetConstArgumentVector());
1023da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
1024da26bd203cbb104291b39891febf7481794f205fJim Ingham    if (!handled)
1025da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
1026da26bd203cbb104291b39891febf7481794f205fJim Ingham        for (size_t i = 0; i < cmd_args.GetArgumentCount();  ++i)
1027da26bd203cbb104291b39891febf7481794f205fJim Ingham        {
1028da26bd203cbb104291b39891febf7481794f205fJim Ingham            const char *tmp_str = cmd_args.GetArgumentAtIndex (i);
1029da26bd203cbb104291b39891febf7481794f205fJim Ingham            if (tmp_str[0] == '`')  // back-quote
1030da26bd203cbb104291b39891febf7481794f205fJim Ingham                cmd_args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
1031da26bd203cbb104291b39891febf7481794f205fJim Ingham        }
1032da26bd203cbb104291b39891febf7481794f205fJim Ingham
1033ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if (CheckRequirements(result))
1034ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        {
1035ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            if (ParseOptions (cmd_args, result))
1036ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            {
1037ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                // Call the command-specific version of 'Execute', passing it the already processed arguments.
1038ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton                handled = DoExecute (cmd_args, result);
1039ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton            }
1040ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        }
1041da26bd203cbb104291b39891febf7481794f205fJim Ingham
1042ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        Cleanup();
1043da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
1044da26bd203cbb104291b39891febf7481794f205fJim Ingham    return handled;
1045da26bd203cbb104291b39891febf7481794f205fJim Ingham}
1046da26bd203cbb104291b39891febf7481794f205fJim Ingham
1047da26bd203cbb104291b39891febf7481794f205fJim Inghambool
1048da26bd203cbb104291b39891febf7481794f205fJim InghamCommandObjectRaw::Execute (const char *args_string, CommandReturnObject &result)
1049da26bd203cbb104291b39891febf7481794f205fJim Ingham{
1050da26bd203cbb104291b39891febf7481794f205fJim Ingham    CommandOverrideCallback command_callback = GetOverrideCallback();
1051da26bd203cbb104291b39891febf7481794f205fJim Ingham    bool handled = false;
1052da26bd203cbb104291b39891febf7481794f205fJim Ingham    if (command_callback)
1053da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
1054da26bd203cbb104291b39891febf7481794f205fJim Ingham        std::string full_command (GetCommandName ());
1055da26bd203cbb104291b39891febf7481794f205fJim Ingham        full_command += ' ';
1056da26bd203cbb104291b39891febf7481794f205fJim Ingham        full_command += args_string;
1057da26bd203cbb104291b39891febf7481794f205fJim Ingham        const char *argv[2] = { NULL, NULL };
1058da26bd203cbb104291b39891febf7481794f205fJim Ingham        argv[0] = full_command.c_str();
1059da26bd203cbb104291b39891febf7481794f205fJim Ingham        handled = command_callback (GetOverrideCallbackBaton(), argv);
1060da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
1061da26bd203cbb104291b39891febf7481794f205fJim Ingham    if (!handled)
1062da26bd203cbb104291b39891febf7481794f205fJim Ingham    {
1063ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        if (CheckRequirements(result))
1064da26bd203cbb104291b39891febf7481794f205fJim Ingham            handled = DoExecute (args_string, result);
1065ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton
1066ea0bb4d45c14447a2fe9be9f4bd8e79a84513537Greg Clayton        Cleanup();
1067da26bd203cbb104291b39891febf7481794f205fJim Ingham    }
1068da26bd203cbb104291b39891febf7481794f205fJim Ingham    return handled;
1069da26bd203cbb104291b39891febf7481794f205fJim Ingham}
1070da26bd203cbb104291b39891febf7481794f205fJim Ingham
1071746323a3deff83edfc0cfd60aab136d43a78b7c8Johnny Chenstatic
1072746323a3deff83edfc0cfd60aab136d43a78b7c8Johnny Chenconst char *arch_helper()
1073746323a3deff83edfc0cfd60aab136d43a78b7c8Johnny Chen{
1074dc43bbf5ec5cb2e92da9250cdea0b3ebcdccefc0Greg Clayton    static StreamString g_archs_help;
1075e23940fece748f8702bb5bc2383af19bb97275ddJohnny Chen    if (g_archs_help.Empty())
1076dc43bbf5ec5cb2e92da9250cdea0b3ebcdccefc0Greg Clayton    {
1077dc43bbf5ec5cb2e92da9250cdea0b3ebcdccefc0Greg Clayton        StringList archs;
1078dc43bbf5ec5cb2e92da9250cdea0b3ebcdccefc0Greg Clayton        ArchSpec::AutoComplete(NULL, archs);
1079dc43bbf5ec5cb2e92da9250cdea0b3ebcdccefc0Greg Clayton        g_archs_help.Printf("These are the supported architecture names:\n");
1080e23940fece748f8702bb5bc2383af19bb97275ddJohnny Chen        archs.Join("\n", g_archs_help);
1081dc43bbf5ec5cb2e92da9250cdea0b3ebcdccefc0Greg Clayton    }
1082dc43bbf5ec5cb2e92da9250cdea0b3ebcdccefc0Greg Clayton    return g_archs_help.GetData();
1083746323a3deff83edfc0cfd60aab136d43a78b7c8Johnny Chen}
1084746323a3deff83edfc0cfd60aab136d43a78b7c8Johnny Chen
1085fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::ArgumentTableEntry
1086fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::g_arguments_data[] =
1087fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
10889ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { NULL, false }, "A valid address in the target program's execution space." },
108916481ab10867e827dea07c3067cb100adb2a3e48Enrico Granata    { eArgTypeAddressOrExpression, "address-expression", CommandCompletions::eNoCompletion, { NULL, false }, "An expression that resolves to an address." },
10909ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of an abbreviation (alias) for a debugger command." },
10919ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeAliasOptions, "options-for-aliased-command", CommandCompletions::eNoCompletion, { NULL, false }, "Command options to be used as part of an alias (abbreviation) definition.  (See 'help commands alias' for more information.)" },
1092746323a3deff83edfc0cfd60aab136d43a78b7c8Johnny Chen    { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." },
10939ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { NULL, false }, "A Boolean value: 'true' or 'false'" },
10949ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, NULL },
10959ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, NULL },
10969ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { NULL, false }, "Number of bytes to use." },
10979ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { NULL, false }, "Then name of a class from the debug information in the program." },
10989ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { NULL, false }, "A debugger command (may be multiple words), without any options or arguments." },
10999ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." },
11009a91ef68c2650113da5488e09e9cb5f6aa88f6abSean Callanan    { eArgTypeDirectoryName, "directory", CommandCompletions::eDiskDirectoryCompletion, { NULL, false }, "A directory name." },
11017d4083837c5a258375fdc185d464b4ed15759a4bJim Ingham    { eArgTypeDisassemblyFlavor, "disassembly-flavor", CommandCompletions::eNoCompletion, { NULL, false }, "A disassembly flavor recognized by your disassembly plugin.  Currently the only valid options are \"att\" and \"intel\" for Intel targets" },
11029ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11039ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
1104915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, NULL },
11059ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeExprFormat, "expression-format", CommandCompletions::eNoCompletion, { NULL, false }, "[ [bool|b] | [bin] | [char|c] | [oct|o] | [dec|i|d|u] | [hex|x] | [float|f] | [cstr|s] ]" },
11069ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { NULL, false }, "The name of a file (can include path)." },
11079ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, NULL },
11089ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into a thread's list of frames." },
11099ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11109ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a function." },
11113bfaad6baec573ae2facf2f2acae0948c1a422bdSean Callanan    { eArgTypeFunctionOrSymbol, "function-or-symbol", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a function or symbol." },
11129c236733d43e6250c8a5671a438f4a2afeb9c0b2Greg Clayton    { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, NULL },
11139ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { NULL, false }, "An index into a list." },
111461ff3a37c7141c672f30b32f3d94cafa2d326e3eSean Callanan    { eArgTypeLanguage, "language", CommandCompletions::eNoCompletion, { LanguageTypeHelpTextCallback, true }, NULL },
11159ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { NULL, false }, "Line number in a source file." },
11169ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeLogCategory, "log-category", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a category within a log channel, e.g. all (try \"log list\" to see a list of all channels and their categories." },
11179ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeLogChannel, "log-channel", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a log channel, e.g. process.gdb-remote (try \"log list\" to see a list of all channels and their categories)." },
11189ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { NULL, false }, "A C++ method name." },
11199ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeName, "name", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11209ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11219ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { NULL, false }, "The number of lines to use." },
11229ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { NULL, false }, "The number of items per line to display." },
11239ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11249ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11259ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { NULL, false }, "A command that is entered as a single line of text." },
11269ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { NULL, false }, "The process ID number." },
11279ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11289ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the process." },
1129915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python class." },
1130915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python function." },
1131915448044bac6fdac22a33cc46697dcb771a8df2Enrico Granata    { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { NULL, false }, "Source code written in Python." },
11329ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the thread queue." },
1133811708c938da75d9c7448a65490ee8dc3e5433f7Jim Ingham    { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { RegisterNameHelpTextCallback, true }, NULL },
11349ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { NULL, false }, "A regular expression." },
11359ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { NULL, false }, "Arguments to be passed to the target program when it starts executing." },
11369ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11376010acef0cee54e044d4e7e472ef3d99e13c5045Enrico Granata    { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { NULL, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." },
11389ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { NULL, false }, "The scripting language to be used for script-based commands.  Currently only Python is valid." },
11399ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { NULL, false }, "The word for which you wish to search for information about." },
11409ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { NULL, false }, "An Objective-C selector name." },
11419ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSettingIndex, "setting-index", CommandCompletions::eNoCompletion, { NULL, false }, "An index into a settings variable that is an array (try 'settings list' to see all the possible settings variables and their types)." },
11429ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSettingKey, "setting-key", CommandCompletions::eNoCompletion, { NULL, false }, "A key into a settings variables that is a dictionary (try 'settings list' to see all the possible settings variables and their types)." },
11439ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" },
11449ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSettingVariableName, "setting-variable-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a settable internal debugger variable.  Type 'settings list' to see a complete list of such variables." },
11459ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a shared library." },
11469ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { NULL, false }, "The name of a source file.." },
11479ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { NULL, false }, "Specify a sort order when dumping lists." },
11489ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11499ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, NULL },
11509ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { NULL, false }, "Any symbol name (function name, variable, argument, etc.)" },
11519ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { NULL, false }, "Thread ID number." },
11529ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into the process' list of threads." },
11539ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { NULL, false }, "The thread's name." },
1154309c89decd7a62212ed45cb902112fe280ec9c0cJohnny Chen    { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." },
11559ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { NULL, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." },
11569ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a variable in your program." },
11579ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { NULL, false }, "A value could be anything, depending on where and how it is used." },
11589ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
11599ae9fd3992be47dd17d3b78526cf42ddfd5b51afEnrico Granata    { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { NULL, false }, "No help available for this." },
116058dba3ce82715249c068abb7bf99f0d43dfbe8f9Johnny Chen    { eArgTypePlatform, "platform-name", CommandCompletions::ePlatformPluginCompletion, { NULL, false }, "The name of an installed platform plug-in . Type 'platform list' to see a complete list of installed platforms." },
1161cacedfb1c5db4da1cbbcf6326486ced8174f9b64Johnny Chen    { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { NULL, false }, "Watchpoint IDs are positive integers." },
1162cacedfb1c5db4da1cbbcf6326486ced8174f9b64Johnny Chen    { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { NULL, false }, "For example, '1-3' or '1 to 3'." },
116334bbf85e60949752de9c8272a70d59383e523cc5Johnny Chen    { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { NULL, false }, "Specify the type for a watchpoint." }
1164fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice};
1165fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
1166fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Ticeconst CommandObject::ArgumentTableEntry*
1167fb355113cef81a6fa56b468bec7798a24d027b6dCaroline TiceCommandObject::GetArgumentTable ()
1168fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice{
1169aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton    // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration
1170aa378b1f53f8b557ceab403e31e6c9ef9a20b77dGreg Clayton    assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg);
1171fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice    return CommandObject::g_arguments_data;
1172fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice}
1173fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
1174fb355113cef81a6fa56b468bec7798a24d027b6dCaroline Tice
1175