1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | #include "lldb/lldb-python.h" |
11 | |
12 | #include "CommandObjectSyntax.h" |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | #include "lldb/Interpreter/Args.h" |
19 | #include "lldb/Interpreter/Options.h" |
20 | |
21 | #include "lldb/Interpreter/CommandInterpreter.h" |
22 | #include "lldb/Interpreter/CommandReturnObject.h" |
23 | #include "lldb/Interpreter/CommandObjectMultiword.h" |
24 | |
25 | using namespace lldb; |
26 | using namespace lldb_private; |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | CommandObjectSyntax::CommandObjectSyntax (CommandInterpreter &interpreter) : |
33 | CommandObjectParsed (interpreter, |
34 | "syntax", |
35 | "Shows the correct syntax for a given debugger command.", |
36 | "syntax <command>") |
37 | { |
38 | CommandArgumentEntry arg; |
39 | CommandArgumentData command_arg; |
40 | |
41 | |
42 | command_arg.arg_type = eArgTypeCommandName; |
43 | command_arg.arg_repetition = eArgRepeatPlain; |
44 | |
45 | |
46 | arg.push_back (command_arg); |
47 | |
48 | |
49 | m_arguments.push_back (arg); |
50 | } |
51 | |
52 | CommandObjectSyntax::~CommandObjectSyntax() |
53 | { |
54 | } |
55 | |
56 | |
57 | bool |
58 | CommandObjectSyntax::DoExecute (Args& command, CommandReturnObject &result) |
59 | { |
60 | CommandObject::CommandMap::iterator pos; |
61 | CommandObject *cmd_obj; |
62 | const size_t argc = command.GetArgumentCount(); |
63 | |
64 | if (argc > 0) |
| |
| |
65 | { |
66 | cmd_obj = m_interpreter.GetCommandObject (command.GetArgumentAtIndex(0)); |
67 | bool all_okay = true; |
68 | for (size_t i = 1; i < argc; ++i) |
| 3 | | Assuming 'i' is < 'argc' | |
|
| 4 | | Loop condition is true. Entering loop body | |
|
| 9 | | Assuming 'i' is < 'argc' | |
|
| 10 | | Loop condition is true. Entering loop body | |
|
69 | { |
70 | std::string sub_command = command.GetArgumentAtIndex (i); |
71 | if (!cmd_obj->IsMultiwordObject()) |
| |
| 11 | | Called C++ object pointer is null |
|
72 | all_okay = false; |
73 | else |
74 | { |
75 | cmd_obj = cmd_obj->GetSubcommandObject(sub_command.c_str()); |
| 6 | | Value assigned to 'cmd_obj' | |
|
76 | if (!cmd_obj) |
| 7 | | Assuming 'cmd_obj' is null | |
|
| |
77 | all_okay = false; |
78 | } |
79 | } |
80 | |
81 | if (all_okay && (cmd_obj != NULL__null)) |
82 | { |
83 | Stream &output_strm = result.GetOutputStream(); |
84 | if (cmd_obj->GetOptions() != NULL__null) |
85 | { |
86 | output_strm.Printf ("\nSyntax: %s\n", cmd_obj->GetSyntax()); |
87 | output_strm.Printf ("(Try 'help %s' for more information on command options syntax.)\n", |
88 | cmd_obj->GetCommandName()); |
89 | result.SetStatus (eReturnStatusSuccessFinishNoResult); |
90 | } |
91 | else |
92 | { |
93 | output_strm.Printf ("\nSyntax: %s\n", cmd_obj->GetSyntax()); |
94 | result.SetStatus (eReturnStatusSuccessFinishNoResult); |
95 | } |
96 | } |
97 | else |
98 | { |
99 | std::string cmd_string; |
100 | command.GetCommandString (cmd_string); |
101 | result.AppendErrorWithFormat ("'%s' is not a known command.\n", cmd_string.c_str()); |
102 | result.AppendError ("Try 'help' to see a current list of commands."); |
103 | result.SetStatus (eReturnStatusFailed); |
104 | } |
105 | } |
106 | else |
107 | { |
108 | result.AppendError ("Must call 'syntax' with a valid command."); |
109 | result.SetStatus (eReturnStatusFailed); |
110 | } |
111 | |
112 | return result.Succeeded(); |
113 | } |