130fdc8d8SChris Lattner //===-- CommandObject.cpp ---------------------------------------*- C++ -*-===//
230fdc8d8SChris Lattner //
330fdc8d8SChris Lattner //                     The LLVM Compiler Infrastructure
430fdc8d8SChris Lattner //
530fdc8d8SChris Lattner // This file is distributed under the University of Illinois Open Source
630fdc8d8SChris Lattner // License. See LICENSE.TXT for details.
730fdc8d8SChris Lattner //
830fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
930fdc8d8SChris Lattner 
1030fdc8d8SChris Lattner #include "lldb/Interpreter/CommandObject.h"
1130fdc8d8SChris Lattner 
1230fdc8d8SChris Lattner #include <string>
1330fdc8d8SChris Lattner #include <map>
1430fdc8d8SChris Lattner 
1530fdc8d8SChris Lattner #include <getopt.h>
1630fdc8d8SChris Lattner #include <stdlib.h>
1730fdc8d8SChris Lattner #include <ctype.h>
1830fdc8d8SChris Lattner 
1930fdc8d8SChris Lattner #include "lldb/Core/Address.h"
20ca7835c6SJohnny Chen #include "lldb/Core/ArchSpec.h"
2140af72e1SJim Ingham #include "lldb/Interpreter/Options.h"
2230fdc8d8SChris Lattner 
2330fdc8d8SChris Lattner // These are for the Sourcename completers.
2430fdc8d8SChris Lattner // FIXME: Make a separate file for the completers.
2553239f00SGreg Clayton #include "lldb/Host/FileSpec.h"
2630fdc8d8SChris Lattner #include "lldb/Core/FileSpecList.h"
2730fdc8d8SChris Lattner #include "lldb/Target/Process.h"
2830fdc8d8SChris Lattner #include "lldb/Target/Target.h"
2930fdc8d8SChris Lattner 
3030fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
3130fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
3230fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreter.h"
3330fdc8d8SChris Lattner #include "lldb/Interpreter/ScriptInterpreterPython.h"
3430fdc8d8SChris Lattner 
3530fdc8d8SChris Lattner using namespace lldb;
3630fdc8d8SChris Lattner using namespace lldb_private;
3730fdc8d8SChris Lattner 
3830fdc8d8SChris Lattner //-------------------------------------------------------------------------
3930fdc8d8SChris Lattner // CommandObject
4030fdc8d8SChris Lattner //-------------------------------------------------------------------------
4130fdc8d8SChris Lattner 
42a7015092SGreg Clayton CommandObject::CommandObject
43a7015092SGreg Clayton (
44a7015092SGreg Clayton     CommandInterpreter &interpreter,
45a7015092SGreg Clayton     const char *name,
46a7015092SGreg Clayton     const char *help,
47a7015092SGreg Clayton     const char *syntax,
48a7015092SGreg Clayton     uint32_t flags
49a7015092SGreg Clayton ) :
50a7015092SGreg Clayton     m_interpreter (interpreter),
5130fdc8d8SChris Lattner     m_cmd_name (name),
5230fdc8d8SChris Lattner     m_cmd_help_short (),
5330fdc8d8SChris Lattner     m_cmd_help_long (),
5430fdc8d8SChris Lattner     m_cmd_syntax (),
55279a6c26SJim Ingham     m_is_alias (false),
56e139cf23SCaroline Tice     m_flags (flags),
57a9f7b79dSGreg Clayton     m_arguments(),
58a9f7b79dSGreg Clayton     m_command_override_callback (NULL),
59a9f7b79dSGreg Clayton     m_command_override_baton (NULL)
6030fdc8d8SChris Lattner {
6130fdc8d8SChris Lattner     if (help && help[0])
6230fdc8d8SChris Lattner         m_cmd_help_short = help;
6330fdc8d8SChris Lattner     if (syntax && syntax[0])
6430fdc8d8SChris Lattner         m_cmd_syntax = syntax;
6530fdc8d8SChris Lattner }
6630fdc8d8SChris Lattner 
6730fdc8d8SChris Lattner CommandObject::~CommandObject ()
6830fdc8d8SChris Lattner {
6930fdc8d8SChris Lattner }
7030fdc8d8SChris Lattner 
7130fdc8d8SChris Lattner const char *
7230fdc8d8SChris Lattner CommandObject::GetHelp ()
7330fdc8d8SChris Lattner {
7430fdc8d8SChris Lattner     return m_cmd_help_short.c_str();
7530fdc8d8SChris Lattner }
7630fdc8d8SChris Lattner 
7730fdc8d8SChris Lattner const char *
7830fdc8d8SChris Lattner CommandObject::GetHelpLong ()
7930fdc8d8SChris Lattner {
8030fdc8d8SChris Lattner     return m_cmd_help_long.c_str();
8130fdc8d8SChris Lattner }
8230fdc8d8SChris Lattner 
8330fdc8d8SChris Lattner const char *
8430fdc8d8SChris Lattner CommandObject::GetSyntax ()
8530fdc8d8SChris Lattner {
86e139cf23SCaroline Tice     if (m_cmd_syntax.length() == 0)
87e139cf23SCaroline Tice     {
88e139cf23SCaroline Tice         StreamString syntax_str;
89e139cf23SCaroline Tice         syntax_str.Printf ("%s", GetCommandName());
90e139cf23SCaroline Tice         if (GetOptions() != NULL)
91e139cf23SCaroline Tice             syntax_str.Printf (" <cmd-options>");
92e139cf23SCaroline Tice         if (m_arguments.size() > 0)
93e139cf23SCaroline Tice         {
94e139cf23SCaroline Tice             syntax_str.Printf (" ");
95a4c6ad19SSean Callanan             if (WantsRawCommandString())
96a4c6ad19SSean Callanan                 syntax_str.Printf("-- ");
97e139cf23SCaroline Tice             GetFormattedCommandArguments (syntax_str);
98e139cf23SCaroline Tice         }
99e139cf23SCaroline Tice         m_cmd_syntax = syntax_str.GetData ();
100e139cf23SCaroline Tice     }
101e139cf23SCaroline Tice 
10230fdc8d8SChris Lattner     return m_cmd_syntax.c_str();
10330fdc8d8SChris Lattner }
10430fdc8d8SChris Lattner 
10530fdc8d8SChris Lattner const char *
10630fdc8d8SChris Lattner CommandObject::Translate ()
10730fdc8d8SChris Lattner {
10830fdc8d8SChris Lattner     //return m_cmd_func_name.c_str();
10930fdc8d8SChris Lattner     return "This function is currently not implemented.";
11030fdc8d8SChris Lattner }
11130fdc8d8SChris Lattner 
11230fdc8d8SChris Lattner const char *
11330fdc8d8SChris Lattner CommandObject::GetCommandName ()
11430fdc8d8SChris Lattner {
11530fdc8d8SChris Lattner     return m_cmd_name.c_str();
11630fdc8d8SChris Lattner }
11730fdc8d8SChris Lattner 
11830fdc8d8SChris Lattner void
11930fdc8d8SChris Lattner CommandObject::SetCommandName (const char *name)
12030fdc8d8SChris Lattner {
12130fdc8d8SChris Lattner     m_cmd_name = name;
12230fdc8d8SChris Lattner }
12330fdc8d8SChris Lattner 
12430fdc8d8SChris Lattner void
12530fdc8d8SChris Lattner CommandObject::SetHelp (const char *cstr)
12630fdc8d8SChris Lattner {
12730fdc8d8SChris Lattner     m_cmd_help_short = cstr;
12830fdc8d8SChris Lattner }
12930fdc8d8SChris Lattner 
13030fdc8d8SChris Lattner void
13130fdc8d8SChris Lattner CommandObject::SetHelpLong (const char *cstr)
13230fdc8d8SChris Lattner {
13330fdc8d8SChris Lattner     m_cmd_help_long = cstr;
13430fdc8d8SChris Lattner }
13530fdc8d8SChris Lattner 
13630fdc8d8SChris Lattner void
13799f0b8f9SEnrico Granata CommandObject::SetHelpLong (std::string str)
13899f0b8f9SEnrico Granata {
13999f0b8f9SEnrico Granata     m_cmd_help_long = str;
14099f0b8f9SEnrico Granata }
14199f0b8f9SEnrico Granata 
14299f0b8f9SEnrico Granata void
14330fdc8d8SChris Lattner CommandObject::SetSyntax (const char *cstr)
14430fdc8d8SChris Lattner {
14530fdc8d8SChris Lattner     m_cmd_syntax = cstr;
14630fdc8d8SChris Lattner }
14730fdc8d8SChris Lattner 
14830fdc8d8SChris Lattner Options *
14930fdc8d8SChris Lattner CommandObject::GetOptions ()
15030fdc8d8SChris Lattner {
15130fdc8d8SChris Lattner     // By default commands don't have options unless this virtual function
15230fdc8d8SChris Lattner     // is overridden by base classes.
15330fdc8d8SChris Lattner     return NULL;
15430fdc8d8SChris Lattner }
15530fdc8d8SChris Lattner 
15630fdc8d8SChris Lattner Flags&
15730fdc8d8SChris Lattner CommandObject::GetFlags()
15830fdc8d8SChris Lattner {
15930fdc8d8SChris Lattner     return m_flags;
16030fdc8d8SChris Lattner }
16130fdc8d8SChris Lattner 
16230fdc8d8SChris Lattner const Flags&
16330fdc8d8SChris Lattner CommandObject::GetFlags() const
16430fdc8d8SChris Lattner {
16530fdc8d8SChris Lattner     return m_flags;
16630fdc8d8SChris Lattner }
16730fdc8d8SChris Lattner 
16830fdc8d8SChris Lattner bool
16930fdc8d8SChris Lattner CommandObject::ParseOptions
17030fdc8d8SChris Lattner (
17130fdc8d8SChris Lattner     Args& args,
17230fdc8d8SChris Lattner     CommandReturnObject &result
17330fdc8d8SChris Lattner )
17430fdc8d8SChris Lattner {
17530fdc8d8SChris Lattner     // See if the subclass has options?
17630fdc8d8SChris Lattner     Options *options = GetOptions();
17730fdc8d8SChris Lattner     if (options != NULL)
17830fdc8d8SChris Lattner     {
17930fdc8d8SChris Lattner         Error error;
180f6b8b581SGreg Clayton         options->NotifyOptionParsingStarting();
18130fdc8d8SChris Lattner 
18230fdc8d8SChris Lattner         // ParseOptions calls getopt_long, which always skips the zero'th item in the array and starts at position 1,
18330fdc8d8SChris Lattner         // so we need to push a dummy value into position zero.
18430fdc8d8SChris Lattner         args.Unshift("dummy_string");
18530fdc8d8SChris Lattner         error = args.ParseOptions (*options);
18630fdc8d8SChris Lattner 
18730fdc8d8SChris Lattner         // The "dummy_string" will have already been removed by ParseOptions,
18830fdc8d8SChris Lattner         // so no need to remove it.
18930fdc8d8SChris Lattner 
190f6b8b581SGreg Clayton         if (error.Success())
191f6b8b581SGreg Clayton             error = options->NotifyOptionParsingFinished();
192f6b8b581SGreg Clayton 
193f6b8b581SGreg Clayton         if (error.Success())
194f6b8b581SGreg Clayton         {
195f6b8b581SGreg Clayton             if (options->VerifyOptions (result))
196f6b8b581SGreg Clayton                 return true;
197f6b8b581SGreg Clayton         }
198f6b8b581SGreg Clayton         else
19930fdc8d8SChris Lattner         {
20030fdc8d8SChris Lattner             const char *error_cstr = error.AsCString();
20130fdc8d8SChris Lattner             if (error_cstr)
20230fdc8d8SChris Lattner             {
20330fdc8d8SChris Lattner                 // We got an error string, lets use that
20486edbf41SGreg Clayton                 result.AppendError(error_cstr);
20530fdc8d8SChris Lattner             }
20630fdc8d8SChris Lattner             else
20730fdc8d8SChris Lattner             {
20830fdc8d8SChris Lattner                 // No error string, output the usage information into result
209eb0103f2SGreg Clayton                 options->GenerateOptionUsage (result.GetErrorStream(), this);
21030fdc8d8SChris Lattner             }
211f6b8b581SGreg Clayton         }
21230fdc8d8SChris Lattner         result.SetStatus (eReturnStatusFailed);
21330fdc8d8SChris Lattner         return false;
21430fdc8d8SChris Lattner     }
21530fdc8d8SChris Lattner     return true;
21630fdc8d8SChris Lattner }
21730fdc8d8SChris Lattner bool
218a7015092SGreg Clayton CommandObject::ExecuteWithOptions (Args& args, CommandReturnObject &result)
21930fdc8d8SChris Lattner {
22030fdc8d8SChris Lattner     for (size_t i = 0; i < args.GetArgumentCount();  ++i)
22130fdc8d8SChris Lattner     {
22230fdc8d8SChris Lattner         const char *tmp_str = args.GetArgumentAtIndex (i);
22330fdc8d8SChris Lattner         if (tmp_str[0] == '`')  // back-quote
224a7015092SGreg Clayton             args.ReplaceArgumentAtIndex (i, m_interpreter.ProcessEmbeddedScriptCommands (tmp_str));
22530fdc8d8SChris Lattner     }
22630fdc8d8SChris Lattner 
227b766a73dSGreg Clayton     if (GetFlags().AnySet (CommandObject::eFlagProcessMustBeLaunched | CommandObject::eFlagProcessMustBePaused))
228b766a73dSGreg Clayton     {
229c14ee32dSGreg Clayton         Process *process = m_interpreter.GetExecutionContext().GetProcessPtr();
23030fdc8d8SChris Lattner         if (process == NULL)
23130fdc8d8SChris Lattner         {
232b8e8a5f3SJim Ingham             // A process that is not running is considered paused.
233b8e8a5f3SJim Ingham             if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
234b8e8a5f3SJim Ingham             {
23530fdc8d8SChris Lattner                 result.AppendError ("Process must exist.");
23630fdc8d8SChris Lattner                 result.SetStatus (eReturnStatusFailed);
23730fdc8d8SChris Lattner                 return false;
23830fdc8d8SChris Lattner             }
239b8e8a5f3SJim Ingham         }
24030fdc8d8SChris Lattner         else
24130fdc8d8SChris Lattner         {
24230fdc8d8SChris Lattner             StateType state = process->GetState();
24330fdc8d8SChris Lattner 
24430fdc8d8SChris Lattner             switch (state)
24530fdc8d8SChris Lattner             {
2467a5388bfSGreg Clayton             case eStateInvalid:
24730fdc8d8SChris Lattner             case eStateSuspended:
24830fdc8d8SChris Lattner             case eStateCrashed:
24930fdc8d8SChris Lattner             case eStateStopped:
25030fdc8d8SChris Lattner                 break;
25130fdc8d8SChris Lattner 
252b766a73dSGreg Clayton             case eStateConnected:
253b766a73dSGreg Clayton             case eStateAttaching:
254b766a73dSGreg Clayton             case eStateLaunching:
25530fdc8d8SChris Lattner             case eStateDetached:
25630fdc8d8SChris Lattner             case eStateExited:
25730fdc8d8SChris Lattner             case eStateUnloaded:
25873b472d4SGreg Clayton                 if (GetFlags().Test(CommandObject::eFlagProcessMustBeLaunched))
25930fdc8d8SChris Lattner                 {
26030fdc8d8SChris Lattner                     result.AppendError ("Process must be launched.");
26130fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
26230fdc8d8SChris Lattner                     return false;
26330fdc8d8SChris Lattner                 }
26430fdc8d8SChris Lattner                 break;
26530fdc8d8SChris Lattner 
26630fdc8d8SChris Lattner             case eStateRunning:
26730fdc8d8SChris Lattner             case eStateStepping:
26873b472d4SGreg Clayton                 if (GetFlags().Test(CommandObject::eFlagProcessMustBePaused))
26930fdc8d8SChris Lattner                 {
27030fdc8d8SChris Lattner                     result.AppendError ("Process is running.  Use 'process interrupt' to pause execution.");
27130fdc8d8SChris Lattner                     result.SetStatus (eReturnStatusFailed);
27230fdc8d8SChris Lattner                     return false;
27330fdc8d8SChris Lattner                 }
27430fdc8d8SChris Lattner             }
27530fdc8d8SChris Lattner         }
276b766a73dSGreg Clayton     }
27730fdc8d8SChris Lattner 
278a7015092SGreg Clayton     if (!ParseOptions (args, result))
27930fdc8d8SChris Lattner         return false;
28030fdc8d8SChris Lattner 
28130fdc8d8SChris Lattner     // Call the command-specific version of 'Execute', passing it the already processed arguments.
282a7015092SGreg Clayton     return Execute (args, result);
28330fdc8d8SChris Lattner }
28430fdc8d8SChris Lattner 
28530fdc8d8SChris Lattner class CommandDictCommandPartialMatch
28630fdc8d8SChris Lattner {
28730fdc8d8SChris Lattner     public:
28830fdc8d8SChris Lattner         CommandDictCommandPartialMatch (const char *match_str)
28930fdc8d8SChris Lattner         {
29030fdc8d8SChris Lattner             m_match_str = match_str;
29130fdc8d8SChris Lattner         }
29230fdc8d8SChris Lattner         bool operator() (const std::pair<std::string, lldb::CommandObjectSP> map_element) const
29330fdc8d8SChris Lattner         {
29430fdc8d8SChris Lattner             // A NULL or empty string matches everything.
29530fdc8d8SChris Lattner             if (m_match_str == NULL || *m_match_str == '\0')
29630fdc8d8SChris Lattner                 return 1;
29730fdc8d8SChris Lattner 
29830fdc8d8SChris Lattner             size_t found = map_element.first.find (m_match_str, 0);
29930fdc8d8SChris Lattner             if (found == std::string::npos)
30030fdc8d8SChris Lattner                 return 0;
30130fdc8d8SChris Lattner             else
30230fdc8d8SChris Lattner                 return found == 0;
30330fdc8d8SChris Lattner         }
30430fdc8d8SChris Lattner 
30530fdc8d8SChris Lattner     private:
30630fdc8d8SChris Lattner         const char *m_match_str;
30730fdc8d8SChris Lattner };
30830fdc8d8SChris Lattner 
30930fdc8d8SChris Lattner int
31030fdc8d8SChris Lattner CommandObject::AddNamesMatchingPartialString (CommandObject::CommandMap &in_map, const char *cmd_str,
31130fdc8d8SChris Lattner                                               StringList &matches)
31230fdc8d8SChris Lattner {
31330fdc8d8SChris Lattner     int number_added = 0;
31430fdc8d8SChris Lattner     CommandDictCommandPartialMatch matcher(cmd_str);
31530fdc8d8SChris Lattner 
31630fdc8d8SChris Lattner     CommandObject::CommandMap::iterator matching_cmds = std::find_if (in_map.begin(), in_map.end(), matcher);
31730fdc8d8SChris Lattner 
31830fdc8d8SChris Lattner     while (matching_cmds != in_map.end())
31930fdc8d8SChris Lattner     {
32030fdc8d8SChris Lattner         ++number_added;
32130fdc8d8SChris Lattner         matches.AppendString((*matching_cmds).first.c_str());
32230fdc8d8SChris Lattner         matching_cmds = std::find_if (++matching_cmds, in_map.end(), matcher);;
32330fdc8d8SChris Lattner     }
32430fdc8d8SChris Lattner     return number_added;
32530fdc8d8SChris Lattner }
32630fdc8d8SChris Lattner 
32730fdc8d8SChris Lattner int
32830fdc8d8SChris Lattner CommandObject::HandleCompletion
32930fdc8d8SChris Lattner (
33030fdc8d8SChris Lattner     Args &input,
33130fdc8d8SChris Lattner     int &cursor_index,
33230fdc8d8SChris Lattner     int &cursor_char_position,
33330fdc8d8SChris Lattner     int match_start_point,
33430fdc8d8SChris Lattner     int max_return_elements,
335558ce124SJim Ingham     bool &word_complete,
33630fdc8d8SChris Lattner     StringList &matches
33730fdc8d8SChris Lattner )
33830fdc8d8SChris Lattner {
3396561d15dSJohnny Chen     // Default implmentation of WantsCompletion() is !WantsRawCommandString().
3406561d15dSJohnny Chen     // Subclasses who want raw command string but desire, for example,
3416561d15dSJohnny Chen     // argument completion should override WantsCompletion() to return true,
3426561d15dSJohnny Chen     // instead.
3436f99b637SJohnny Chen     if (WantsRawCommandString() && !WantsCompletion())
34430fdc8d8SChris Lattner     {
34530fdc8d8SChris Lattner         // FIXME: Abstract telling the completion to insert the completion character.
34630fdc8d8SChris Lattner         matches.Clear();
34730fdc8d8SChris Lattner         return -1;
34830fdc8d8SChris Lattner     }
34930fdc8d8SChris Lattner     else
35030fdc8d8SChris Lattner     {
35130fdc8d8SChris Lattner         // Can we do anything generic with the options?
35230fdc8d8SChris Lattner         Options *cur_options = GetOptions();
35330fdc8d8SChris Lattner         CommandReturnObject result;
35430fdc8d8SChris Lattner         OptionElementVector opt_element_vector;
35530fdc8d8SChris Lattner 
35630fdc8d8SChris Lattner         if (cur_options != NULL)
35730fdc8d8SChris Lattner         {
35830fdc8d8SChris Lattner             // Re-insert the dummy command name string which will have been
35930fdc8d8SChris Lattner             // stripped off:
36030fdc8d8SChris Lattner             input.Unshift ("dummy-string");
36130fdc8d8SChris Lattner             cursor_index++;
36230fdc8d8SChris Lattner 
36330fdc8d8SChris Lattner 
36430fdc8d8SChris Lattner             // I stick an element on the end of the input, because if the last element is
36530fdc8d8SChris Lattner             // option that requires an argument, getopt_long will freak out.
36630fdc8d8SChris Lattner 
36730fdc8d8SChris Lattner             input.AppendArgument ("<FAKE-VALUE>");
36830fdc8d8SChris Lattner 
369d43e0094SJim Ingham             input.ParseArgsForCompletion (*cur_options, opt_element_vector, cursor_index);
37030fdc8d8SChris Lattner 
37130fdc8d8SChris Lattner             input.DeleteArgumentAtIndex(input.GetArgumentCount() - 1);
37230fdc8d8SChris Lattner 
37330fdc8d8SChris Lattner             bool handled_by_options;
374eb0103f2SGreg Clayton             handled_by_options = cur_options->HandleOptionCompletion (input,
37530fdc8d8SChris Lattner                                                                       opt_element_vector,
37630fdc8d8SChris Lattner                                                                       cursor_index,
37730fdc8d8SChris Lattner                                                                       cursor_char_position,
37830fdc8d8SChris Lattner                                                                       match_start_point,
37930fdc8d8SChris Lattner                                                                       max_return_elements,
380558ce124SJim Ingham                                                                       word_complete,
38130fdc8d8SChris Lattner                                                                       matches);
38230fdc8d8SChris Lattner             if (handled_by_options)
38330fdc8d8SChris Lattner                 return matches.GetSize();
38430fdc8d8SChris Lattner         }
38530fdc8d8SChris Lattner 
38630fdc8d8SChris Lattner         // If we got here, the last word is not an option or an option argument.
387a7015092SGreg Clayton         return HandleArgumentCompletion (input,
38830fdc8d8SChris Lattner                                          cursor_index,
38930fdc8d8SChris Lattner                                          cursor_char_position,
39030fdc8d8SChris Lattner                                          opt_element_vector,
39130fdc8d8SChris Lattner                                          match_start_point,
39230fdc8d8SChris Lattner                                          max_return_elements,
393558ce124SJim Ingham                                          word_complete,
39430fdc8d8SChris Lattner                                          matches);
39530fdc8d8SChris Lattner     }
39630fdc8d8SChris Lattner }
39730fdc8d8SChris Lattner 
39830fdc8d8SChris Lattner bool
399a7015092SGreg Clayton CommandObject::HelpTextContainsWord (const char *search_word)
40030fdc8d8SChris Lattner {
40130fdc8d8SChris Lattner     const char *short_help;
40230fdc8d8SChris Lattner     const char *long_help;
40330fdc8d8SChris Lattner     const char *syntax_help;
40430fdc8d8SChris Lattner     std::string options_usage_help;
40530fdc8d8SChris Lattner 
40630fdc8d8SChris Lattner 
40730fdc8d8SChris Lattner     bool found_word = false;
40830fdc8d8SChris Lattner 
40930fdc8d8SChris Lattner     short_help = GetHelp();
41030fdc8d8SChris Lattner     long_help = GetHelpLong();
41130fdc8d8SChris Lattner     syntax_help = GetSyntax();
41230fdc8d8SChris Lattner 
4134b6fbf37SCaroline Tice     if (strcasestr (short_help, search_word))
41430fdc8d8SChris Lattner         found_word = true;
4154b6fbf37SCaroline Tice     else if (strcasestr (long_help, search_word))
41630fdc8d8SChris Lattner         found_word = true;
4174b6fbf37SCaroline Tice     else if (strcasestr (syntax_help, search_word))
41830fdc8d8SChris Lattner         found_word = true;
41930fdc8d8SChris Lattner 
42030fdc8d8SChris Lattner     if (!found_word
42130fdc8d8SChris Lattner         && GetOptions() != NULL)
42230fdc8d8SChris Lattner     {
42330fdc8d8SChris Lattner         StreamString usage_help;
424eb0103f2SGreg Clayton         GetOptions()->GenerateOptionUsage (usage_help, this);
42530fdc8d8SChris Lattner         if (usage_help.GetSize() > 0)
42630fdc8d8SChris Lattner         {
42730fdc8d8SChris Lattner             const char *usage_text = usage_help.GetData();
4284b6fbf37SCaroline Tice             if (strcasestr (usage_text, search_word))
42930fdc8d8SChris Lattner               found_word = true;
43030fdc8d8SChris Lattner         }
43130fdc8d8SChris Lattner     }
43230fdc8d8SChris Lattner 
43330fdc8d8SChris Lattner     return found_word;
43430fdc8d8SChris Lattner }
435e139cf23SCaroline Tice 
436e139cf23SCaroline Tice int
437e139cf23SCaroline Tice CommandObject::GetNumArgumentEntries  ()
438e139cf23SCaroline Tice {
439e139cf23SCaroline Tice     return m_arguments.size();
440e139cf23SCaroline Tice }
441e139cf23SCaroline Tice 
442e139cf23SCaroline Tice CommandObject::CommandArgumentEntry *
443e139cf23SCaroline Tice CommandObject::GetArgumentEntryAtIndex (int idx)
444e139cf23SCaroline Tice {
445e139cf23SCaroline Tice     if (idx < m_arguments.size())
446e139cf23SCaroline Tice         return &(m_arguments[idx]);
447e139cf23SCaroline Tice 
448e139cf23SCaroline Tice     return NULL;
449e139cf23SCaroline Tice }
450e139cf23SCaroline Tice 
451e139cf23SCaroline Tice CommandObject::ArgumentTableEntry *
452e139cf23SCaroline Tice CommandObject::FindArgumentDataByType (CommandArgumentType arg_type)
453e139cf23SCaroline Tice {
454e139cf23SCaroline Tice     const ArgumentTableEntry *table = CommandObject::GetArgumentTable();
455e139cf23SCaroline Tice 
456e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
457e139cf23SCaroline Tice         if (table[i].arg_type == arg_type)
458e139cf23SCaroline Tice             return (ArgumentTableEntry *) &(table[i]);
459e139cf23SCaroline Tice 
460e139cf23SCaroline Tice     return NULL;
461e139cf23SCaroline Tice }
462e139cf23SCaroline Tice 
463e139cf23SCaroline Tice void
464e139cf23SCaroline Tice CommandObject::GetArgumentHelp (Stream &str, CommandArgumentType arg_type, CommandInterpreter &interpreter)
465e139cf23SCaroline Tice {
466e139cf23SCaroline Tice     const ArgumentTableEntry* table = CommandObject::GetArgumentTable();
467e139cf23SCaroline Tice     ArgumentTableEntry *entry = (ArgumentTableEntry *) &(table[arg_type]);
468e139cf23SCaroline Tice 
469e139cf23SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
470e139cf23SCaroline Tice 
471e139cf23SCaroline Tice     if (entry->arg_type != arg_type)
472e139cf23SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
473e139cf23SCaroline Tice 
474e139cf23SCaroline Tice     if (!entry)
475e139cf23SCaroline Tice         return;
476e139cf23SCaroline Tice 
477e139cf23SCaroline Tice     StreamString name_str;
478e139cf23SCaroline Tice     name_str.Printf ("<%s>", entry->arg_name);
479e139cf23SCaroline Tice 
480fc7a7f3bSEnrico Granata     if (entry->help_function)
48182a7d983SEnrico Granata     {
482fc7a7f3bSEnrico Granata         const char* help_text = entry->help_function();
48382a7d983SEnrico Granata         if (!entry->help_function.self_formatting)
48482a7d983SEnrico Granata         {
48582a7d983SEnrico Granata             interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", help_text,
486e139cf23SCaroline Tice                                                  name_str.GetSize());
48782a7d983SEnrico Granata         }
48882a7d983SEnrico Granata         else
48982a7d983SEnrico Granata         {
49082a7d983SEnrico Granata             interpreter.OutputHelpText(str, name_str.GetData(), "--", help_text,
49182a7d983SEnrico Granata                                        name_str.GetSize());
49282a7d983SEnrico Granata         }
49382a7d983SEnrico Granata     }
494e139cf23SCaroline Tice     else
495e139cf23SCaroline Tice         interpreter.OutputFormattedHelpText (str, name_str.GetData(), "--", entry->help_text, name_str.GetSize());
496e139cf23SCaroline Tice }
497e139cf23SCaroline Tice 
498e139cf23SCaroline Tice const char *
499e139cf23SCaroline Tice CommandObject::GetArgumentName (CommandArgumentType arg_type)
500e139cf23SCaroline Tice {
501deaab222SCaroline Tice     ArgumentTableEntry *entry = (ArgumentTableEntry *) &(CommandObject::GetArgumentTable()[arg_type]);
502deaab222SCaroline Tice 
503deaab222SCaroline Tice     // The table is *supposed* to be kept in arg_type order, but someone *could* have messed it up...
504deaab222SCaroline Tice 
505deaab222SCaroline Tice     if (entry->arg_type != arg_type)
506deaab222SCaroline Tice         entry = CommandObject::FindArgumentDataByType (arg_type);
507deaab222SCaroline Tice 
508e6acf355SJohnny Chen     if (entry)
509deaab222SCaroline Tice         return entry->arg_name;
510e6acf355SJohnny Chen 
511e6acf355SJohnny Chen     StreamString str;
512e6acf355SJohnny Chen     str << "Arg name for type (" << arg_type << ") not in arg table!";
513e6acf355SJohnny Chen     return str.GetData();
514e139cf23SCaroline Tice }
515e139cf23SCaroline Tice 
516405fe67fSCaroline Tice bool
517e0d378b3SGreg Clayton CommandObject::IsPairType (ArgumentRepetitionType arg_repeat_type)
518405fe67fSCaroline Tice {
519405fe67fSCaroline Tice     if ((arg_repeat_type == eArgRepeatPairPlain)
520405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairOptional)
521405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairPlus)
522405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairStar)
523405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRange)
524405fe67fSCaroline Tice         ||  (arg_repeat_type == eArgRepeatPairRangeOptional))
525405fe67fSCaroline Tice         return true;
526405fe67fSCaroline Tice 
527405fe67fSCaroline Tice     return false;
528405fe67fSCaroline Tice }
529405fe67fSCaroline Tice 
53034ddc8dbSJohnny Chen static CommandObject::CommandArgumentEntry
53134ddc8dbSJohnny Chen OptSetFiltered(uint32_t opt_set_mask, CommandObject::CommandArgumentEntry &cmd_arg_entry)
53234ddc8dbSJohnny Chen {
53334ddc8dbSJohnny Chen     CommandObject::CommandArgumentEntry ret_val;
53434ddc8dbSJohnny Chen     for (unsigned i = 0; i < cmd_arg_entry.size(); ++i)
53534ddc8dbSJohnny Chen         if (opt_set_mask & cmd_arg_entry[i].arg_opt_set_association)
53634ddc8dbSJohnny Chen             ret_val.push_back(cmd_arg_entry[i]);
53734ddc8dbSJohnny Chen     return ret_val;
53834ddc8dbSJohnny Chen }
53934ddc8dbSJohnny Chen 
54034ddc8dbSJohnny Chen // Default parameter value of opt_set_mask is LLDB_OPT_SET_ALL, which means take
54134ddc8dbSJohnny Chen // all the argument data into account.  On rare cases where some argument sticks
54234ddc8dbSJohnny Chen // with certain option sets, this function returns the option set filtered args.
543e139cf23SCaroline Tice void
54434ddc8dbSJohnny Chen CommandObject::GetFormattedCommandArguments (Stream &str, uint32_t opt_set_mask)
545e139cf23SCaroline Tice {
546e139cf23SCaroline Tice     int num_args = m_arguments.size();
547e139cf23SCaroline Tice     for (int i = 0; i < num_args; ++i)
548e139cf23SCaroline Tice     {
549e139cf23SCaroline Tice         if (i > 0)
550e139cf23SCaroline Tice             str.Printf (" ");
55134ddc8dbSJohnny Chen         CommandArgumentEntry arg_entry =
55234ddc8dbSJohnny Chen             opt_set_mask == LLDB_OPT_SET_ALL ? m_arguments[i]
55334ddc8dbSJohnny Chen                                              : OptSetFiltered(opt_set_mask, m_arguments[i]);
554e139cf23SCaroline Tice         int num_alternatives = arg_entry.size();
555405fe67fSCaroline Tice 
556405fe67fSCaroline Tice         if ((num_alternatives == 2)
557405fe67fSCaroline Tice             && IsPairType (arg_entry[0].arg_repetition))
558405fe67fSCaroline Tice         {
559405fe67fSCaroline Tice             const char *first_name = GetArgumentName (arg_entry[0].arg_type);
560405fe67fSCaroline Tice             const char *second_name = GetArgumentName (arg_entry[1].arg_type);
561405fe67fSCaroline Tice             switch (arg_entry[0].arg_repetition)
562405fe67fSCaroline Tice             {
563405fe67fSCaroline Tice                 case eArgRepeatPairPlain:
564405fe67fSCaroline Tice                     str.Printf ("<%s> <%s>", first_name, second_name);
565405fe67fSCaroline Tice                     break;
566405fe67fSCaroline Tice                 case eArgRepeatPairOptional:
567405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s>]", first_name, second_name);
568405fe67fSCaroline Tice                     break;
569405fe67fSCaroline Tice                 case eArgRepeatPairPlus:
570405fe67fSCaroline Tice                     str.Printf ("<%s> <%s> [<%s> <%s> [...]]", first_name, second_name, first_name, second_name);
571405fe67fSCaroline Tice                     break;
572405fe67fSCaroline Tice                 case eArgRepeatPairStar:
573405fe67fSCaroline Tice                     str.Printf ("[<%s> <%s> [<%s> <%s> [...]]]", first_name, second_name, first_name, second_name);
574405fe67fSCaroline Tice                     break;
575405fe67fSCaroline Tice                 case eArgRepeatPairRange:
576405fe67fSCaroline Tice                     str.Printf ("<%s_1> <%s_1> ... <%s_n> <%s_n>", first_name, second_name, first_name, second_name);
577405fe67fSCaroline Tice                     break;
578405fe67fSCaroline Tice                 case eArgRepeatPairRangeOptional:
579405fe67fSCaroline Tice                     str.Printf ("[<%s_1> <%s_1> ... <%s_n> <%s_n>]", first_name, second_name, first_name, second_name);
580405fe67fSCaroline Tice                     break;
581ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
582ca1176aaSCaroline Tice                 // missing case statement(s).
583ca1176aaSCaroline Tice                 case eArgRepeatPlain:
584ca1176aaSCaroline Tice                 case eArgRepeatOptional:
585ca1176aaSCaroline Tice                 case eArgRepeatPlus:
586ca1176aaSCaroline Tice                 case eArgRepeatStar:
587ca1176aaSCaroline Tice                 case eArgRepeatRange:
588ca1176aaSCaroline Tice                     // These should not be reached, as they should fail the IsPairType test above.
589ca1176aaSCaroline Tice                     break;
590405fe67fSCaroline Tice             }
591405fe67fSCaroline Tice         }
592405fe67fSCaroline Tice         else
593405fe67fSCaroline Tice         {
594e139cf23SCaroline Tice             StreamString names;
595e139cf23SCaroline Tice             for (int j = 0; j < num_alternatives; ++j)
596e139cf23SCaroline Tice             {
597e139cf23SCaroline Tice                 if (j > 0)
598e139cf23SCaroline Tice                     names.Printf (" | ");
599e139cf23SCaroline Tice                 names.Printf ("%s", GetArgumentName (arg_entry[j].arg_type));
600e139cf23SCaroline Tice             }
601e139cf23SCaroline Tice             switch (arg_entry[0].arg_repetition)
602e139cf23SCaroline Tice             {
603e139cf23SCaroline Tice                 case eArgRepeatPlain:
604e139cf23SCaroline Tice                     str.Printf ("<%s>", names.GetData());
605e139cf23SCaroline Tice                     break;
606e139cf23SCaroline Tice                 case eArgRepeatPlus:
607e139cf23SCaroline Tice                     str.Printf ("<%s> [<%s> [...]]", names.GetData(), names.GetData());
608e139cf23SCaroline Tice                     break;
609e139cf23SCaroline Tice                 case eArgRepeatStar:
610e139cf23SCaroline Tice                     str.Printf ("[<%s> [<%s> [...]]]", names.GetData(), names.GetData());
611e139cf23SCaroline Tice                     break;
612e139cf23SCaroline Tice                 case eArgRepeatOptional:
613e139cf23SCaroline Tice                     str.Printf ("[<%s>]", names.GetData());
614e139cf23SCaroline Tice                     break;
615405fe67fSCaroline Tice                 case eArgRepeatRange:
616fd54b368SJason Molenda                     str.Printf ("<%s_1> .. <%s_n>", names.GetData(), names.GetData());
617ca1176aaSCaroline Tice                     break;
618ca1176aaSCaroline Tice                 // Explicitly test for all the rest of the cases, so if new types get added we will notice the
619ca1176aaSCaroline Tice                 // missing case statement(s).
620ca1176aaSCaroline Tice                 case eArgRepeatPairPlain:
621ca1176aaSCaroline Tice                 case eArgRepeatPairOptional:
622ca1176aaSCaroline Tice                 case eArgRepeatPairPlus:
623ca1176aaSCaroline Tice                 case eArgRepeatPairStar:
624ca1176aaSCaroline Tice                 case eArgRepeatPairRange:
625ca1176aaSCaroline Tice                 case eArgRepeatPairRangeOptional:
626ca1176aaSCaroline Tice                     // These should not be hit, as they should pass the IsPairType test above, and control should
627ca1176aaSCaroline Tice                     // have gone into the other branch of the if statement.
628ca1176aaSCaroline Tice                     break;
629405fe67fSCaroline Tice             }
630e139cf23SCaroline Tice         }
631e139cf23SCaroline Tice     }
632e139cf23SCaroline Tice }
633e139cf23SCaroline Tice 
6340c16aa6dSStephen Wilson CommandArgumentType
635e139cf23SCaroline Tice CommandObject::LookupArgumentName (const char *arg_name)
636e139cf23SCaroline Tice {
637e139cf23SCaroline Tice     CommandArgumentType return_type = eArgTypeLastArg;
638e139cf23SCaroline Tice 
639e139cf23SCaroline Tice     std::string arg_name_str (arg_name);
640e139cf23SCaroline Tice     size_t len = arg_name_str.length();
641e139cf23SCaroline Tice     if (arg_name[0] == '<'
642e139cf23SCaroline Tice         && arg_name[len-1] == '>')
643e139cf23SCaroline Tice         arg_name_str = arg_name_str.substr (1, len-2);
644e139cf23SCaroline Tice 
645331eff39SJohnny Chen     const ArgumentTableEntry *table = GetArgumentTable();
646e139cf23SCaroline Tice     for (int i = 0; i < eArgTypeLastArg; ++i)
647331eff39SJohnny Chen         if (arg_name_str.compare (table[i].arg_name) == 0)
648e139cf23SCaroline Tice             return_type = g_arguments_data[i].arg_type;
649e139cf23SCaroline Tice 
650e139cf23SCaroline Tice     return return_type;
651e139cf23SCaroline Tice }
652e139cf23SCaroline Tice 
653e139cf23SCaroline Tice static const char *
654e139cf23SCaroline Tice BreakpointIDHelpTextCallback ()
655e139cf23SCaroline Tice {
65686edbf41SGreg Clayton     return "Breakpoint ID's consist major and minor numbers;  the major number "
65786edbf41SGreg Clayton     "corresponds to the single entity that was created with a 'breakpoint set' "
65886edbf41SGreg Clayton     "command; the minor numbers correspond to all the locations that were actually "
65986edbf41SGreg Clayton     "found/set based on the major breakpoint.  A full breakpoint ID might look like "
66086edbf41SGreg Clayton     "3.14, meaning the 14th location set for the 3rd breakpoint.  You can specify "
66186edbf41SGreg Clayton     "all the locations of a breakpoint by just indicating the major breakpoint "
66286edbf41SGreg Clayton     "number. A valid breakpoint id consists either of just the major id number, "
66386edbf41SGreg Clayton     "or the major number, a dot, and the location number (e.g. 3 or 3.2 could "
66486edbf41SGreg Clayton     "both be valid breakpoint ids).";
665e139cf23SCaroline Tice }
666e139cf23SCaroline Tice 
667e139cf23SCaroline Tice static const char *
668e139cf23SCaroline Tice BreakpointIDRangeHelpTextCallback ()
669e139cf23SCaroline Tice {
67086edbf41SGreg Clayton     return "A 'breakpoint id list' is a manner of specifying multiple breakpoints. "
67186edbf41SGreg Clayton     "This can be done  through several mechanisms.  The easiest way is to just "
67286edbf41SGreg Clayton     "enter a space-separated list of breakpoint ids.  To specify all the "
67386edbf41SGreg Clayton     "breakpoint locations under a major breakpoint, you can use the major "
67486edbf41SGreg Clayton     "breakpoint number followed by '.*', eg. '5.*' means all the locations under "
67586edbf41SGreg Clayton     "breakpoint 5.  You can also indicate a range of breakpoints by using "
67686edbf41SGreg Clayton     "<start-bp-id> - <end-bp-id>.  The start-bp-id and end-bp-id for a range can "
67786edbf41SGreg Clayton     "be any valid breakpoint ids.  It is not legal, however, to specify a range "
67886edbf41SGreg Clayton     "using specific locations that cross major breakpoint numbers.  I.e. 3.2 - 3.7"
67986edbf41SGreg Clayton     " is legal; 2 - 5 is legal; but 3.2 - 4.4 is not legal.";
68086edbf41SGreg Clayton }
68186edbf41SGreg Clayton 
68286edbf41SGreg Clayton static const char *
68386edbf41SGreg Clayton GDBFormatHelpTextCallback ()
68486edbf41SGreg Clayton {
685f91381e8SGreg Clayton     return "A GDB format consists of a repeat count, a format letter and a size letter. "
686f91381e8SGreg Clayton     "The repeat count is optional and defaults to 1. The format letter is optional "
687f91381e8SGreg Clayton     "and defaults to the previous format that was used. The size letter is optional "
688f91381e8SGreg Clayton     "and defaults to the previous size that was used.\n"
689f91381e8SGreg Clayton     "\n"
690f91381e8SGreg Clayton     "Format letters include:\n"
691f91381e8SGreg Clayton     "o - octal\n"
692f91381e8SGreg Clayton     "x - hexadecimal\n"
693f91381e8SGreg Clayton     "d - decimal\n"
694f91381e8SGreg Clayton     "u - unsigned decimal\n"
695f91381e8SGreg Clayton     "t - binary\n"
696f91381e8SGreg Clayton     "f - float\n"
697f91381e8SGreg Clayton     "a - address\n"
698f91381e8SGreg Clayton     "i - instruction\n"
699f91381e8SGreg Clayton     "c - char\n"
700f91381e8SGreg Clayton     "s - string\n"
701f91381e8SGreg Clayton     "T - OSType\n"
702f91381e8SGreg Clayton     "A - float as hex\n"
703f91381e8SGreg Clayton     "\n"
704f91381e8SGreg Clayton     "Size letters include:\n"
705f91381e8SGreg Clayton     "b - 1 byte  (byte)\n"
706f91381e8SGreg Clayton     "h - 2 bytes (halfword)\n"
707f91381e8SGreg Clayton     "w - 4 bytes (word)\n"
708f91381e8SGreg Clayton     "g - 8 bytes (giant)\n"
709f91381e8SGreg Clayton     "\n"
710f91381e8SGreg Clayton     "Example formats:\n"
711f91381e8SGreg Clayton     "32xb - show 32 1 byte hexadecimal integer values\n"
712f91381e8SGreg Clayton     "16xh - show 16 2 byte hexadecimal integer values\n"
713f91381e8SGreg Clayton     "64   - show 64 2 byte hexadecimal integer values (format and size from the last format)\n"
714f91381e8SGreg Clayton     "dw   - show 1 4 byte decimal integer value\n"
715f91381e8SGreg Clayton     ;
716e139cf23SCaroline Tice }
717e139cf23SCaroline Tice 
7180a3958e0SEnrico Granata static const char *
7190a3958e0SEnrico Granata FormatHelpTextCallback ()
7200a3958e0SEnrico Granata {
72182a7d983SEnrico Granata 
72282a7d983SEnrico Granata     static char* help_text_ptr = NULL;
72382a7d983SEnrico Granata 
72482a7d983SEnrico Granata     if (help_text_ptr)
72582a7d983SEnrico Granata         return help_text_ptr;
72682a7d983SEnrico Granata 
7270a3958e0SEnrico Granata     StreamString sstr;
7280a3958e0SEnrico Granata     sstr << "One of the format names (or one-character names) that can be used to show a variable's value:\n";
7290a3958e0SEnrico Granata     for (Format f = eFormatDefault; f < kNumFormats; f = Format(f+1))
7300a3958e0SEnrico Granata     {
73182a7d983SEnrico Granata         if (f != eFormatDefault)
73282a7d983SEnrico Granata             sstr.PutChar('\n');
73382a7d983SEnrico Granata 
7340a3958e0SEnrico Granata         char format_char = FormatManager::GetFormatAsFormatChar(f);
7350a3958e0SEnrico Granata         if (format_char)
7360a3958e0SEnrico Granata             sstr.Printf("'%c' or ", format_char);
7370a3958e0SEnrico Granata 
73882a7d983SEnrico Granata         sstr.Printf ("\"%s\"", FormatManager::GetFormatAsCString(f));
7390a3958e0SEnrico Granata     }
7400a3958e0SEnrico Granata 
7410a3958e0SEnrico Granata     sstr.Flush();
7420a3958e0SEnrico Granata 
7430a3958e0SEnrico Granata     std::string data = sstr.GetString();
7440a3958e0SEnrico Granata 
74582a7d983SEnrico Granata     help_text_ptr = new char[data.length()+1];
7460a3958e0SEnrico Granata 
74782a7d983SEnrico Granata     data.copy(help_text_ptr, data.length());
7480a3958e0SEnrico Granata 
74982a7d983SEnrico Granata     return help_text_ptr;
7500a3958e0SEnrico Granata }
7510a3958e0SEnrico Granata 
7520a3958e0SEnrico Granata static const char *
75382a7d983SEnrico Granata SummaryStringHelpTextCallback()
7540a3958e0SEnrico Granata {
75582a7d983SEnrico Granata     return
75682a7d983SEnrico Granata         "A summary string is a way to extract information from variables in order to present them using a summary.\n"
75782a7d983SEnrico Granata         "Summary strings contain static text, variables, scopes and control sequences:\n"
75882a7d983SEnrico Granata         "  - Static text can be any sequence of non-special characters, i.e. anything but '{', '}', '$', or '\\'.\n"
75982a7d983SEnrico Granata         "  - Variables are sequences of characters beginning with ${, ending with } and that contain symbols in the format described below.\n"
76082a7d983SEnrico 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"
76182a7d983SEnrico Granata         "  - Control sequences are the usual C/C++ '\\a', '\\n', ..., plus '\\$', '\\{' and '\\}'.\n"
76282a7d983SEnrico 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"
76382a7d983SEnrico 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"
76482a7d983SEnrico 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"
76582a7d983SEnrico 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"
7669128ee2fSEnrico 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."
7679128ee2fSEnrico 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"
76882a7d983SEnrico 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."
76982a7d983SEnrico 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"
77082a7d983SEnrico Granata         " path refers to:\n"
77182a7d983SEnrico 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"
77282a7d983SEnrico Granata         " and displayed as an individual variable\n"
77382a7d983SEnrico 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"
77482a7d983SEnrico 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"
7759128ee2fSEnrico 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"
7769128ee2fSEnrico 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"
7779128ee2fSEnrico Granata         " special symbols only allowed as part of a variable:\n"
7789128ee2fSEnrico Granata         "    %V: show the value of the object by default\n"
7799128ee2fSEnrico Granata         "    %S: show the summary of the object by default\n"
7809128ee2fSEnrico Granata         "    %@: show the runtime-provided object description (for Objective-C, it calls NSPrintForDebugger; for C/C++ it does nothing)\n"
7819128ee2fSEnrico Granata         "    %L: show the location of the object (memory address or a register name)\n"
7829128ee2fSEnrico Granata         "    %#: show the number of children of the object\n"
7839128ee2fSEnrico Granata         "    %T: show the type of the object\n"
7849128ee2fSEnrico 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"
7859128ee2fSEnrico 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"
7869128ee2fSEnrico Granata         " count the number of actual elements stored in an std::list:\n"
7879128ee2fSEnrico Granata         "type summary add -s \"${svar%#}\" -x \"std::list<\"";
7889128ee2fSEnrico Granata }
7899128ee2fSEnrico Granata 
7909128ee2fSEnrico Granata static const char *
7919128ee2fSEnrico Granata ExprPathHelpTextCallback()
7929128ee2fSEnrico Granata {
7939128ee2fSEnrico Granata     return
7949128ee2fSEnrico 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"
7959128ee2fSEnrico Granata     "For instance, given a class:\n"
7969128ee2fSEnrico Granata     "  class foo {\n"
7979128ee2fSEnrico Granata     "      int a;\n"
7989128ee2fSEnrico Granata     "      int b; .\n"
7999128ee2fSEnrico Granata     "      foo* next;\n"
8009128ee2fSEnrico Granata     "  };\n"
8019128ee2fSEnrico Granata     "the expression to read item b in the item pointed to by next for foo aFoo would be aFoo.next->b.\n"
8029128ee2fSEnrico 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"
8039128ee2fSEnrico 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"
8049128ee2fSEnrico Granata     "The meaning of these operators is the same as the usual one given to them by the C/C++ standards.\n"
8059128ee2fSEnrico 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"
8069128ee2fSEnrico 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"
8079128ee2fSEnrico 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"
8089128ee2fSEnrico 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"
8099128ee2fSEnrico Granata     " meaning of array slicing (taking elements n thru m inside the array or pointed-to memory).";
8100a3958e0SEnrico Granata }
8110a3958e0SEnrico Granata 
812184d7a72SJohnny Chen void
813de753464SJohnny Chen CommandObject::AddIDsArgumentData(CommandArgumentEntry &arg, CommandArgumentType ID, CommandArgumentType IDRange)
814184d7a72SJohnny Chen {
815184d7a72SJohnny Chen     CommandArgumentData id_arg;
816184d7a72SJohnny Chen     CommandArgumentData id_range_arg;
817184d7a72SJohnny Chen 
818184d7a72SJohnny Chen     // Create the first variant for the first (and only) argument for this command.
819de753464SJohnny Chen     id_arg.arg_type = ID;
820184d7a72SJohnny Chen     id_arg.arg_repetition = eArgRepeatOptional;
821184d7a72SJohnny Chen 
822184d7a72SJohnny Chen     // Create the second variant for the first (and only) argument for this command.
823de753464SJohnny Chen     id_range_arg.arg_type = IDRange;
824184d7a72SJohnny Chen     id_range_arg.arg_repetition = eArgRepeatOptional;
825184d7a72SJohnny Chen 
826a3234732SJohnny Chen     // The first (and only) argument for this command could be either an id or an id_range.
827184d7a72SJohnny Chen     // Push both variants into the entry for the first argument for this command.
828184d7a72SJohnny Chen     arg.push_back(id_arg);
829184d7a72SJohnny Chen     arg.push_back(id_range_arg);
830184d7a72SJohnny Chen }
831184d7a72SJohnny Chen 
8329d0402b1SGreg Clayton const char *
8339d0402b1SGreg Clayton CommandObject::GetArgumentTypeAsCString (const lldb::CommandArgumentType arg_type)
8349d0402b1SGreg Clayton {
8359d0402b1SGreg Clayton     if (arg_type >=0 && arg_type < eArgTypeLastArg)
8369d0402b1SGreg Clayton         return g_arguments_data[arg_type].arg_name;
8379d0402b1SGreg Clayton     return NULL;
8389d0402b1SGreg Clayton 
8399d0402b1SGreg Clayton }
8409d0402b1SGreg Clayton 
8419d0402b1SGreg Clayton const char *
8429d0402b1SGreg Clayton CommandObject::GetArgumentDescriptionAsCString (const lldb::CommandArgumentType arg_type)
8439d0402b1SGreg Clayton {
8449d0402b1SGreg Clayton     if (arg_type >=0 && arg_type < eArgTypeLastArg)
8459d0402b1SGreg Clayton         return g_arguments_data[arg_type].help_text;
8469d0402b1SGreg Clayton     return NULL;
8479d0402b1SGreg Clayton }
8489d0402b1SGreg Clayton 
849ca7835c6SJohnny Chen static
850ca7835c6SJohnny Chen const char *arch_helper()
851ca7835c6SJohnny Chen {
852*d70b14eaSGreg Clayton     static StreamString g_archs_help;
853*d70b14eaSGreg Clayton     if (g_archs_help.GetData() == NULL)
854*d70b14eaSGreg Clayton     {
855ca7835c6SJohnny Chen         StringList archs;
856ca7835c6SJohnny Chen         ArchSpec::AutoComplete(NULL, archs);
857*d70b14eaSGreg Clayton         g_archs_help.Printf("These are the supported architecture names:\n");
858*d70b14eaSGreg Clayton         archs.Join("%s\n", g_archs_help);
859*d70b14eaSGreg Clayton     }
860*d70b14eaSGreg Clayton     return g_archs_help.GetData();
861ca7835c6SJohnny Chen }
862ca7835c6SJohnny Chen 
863e139cf23SCaroline Tice CommandObject::ArgumentTableEntry
864e139cf23SCaroline Tice CommandObject::g_arguments_data[] =
865e139cf23SCaroline Tice {
8667f941d95SEnrico Granata     { eArgTypeAddress, "address", CommandCompletions::eNoCompletion, { NULL, false }, "A valid address in the target program's execution space." },
8677f941d95SEnrico Granata     { eArgTypeAliasName, "alias-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of an abbreviation (alias) for a debugger command." },
8687f941d95SEnrico 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.)" },
869ca7835c6SJohnny Chen     { eArgTypeArchitecture, "arch", CommandCompletions::eArchitectureCompletion, { arch_helper, true }, "The architecture name, e.g. i386 or x86_64." },
8707f941d95SEnrico Granata     { eArgTypeBoolean, "boolean", CommandCompletions::eNoCompletion, { NULL, false }, "A Boolean value: 'true' or 'false'" },
8717f941d95SEnrico Granata     { eArgTypeBreakpointID, "breakpt-id", CommandCompletions::eNoCompletion, { BreakpointIDHelpTextCallback, false }, NULL },
8727f941d95SEnrico Granata     { eArgTypeBreakpointIDRange, "breakpt-id-list", CommandCompletions::eNoCompletion, { BreakpointIDRangeHelpTextCallback, false }, NULL },
8737f941d95SEnrico Granata     { eArgTypeByteSize, "byte-size", CommandCompletions::eNoCompletion, { NULL, false }, "Number of bytes to use." },
8747f941d95SEnrico Granata     { eArgTypeClassName, "class-name", CommandCompletions::eNoCompletion, { NULL, false }, "Then name of a class from the debug information in the program." },
8757f941d95SEnrico Granata     { eArgTypeCommandName, "cmd-name", CommandCompletions::eNoCompletion, { NULL, false }, "A debugger command (may be multiple words), without any options or arguments." },
8767f941d95SEnrico Granata     { eArgTypeCount, "count", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." },
8777f941d95SEnrico Granata     { eArgTypeEndAddress, "end-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
8787f941d95SEnrico Granata     { eArgTypeExpression, "expr", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
8799128ee2fSEnrico Granata     { eArgTypeExpressionPath, "expr-path", CommandCompletions::eNoCompletion, { ExprPathHelpTextCallback, true }, NULL },
8807f941d95SEnrico 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] ]" },
8817f941d95SEnrico Granata     { eArgTypeFilename, "filename", CommandCompletions::eDiskFileCompletion, { NULL, false }, "The name of a file (can include path)." },
8827f941d95SEnrico Granata     { eArgTypeFormat, "format", CommandCompletions::eNoCompletion, { FormatHelpTextCallback, true }, NULL },
8837f941d95SEnrico Granata     { eArgTypeFrameIndex, "frame-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into a thread's list of frames." },
8847f941d95SEnrico Granata     { eArgTypeFullName, "fullname", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
8857f941d95SEnrico Granata     { eArgTypeFunctionName, "function-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a function." },
88686edbf41SGreg Clayton     { eArgTypeGDBFormat, "gdb-format", CommandCompletions::eNoCompletion, { GDBFormatHelpTextCallback, true }, NULL },
8877f941d95SEnrico Granata     { eArgTypeIndex, "index", CommandCompletions::eNoCompletion, { NULL, false }, "An index into a list." },
888fab10e89SJim Ingham     { eArgTypeLanguage, "language", CommandCompletions::eNoCompletion, { NULL, false }, "A source language name." },
8897f941d95SEnrico Granata     { eArgTypeLineNum, "linenum", CommandCompletions::eNoCompletion, { NULL, false }, "Line number in a source file." },
8907f941d95SEnrico 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." },
8917f941d95SEnrico 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)." },
8927f941d95SEnrico Granata     { eArgTypeMethod, "method", CommandCompletions::eNoCompletion, { NULL, false }, "A C++ method name." },
8937f941d95SEnrico Granata     { eArgTypeName, "name", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
8947f941d95SEnrico Granata     { eArgTypeNewPathPrefix, "new-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
8957f941d95SEnrico Granata     { eArgTypeNumLines, "num-lines", CommandCompletions::eNoCompletion, { NULL, false }, "The number of lines to use." },
8967f941d95SEnrico Granata     { eArgTypeNumberPerLine, "number-per-line", CommandCompletions::eNoCompletion, { NULL, false }, "The number of items per line to display." },
8977f941d95SEnrico Granata     { eArgTypeOffset, "offset", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
8987f941d95SEnrico Granata     { eArgTypeOldPathPrefix, "old-path-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
8997f941d95SEnrico Granata     { eArgTypeOneLiner, "one-line-command", CommandCompletions::eNoCompletion, { NULL, false }, "A command that is entered as a single line of text." },
9007f941d95SEnrico Granata     { eArgTypePath, "path", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
9017f941d95SEnrico Granata     { eArgTypePid, "pid", CommandCompletions::eNoCompletion, { NULL, false }, "The process ID number." },
9027f941d95SEnrico Granata     { eArgTypePlugin, "plugin", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
9037f941d95SEnrico Granata     { eArgTypeProcessName, "process-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the process." },
9049128ee2fSEnrico Granata     { eArgTypePythonClass, "python-class", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python class." },
9059128ee2fSEnrico Granata     { eArgTypePythonFunction, "python-function", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a Python function." },
9069128ee2fSEnrico Granata     { eArgTypePythonScript, "python-script", CommandCompletions::eNoCompletion, { NULL, false }, "Source code written in Python." },
9077f941d95SEnrico Granata     { eArgTypeQueueName, "queue-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of the thread queue." },
9087f941d95SEnrico Granata     { eArgTypeRegisterName, "register-name", CommandCompletions::eNoCompletion, { NULL, false }, "A register name." },
9097f941d95SEnrico Granata     { eArgTypeRegularExpression, "regular-expression", CommandCompletions::eNoCompletion, { NULL, false }, "A regular expression." },
9107f941d95SEnrico Granata     { eArgTypeRunArgs, "run-args", CommandCompletions::eNoCompletion, { NULL, false }, "Arguments to be passed to the target program when it starts executing." },
9117f941d95SEnrico Granata     { eArgTypeRunMode, "run-mode", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
9120a305db7SEnrico Granata     { eArgTypeScriptedCommandSynchronicity, "script-cmd-synchronicity", CommandCompletions::eNoCompletion, { NULL, false }, "The synchronicity to use to run scripted commands with regard to LLDB event system." },
9137f941d95SEnrico Granata     { eArgTypeScriptLang, "script-language", CommandCompletions::eNoCompletion, { NULL, false }, "The scripting language to be used for script-based commands.  Currently only Python is valid." },
9147f941d95SEnrico Granata     { eArgTypeSearchWord, "search-word", CommandCompletions::eNoCompletion, { NULL, false }, "The word for which you wish to search for information about." },
9157f941d95SEnrico Granata     { eArgTypeSelector, "selector", CommandCompletions::eNoCompletion, { NULL, false }, "An Objective-C selector name." },
9167f941d95SEnrico 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)." },
9177f941d95SEnrico 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)." },
9187f941d95SEnrico Granata     { eArgTypeSettingPrefix, "setting-prefix", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a settable internal debugger variable up to a dot ('.'), e.g. 'target.process.'" },
9197f941d95SEnrico 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." },
9207f941d95SEnrico Granata     { eArgTypeShlibName, "shlib-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a shared library." },
9217f941d95SEnrico Granata     { eArgTypeSourceFile, "source-file", CommandCompletions::eSourceFileCompletion, { NULL, false }, "The name of a source file.." },
9227f941d95SEnrico Granata     { eArgTypeSortOrder, "sort-order", CommandCompletions::eNoCompletion, { NULL, false }, "Specify a sort order when dumping lists." },
9237f941d95SEnrico Granata     { eArgTypeStartAddress, "start-address", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
9247f941d95SEnrico Granata     { eArgTypeSummaryString, "summary-string", CommandCompletions::eNoCompletion, { SummaryStringHelpTextCallback, true }, NULL },
9257f941d95SEnrico Granata     { eArgTypeSymbol, "symbol", CommandCompletions::eSymbolCompletion, { NULL, false }, "Any symbol name (function name, variable, argument, etc.)" },
9267f941d95SEnrico Granata     { eArgTypeThreadID, "thread-id", CommandCompletions::eNoCompletion, { NULL, false }, "Thread ID number." },
9277f941d95SEnrico Granata     { eArgTypeThreadIndex, "thread-index", CommandCompletions::eNoCompletion, { NULL, false }, "Index into the process' list of threads." },
9287f941d95SEnrico Granata     { eArgTypeThreadName, "thread-name", CommandCompletions::eNoCompletion, { NULL, false }, "The thread's name." },
929331eff39SJohnny Chen     { eArgTypeUnsignedInteger, "unsigned-integer", CommandCompletions::eNoCompletion, { NULL, false }, "An unsigned integer." },
9307f941d95SEnrico Granata     { eArgTypeUnixSignal, "unix-signal", CommandCompletions::eNoCompletion, { NULL, false }, "A valid Unix signal name or number (e.g. SIGKILL, KILL or 9)." },
9317f941d95SEnrico Granata     { eArgTypeVarName, "variable-name", CommandCompletions::eNoCompletion, { NULL, false }, "The name of a variable in your program." },
9327f941d95SEnrico Granata     { eArgTypeValue, "value", CommandCompletions::eNoCompletion, { NULL, false }, "A value could be anything, depending on where and how it is used." },
9337f941d95SEnrico Granata     { eArgTypeWidth, "width", CommandCompletions::eNoCompletion, { NULL, false }, "Help text goes here." },
9347f941d95SEnrico Granata     { eArgTypeNone, "none", CommandCompletions::eNoCompletion, { NULL, false }, "No help available for this." },
935b1d7529eSJohnny 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." },
936de753464SJohnny Chen     { eArgTypeWatchpointID, "watchpt-id", CommandCompletions::eNoCompletion, { NULL, false }, "Watchpoint IDs are positive integers." },
937de753464SJohnny Chen     { eArgTypeWatchpointIDRange, "watchpt-id-list", CommandCompletions::eNoCompletion, { NULL, false }, "For example, '1-3' or '1 to 3'." },
938887062aeSJohnny Chen     { eArgTypeWatchType, "watch-type", CommandCompletions::eNoCompletion, { NULL, false }, "Specify the type for a watchpoint." }
939e139cf23SCaroline Tice };
940e139cf23SCaroline Tice 
941e139cf23SCaroline Tice const CommandObject::ArgumentTableEntry*
942e139cf23SCaroline Tice CommandObject::GetArgumentTable ()
943e139cf23SCaroline Tice {
9449d0402b1SGreg Clayton     // If this assertion fires, then the table above is out of date with the CommandArgumentType enumeration
9459d0402b1SGreg Clayton     assert ((sizeof (CommandObject::g_arguments_data) / sizeof (CommandObject::ArgumentTableEntry)) == eArgTypeLastArg);
946e139cf23SCaroline Tice     return CommandObject::g_arguments_data;
947e139cf23SCaroline Tice }
948e139cf23SCaroline Tice 
949e139cf23SCaroline Tice 
950