1ebc09c36SJim Ingham //===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===//
2ebc09c36SJim Ingham //
3ebc09c36SJim Ingham //                     The LLVM Compiler Infrastructure
4ebc09c36SJim Ingham //
5ebc09c36SJim Ingham // This file is distributed under the University of Illinois Open Source
6ebc09c36SJim Ingham // License. See LICENSE.TXT for details.
7ebc09c36SJim Ingham //
8ebc09c36SJim Ingham //===----------------------------------------------------------------------===//
9ebc09c36SJim Ingham 
10ebc09c36SJim Ingham #include "CommandObjectCommands.h"
11ebc09c36SJim Ingham 
12ebc09c36SJim Ingham // C Includes
13ebc09c36SJim Ingham // C++ Includes
14ebc09c36SJim Ingham // Other libraries and framework includes
150e5e5a79SGreg Clayton #include "llvm/ADT/StringRef.h"
160e5e5a79SGreg Clayton 
17ebc09c36SJim Ingham // Project includes
18ebc09c36SJim Ingham #include "lldb/Core/Debugger.h"
19de164aaaSGreg Clayton #include "lldb/Core/InputReader.h"
20be93a35aSEnrico Granata #include "lldb/Core/InputReaderEZ.h"
21be93a35aSEnrico Granata #include "lldb/Core/StringList.h"
22de164aaaSGreg Clayton #include "lldb/Interpreter/Args.h"
23ebc09c36SJim Ingham #include "lldb/Interpreter/CommandInterpreter.h"
24de164aaaSGreg Clayton #include "lldb/Interpreter/CommandObjectRegexCommand.h"
25ebc09c36SJim Ingham #include "lldb/Interpreter/CommandReturnObject.h"
26ebc09c36SJim Ingham #include "lldb/Interpreter/Options.h"
2799f0b8f9SEnrico Granata #include "lldb/Interpreter/ScriptInterpreter.h"
2899f0b8f9SEnrico Granata #include "lldb/Interpreter/ScriptInterpreterPython.h"
29ebc09c36SJim Ingham 
30ebc09c36SJim Ingham using namespace lldb;
31ebc09c36SJim Ingham using namespace lldb_private;
32ebc09c36SJim Ingham 
33ebc09c36SJim Ingham //-------------------------------------------------------------------------
34ebc09c36SJim Ingham // CommandObjectCommandsSource
35ebc09c36SJim Ingham //-------------------------------------------------------------------------
36ebc09c36SJim Ingham 
37a5a97ebeSJim Ingham class CommandObjectCommandsHistory : public CommandObject
38a5a97ebeSJim Ingham {
39a5a97ebeSJim Ingham private:
40a5a97ebeSJim Ingham 
41a5a97ebeSJim Ingham     class CommandOptions : public Options
42a5a97ebeSJim Ingham     {
43a5a97ebeSJim Ingham     public:
44a5a97ebeSJim Ingham 
45a5a97ebeSJim Ingham         CommandOptions (CommandInterpreter &interpreter) :
46a5a97ebeSJim Ingham             Options (interpreter)
47a5a97ebeSJim Ingham         {
48a5a97ebeSJim Ingham         }
49a5a97ebeSJim Ingham 
50a5a97ebeSJim Ingham         virtual
51a5a97ebeSJim Ingham         ~CommandOptions (){}
52a5a97ebeSJim Ingham 
53a5a97ebeSJim Ingham         virtual Error
54a5a97ebeSJim Ingham         SetOptionValue (uint32_t option_idx, const char *option_arg)
55a5a97ebeSJim Ingham         {
56a5a97ebeSJim Ingham             Error error;
57a5a97ebeSJim Ingham             char short_option = (char) m_getopt_table[option_idx].val;
58a5a97ebeSJim Ingham             bool success;
59a5a97ebeSJim Ingham 
60a5a97ebeSJim Ingham             switch (short_option)
61a5a97ebeSJim Ingham             {
62a5a97ebeSJim Ingham                 case 'c':
63a5a97ebeSJim Ingham                     m_end_idx = Args::StringToUInt32(option_arg, UINT_MAX, 0, &success);
64a5a97ebeSJim Ingham                     if (!success)
6586edbf41SGreg Clayton                         error.SetErrorStringWithFormat("invalid value for count: %s", option_arg);
66a5a97ebeSJim Ingham                     if (m_end_idx != 0)
67a5a97ebeSJim Ingham                         m_end_idx--;
68a5a97ebeSJim Ingham                     m_start_idx = 0;
69a5a97ebeSJim Ingham                     break;
70a5a97ebeSJim Ingham                 case 'e':
71a5a97ebeSJim Ingham                     m_end_idx = Args::StringToUInt32(option_arg, 0, 0, &success);
72a5a97ebeSJim Ingham                     if (!success)
7386edbf41SGreg Clayton                         error.SetErrorStringWithFormat("invalid value for end index: %s", option_arg);
74a5a97ebeSJim Ingham                     break;
75a5a97ebeSJim Ingham                 case 's':
76a5a97ebeSJim Ingham                     m_start_idx = Args::StringToUInt32(option_arg, 0, 0, &success);
77a5a97ebeSJim Ingham                     if (!success)
7886edbf41SGreg Clayton                         error.SetErrorStringWithFormat("invalid value for start index: %s", option_arg);
79a5a97ebeSJim Ingham                     break;
80a5a97ebeSJim Ingham                 default:
8186edbf41SGreg Clayton                     error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
82a5a97ebeSJim Ingham                     break;
83a5a97ebeSJim Ingham             }
84a5a97ebeSJim Ingham 
85a5a97ebeSJim Ingham             return error;
86a5a97ebeSJim Ingham         }
87a5a97ebeSJim Ingham 
88a5a97ebeSJim Ingham         void
89a5a97ebeSJim Ingham         OptionParsingStarting ()
90a5a97ebeSJim Ingham         {
91a5a97ebeSJim Ingham             m_start_idx = 0;
92a5a97ebeSJim Ingham             m_end_idx = UINT_MAX;
93a5a97ebeSJim Ingham         }
94a5a97ebeSJim Ingham 
95a5a97ebeSJim Ingham         const OptionDefinition*
96a5a97ebeSJim Ingham         GetDefinitions ()
97a5a97ebeSJim Ingham         {
98a5a97ebeSJim Ingham             return g_option_table;
99a5a97ebeSJim Ingham         }
100a5a97ebeSJim Ingham 
101a5a97ebeSJim Ingham         // Options table: Required for subclasses of Options.
102a5a97ebeSJim Ingham 
103a5a97ebeSJim Ingham         static OptionDefinition g_option_table[];
104a5a97ebeSJim Ingham 
105a5a97ebeSJim Ingham         // Instance variables to hold the values for command options.
106a5a97ebeSJim Ingham 
107a5a97ebeSJim Ingham         uint32_t m_start_idx;
108a5a97ebeSJim Ingham         uint32_t m_end_idx;
109a5a97ebeSJim Ingham     };
110a5a97ebeSJim Ingham 
111a5a97ebeSJim Ingham     CommandOptions m_options;
112a5a97ebeSJim Ingham 
113a5a97ebeSJim Ingham     virtual Options *
114a5a97ebeSJim Ingham     GetOptions ()
115a5a97ebeSJim Ingham     {
116a5a97ebeSJim Ingham         return &m_options;
117a5a97ebeSJim Ingham     }
118a5a97ebeSJim Ingham 
119a5a97ebeSJim Ingham public:
120a5a97ebeSJim Ingham     CommandObjectCommandsHistory(CommandInterpreter &interpreter) :
121a5a97ebeSJim Ingham         CommandObject (interpreter,
122a5a97ebeSJim Ingham                        "command history",
123a5a97ebeSJim Ingham                        "Dump the history of commands in this session.",
124a5a97ebeSJim Ingham                        NULL),
125a5a97ebeSJim Ingham         m_options (interpreter)
126a5a97ebeSJim Ingham     {
127a5a97ebeSJim Ingham     }
128a5a97ebeSJim Ingham 
129a5a97ebeSJim Ingham     ~CommandObjectCommandsHistory ()
130a5a97ebeSJim Ingham     {
131a5a97ebeSJim Ingham     }
132a5a97ebeSJim Ingham 
133a5a97ebeSJim Ingham     bool
134a5a97ebeSJim Ingham     Execute
135a5a97ebeSJim Ingham     (
136a5a97ebeSJim Ingham         Args& args,
137a5a97ebeSJim Ingham         CommandReturnObject &result
138a5a97ebeSJim Ingham     )
139a5a97ebeSJim Ingham     {
140a5a97ebeSJim Ingham 
141a5a97ebeSJim Ingham         m_interpreter.DumpHistory (result.GetOutputStream(),
142a5a97ebeSJim Ingham                                    m_options.m_start_idx,
143a5a97ebeSJim Ingham                                    m_options.m_end_idx);
144a5a97ebeSJim Ingham         return result.Succeeded();
145a5a97ebeSJim Ingham 
146a5a97ebeSJim Ingham     }
147a5a97ebeSJim Ingham };
148a5a97ebeSJim Ingham 
149a5a97ebeSJim Ingham OptionDefinition
150a5a97ebeSJim Ingham CommandObjectCommandsHistory::CommandOptions::g_option_table[] =
151a5a97ebeSJim Ingham {
152a5a97ebeSJim Ingham { LLDB_OPT_SET_1, false, "count", 'c', required_argument, NULL, 0, eArgTypeUnsignedInteger,        "How many history commands to print."},
153a5a97ebeSJim Ingham { LLDB_OPT_SET_1, false, "start-index", 's', required_argument, NULL, 0, eArgTypeUnsignedInteger,  "Index at which to start printing history commands."},
154a5a97ebeSJim Ingham { LLDB_OPT_SET_1, false, "end-index", 'e', required_argument, NULL, 0, eArgTypeUnsignedInteger,    "Index at which to stop printing history commands."},
155a5a97ebeSJim Ingham { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
156a5a97ebeSJim Ingham };
157a5a97ebeSJim Ingham 
158a5a97ebeSJim Ingham 
159a5a97ebeSJim Ingham //-------------------------------------------------------------------------
160a5a97ebeSJim Ingham // CommandObjectCommandsSource
161a5a97ebeSJim Ingham //-------------------------------------------------------------------------
162a5a97ebeSJim Ingham 
163ebc09c36SJim Ingham class CommandObjectCommandsSource : public CommandObject
164ebc09c36SJim Ingham {
165e16c50a1SJim Ingham private:
166e16c50a1SJim Ingham 
167e16c50a1SJim Ingham     class CommandOptions : public Options
168e16c50a1SJim Ingham     {
169e16c50a1SJim Ingham     public:
170e16c50a1SJim Ingham 
171eb0103f2SGreg Clayton         CommandOptions (CommandInterpreter &interpreter) :
172eb0103f2SGreg Clayton             Options (interpreter)
173eb0103f2SGreg Clayton         {
174eb0103f2SGreg Clayton         }
175e16c50a1SJim Ingham 
176e16c50a1SJim Ingham         virtual
177e16c50a1SJim Ingham         ~CommandOptions (){}
178e16c50a1SJim Ingham 
179e16c50a1SJim Ingham         virtual Error
180f6b8b581SGreg Clayton         SetOptionValue (uint32_t option_idx, const char *option_arg)
181e16c50a1SJim Ingham         {
182e16c50a1SJim Ingham             Error error;
183e16c50a1SJim Ingham             char short_option = (char) m_getopt_table[option_idx].val;
184e16c50a1SJim Ingham             bool success;
185e16c50a1SJim Ingham 
186e16c50a1SJim Ingham             switch (short_option)
187e16c50a1SJim Ingham             {
188e16c50a1SJim Ingham                 case 'e':
189e16c50a1SJim Ingham                     m_stop_on_error = Args::StringToBoolean(option_arg, true, &success);
190e16c50a1SJim Ingham                     if (!success)
19186edbf41SGreg Clayton                         error.SetErrorStringWithFormat("invalid value for stop-on-error: %s", option_arg);
192e16c50a1SJim Ingham                     break;
193e16c50a1SJim Ingham                 case 'c':
194e16c50a1SJim Ingham                     m_stop_on_continue = Args::StringToBoolean(option_arg, true, &success);
195e16c50a1SJim Ingham                     if (!success)
19686edbf41SGreg Clayton                         error.SetErrorStringWithFormat("invalid value for stop-on-continue: %s", option_arg);
197e16c50a1SJim Ingham                     break;
198e16c50a1SJim Ingham                 default:
19986edbf41SGreg Clayton                     error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
200e16c50a1SJim Ingham                     break;
201e16c50a1SJim Ingham             }
202e16c50a1SJim Ingham 
203e16c50a1SJim Ingham             return error;
204e16c50a1SJim Ingham         }
205e16c50a1SJim Ingham 
206e16c50a1SJim Ingham         void
207f6b8b581SGreg Clayton         OptionParsingStarting ()
208e16c50a1SJim Ingham         {
209e16c50a1SJim Ingham             m_stop_on_error = true;
210e16c50a1SJim Ingham             m_stop_on_continue = true;
211e16c50a1SJim Ingham         }
212e16c50a1SJim Ingham 
213e0d378b3SGreg Clayton         const OptionDefinition*
214e16c50a1SJim Ingham         GetDefinitions ()
215e16c50a1SJim Ingham         {
216e16c50a1SJim Ingham             return g_option_table;
217e16c50a1SJim Ingham         }
218e16c50a1SJim Ingham 
219e16c50a1SJim Ingham         // Options table: Required for subclasses of Options.
220e16c50a1SJim Ingham 
221e0d378b3SGreg Clayton         static OptionDefinition g_option_table[];
222e16c50a1SJim Ingham 
223e16c50a1SJim Ingham         // Instance variables to hold the values for command options.
224e16c50a1SJim Ingham 
225e16c50a1SJim Ingham         bool m_stop_on_error;
226e16c50a1SJim Ingham         bool m_stop_on_continue;
227e16c50a1SJim Ingham     };
228e16c50a1SJim Ingham 
229e16c50a1SJim Ingham     CommandOptions m_options;
230e16c50a1SJim Ingham 
231e16c50a1SJim Ingham     virtual Options *
232e16c50a1SJim Ingham     GetOptions ()
233e16c50a1SJim Ingham     {
234e16c50a1SJim Ingham         return &m_options;
235e16c50a1SJim Ingham     }
236e16c50a1SJim Ingham 
237ebc09c36SJim Ingham public:
238a7015092SGreg Clayton     CommandObjectCommandsSource(CommandInterpreter &interpreter) :
239a7015092SGreg Clayton         CommandObject (interpreter,
2400e5e5a79SGreg Clayton                        "command source",
241e3d26315SCaroline Tice                        "Read in debugger commands from the file <filename> and execute them.",
242eb0103f2SGreg Clayton                        NULL),
243eb0103f2SGreg Clayton         m_options (interpreter)
244ebc09c36SJim Ingham     {
245405fe67fSCaroline Tice         CommandArgumentEntry arg;
246405fe67fSCaroline Tice         CommandArgumentData file_arg;
247405fe67fSCaroline Tice 
248405fe67fSCaroline Tice         // Define the first (and only) variant of this arg.
249405fe67fSCaroline Tice         file_arg.arg_type = eArgTypeFilename;
250405fe67fSCaroline Tice         file_arg.arg_repetition = eArgRepeatPlain;
251405fe67fSCaroline Tice 
252405fe67fSCaroline Tice         // There is only one variant this argument could be; put it into the argument entry.
253405fe67fSCaroline Tice         arg.push_back (file_arg);
254405fe67fSCaroline Tice 
255405fe67fSCaroline Tice         // Push the data for the first argument into the m_arguments vector.
256405fe67fSCaroline Tice         m_arguments.push_back (arg);
257ebc09c36SJim Ingham     }
258ebc09c36SJim Ingham 
259ebc09c36SJim Ingham     ~CommandObjectCommandsSource ()
260ebc09c36SJim Ingham     {
261ebc09c36SJim Ingham     }
262ebc09c36SJim Ingham 
263ebc09c36SJim Ingham     bool
264ebc09c36SJim Ingham     Execute
265ebc09c36SJim Ingham     (
266ebc09c36SJim Ingham         Args& args,
267ebc09c36SJim Ingham         CommandReturnObject &result
268ebc09c36SJim Ingham     )
269ebc09c36SJim Ingham     {
270ebc09c36SJim Ingham         const int argc = args.GetArgumentCount();
271ebc09c36SJim Ingham         if (argc == 1)
272ebc09c36SJim Ingham         {
273ebc09c36SJim Ingham             const char *filename = args.GetArgumentAtIndex(0);
274ebc09c36SJim Ingham 
275ebc09c36SJim Ingham             result.AppendMessageWithFormat ("Executing commands in '%s'.\n", filename);
276ebc09c36SJim Ingham 
2771ee3853fSJohnny Chen             FileSpec cmd_file (filename, true);
278e16c50a1SJim Ingham             ExecutionContext *exe_ctx = NULL;  // Just use the default context.
279e16c50a1SJim Ingham             bool echo_commands    = true;
280e16c50a1SJim Ingham             bool print_results    = true;
281ebc09c36SJim Ingham 
282e16c50a1SJim Ingham             m_interpreter.HandleCommandsFromFile (cmd_file,
283e16c50a1SJim Ingham                                                   exe_ctx,
284e16c50a1SJim Ingham                                                   m_options.m_stop_on_continue,
285e16c50a1SJim Ingham                                                   m_options.m_stop_on_error,
286e16c50a1SJim Ingham                                                   echo_commands,
287e16c50a1SJim Ingham                                                   print_results,
288*5f5ab602SEnrico Granata                                                   eLazyBoolCalculate,
289e16c50a1SJim Ingham                                                   result);
290ebc09c36SJim Ingham         }
291ebc09c36SJim Ingham         else
292ebc09c36SJim Ingham         {
293ebc09c36SJim Ingham             result.AppendErrorWithFormat("'%s' takes exactly one executable filename argument.\n", GetCommandName());
294ebc09c36SJim Ingham             result.SetStatus (eReturnStatusFailed);
295ebc09c36SJim Ingham         }
296ebc09c36SJim Ingham         return result.Succeeded();
297ebc09c36SJim Ingham 
298ebc09c36SJim Ingham     }
299*5f5ab602SEnrico Granata 
300*5f5ab602SEnrico Granata     virtual const char*
301*5f5ab602SEnrico Granata     GetRepeatCommand (Args &current_command_args, uint32_t index)
302*5f5ab602SEnrico Granata     {
303*5f5ab602SEnrico Granata         return "";
304*5f5ab602SEnrico Granata     }
305*5f5ab602SEnrico Granata 
306*5f5ab602SEnrico Granata     int
307*5f5ab602SEnrico Granata     HandleArgumentCompletion (Args &input,
308*5f5ab602SEnrico Granata                               int &cursor_index,
309*5f5ab602SEnrico Granata                               int &cursor_char_position,
310*5f5ab602SEnrico Granata                               OptionElementVector &opt_element_vector,
311*5f5ab602SEnrico Granata                               int match_start_point,
312*5f5ab602SEnrico Granata                               int max_return_elements,
313*5f5ab602SEnrico Granata                               bool &word_complete,
314*5f5ab602SEnrico Granata                               StringList &matches)
315*5f5ab602SEnrico Granata     {
316*5f5ab602SEnrico Granata         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
317*5f5ab602SEnrico Granata         completion_str.erase (cursor_char_position);
318*5f5ab602SEnrico Granata 
319*5f5ab602SEnrico Granata         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
320*5f5ab602SEnrico Granata                                                              CommandCompletions::eDiskFileCompletion,
321*5f5ab602SEnrico Granata                                                              completion_str.c_str(),
322*5f5ab602SEnrico Granata                                                              match_start_point,
323*5f5ab602SEnrico Granata                                                              max_return_elements,
324*5f5ab602SEnrico Granata                                                              NULL,
325*5f5ab602SEnrico Granata                                                              word_complete,
326*5f5ab602SEnrico Granata                                                              matches);
327*5f5ab602SEnrico Granata         return matches.GetSize();
328*5f5ab602SEnrico Granata     }
329ebc09c36SJim Ingham };
330ebc09c36SJim Ingham 
331e0d378b3SGreg Clayton OptionDefinition
332e16c50a1SJim Ingham CommandObjectCommandsSource::CommandOptions::g_option_table[] =
333e16c50a1SJim Ingham {
334e16c50a1SJim Ingham { LLDB_OPT_SET_ALL, false, "stop-on-error", 'e', required_argument, NULL, 0, eArgTypeBoolean,    "If true, stop executing commands on error."},
335e16c50a1SJim Ingham { LLDB_OPT_SET_ALL, false, "stop-on-continue", 'c', required_argument, NULL, 0, eArgTypeBoolean, "If true, stop executing commands on continue."},
336e16c50a1SJim Ingham { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
337e16c50a1SJim Ingham };
338e16c50a1SJim Ingham 
339ebc09c36SJim Ingham #pragma mark CommandObjectCommandsAlias
340ebc09c36SJim Ingham //-------------------------------------------------------------------------
341ebc09c36SJim Ingham // CommandObjectCommandsAlias
342ebc09c36SJim Ingham //-------------------------------------------------------------------------
343ebc09c36SJim Ingham 
344be93a35aSEnrico Granata static const char *g_python_command_instructions =   "Enter your Python command(s). Type 'DONE' to end.\n"
345be93a35aSEnrico Granata                                                      "You must define a Python function with this signature:\n"
346223383edSEnrico Granata                                                      "def my_command_impl(debugger, args, result, dict):";
347be93a35aSEnrico Granata 
348be93a35aSEnrico Granata 
349ebc09c36SJim Ingham class CommandObjectCommandsAlias : public CommandObject
350ebc09c36SJim Ingham {
351be93a35aSEnrico Granata 
352be93a35aSEnrico Granata 
353ebc09c36SJim Ingham public:
354a7015092SGreg Clayton     CommandObjectCommandsAlias (CommandInterpreter &interpreter) :
355a7015092SGreg Clayton         CommandObject (interpreter,
3560e5e5a79SGreg Clayton                        "command alias",
357e3d26315SCaroline Tice                        "Allow users to define their own debugger command abbreviations.",
358405fe67fSCaroline Tice                        NULL)
359ebc09c36SJim Ingham     {
360ebc09c36SJim Ingham         SetHelpLong(
361ebc09c36SJim Ingham     "'alias' allows the user to create a short-cut or abbreviation for long \n\
362ebc09c36SJim Ingham     commands, multi-word commands, and commands that take particular options. \n\
363ebc09c36SJim Ingham     Below are some simple examples of how one might use the 'alias' command: \n\
36469c12ccbSJason Molenda     \n    'command alias sc script'            // Creates the abbreviation 'sc' for the 'script' \n\
365ebc09c36SJim Ingham                                          // command. \n\
36669c12ccbSJason Molenda     'command alias bp breakpoint'        // Creates the abbreviation 'bp' for the 'breakpoint' \n\
367ebc09c36SJim Ingham                                          // command.  Since breakpoint commands are two-word \n\
368ebc09c36SJim Ingham                                          // commands, the user will still need to enter the \n\
369ebc09c36SJim Ingham                                          // second word after 'bp', e.g. 'bp enable' or \n\
370ebc09c36SJim Ingham                                          // 'bp delete'. \n\
37169c12ccbSJason Molenda     'command alias bpl breakpoint list'  // Creates the abbreviation 'bpl' for the \n\
372ebc09c36SJim Ingham                                          // two-word command 'breakpoint list'. \n\
373ebc09c36SJim Ingham     \nAn alias can include some options for the command, with the values either \n\
374ebc09c36SJim Ingham     filled in at the time the alias is created, or specified as positional \n\
375ebc09c36SJim Ingham     arguments, to be filled in when the alias is invoked.  The following example \n\
376ebc09c36SJim Ingham     shows how to create aliases with options: \n\
377ebc09c36SJim Ingham     \n\
37869c12ccbSJason Molenda     'command alias bfl breakpoint set -f %1 -l %2' \n\
379ebc09c36SJim Ingham     \nThis creates the abbreviation 'bfl' (for break-file-line), with the -f and -l \n\
380ebc09c36SJim Ingham     options already part of the alias.  So if the user wants to set a breakpoint \n\
381ebc09c36SJim Ingham     by file and line without explicitly having to use the -f and -l options, the \n\
382ebc09c36SJim Ingham     user can now use 'bfl' instead.  The '%1' and '%2' are positional placeholders \n\
383ebc09c36SJim Ingham     for the actual arguments that will be passed when the alias command is used. \n\
384ebc09c36SJim Ingham     The number in the placeholder refers to the position/order the actual value \n\
38581ded935SJim Ingham     occupies when the alias is used.  All the occurrences of '%1' in the alias \n\
386ebc09c36SJim Ingham     will be replaced with the first argument, all the occurrences of '%2' in the \n\
387ebc09c36SJim Ingham     alias will be replaced with the second argument, and so on.  This also allows \n\
388ebc09c36SJim Ingham     actual arguments to be used multiple times within an alias (see 'process \n\
38981ded935SJim Ingham     launch' example below).  \n\
39081ded935SJim Ingham     Note: the positional arguments must substitute as whole words in the resultant\n\
39181ded935SJim Ingham     command, so you can't at present do something like:\n\
39281ded935SJim Ingham     \n\
39369c12ccbSJason Molenda     command alias bcppfl breakpoint set -f %1.cpp -l %2\n\
39481ded935SJim Ingham     \n\
39581ded935SJim Ingham     to get the file extension \".cpp\" automatically appended.  For more complex\n\
39681ded935SJim Ingham     aliasing, use the \"command regex\" command instead.\n\
39781ded935SJim Ingham     \nSo in the 'bfl' case, the actual file value will be \n\
398ebc09c36SJim Ingham     filled in with the first argument following 'bfl' and the actual line number \n\
399ebc09c36SJim Ingham     value will be filled in with the second argument.  The user would use this \n\
400ebc09c36SJim Ingham     alias as follows: \n\
40169c12ccbSJason Molenda     \n    (lldb)  command alias bfl breakpoint set -f %1 -l %2 \n\
402ebc09c36SJim Ingham     <... some time later ...> \n\
40309799af6SCaroline Tice     (lldb)  bfl my-file.c 137 \n\
404ebc09c36SJim Ingham     \nThis would be the same as if the user had entered \n\
405ebc09c36SJim Ingham     'breakpoint set -f my-file.c -l 137'. \n\
406ebc09c36SJim Ingham     \nAnother example: \n\
40769c12ccbSJason Molenda     \n    (lldb)  command alias pltty  process launch -s -o %1 -e %1 \n\
40809799af6SCaroline Tice     (lldb)  pltty /dev/tty0 \n\
409ebc09c36SJim Ingham            // becomes 'process launch -s -o /dev/tty0 -e /dev/tty0' \n\
410ebc09c36SJim Ingham     \nIf the user always wanted to pass the same value to a particular option, the \n\
411ebc09c36SJim Ingham     alias could be defined with that value directly in the alias as a constant, \n\
412ebc09c36SJim Ingham     rather than using a positional placeholder: \n\
41369c12ccbSJason Molenda     \n    command alias bl3  breakpoint set -f %1 -l 3  // Always sets a breakpoint on line \n\
414ebc09c36SJim Ingham                                                    // 3 of whatever file is indicated. \n");
415ebc09c36SJim Ingham 
416405fe67fSCaroline Tice         CommandArgumentEntry arg1;
417405fe67fSCaroline Tice         CommandArgumentEntry arg2;
418405fe67fSCaroline Tice         CommandArgumentEntry arg3;
419405fe67fSCaroline Tice         CommandArgumentData alias_arg;
420405fe67fSCaroline Tice         CommandArgumentData cmd_arg;
421405fe67fSCaroline Tice         CommandArgumentData options_arg;
422405fe67fSCaroline Tice 
423405fe67fSCaroline Tice         // Define the first (and only) variant of this arg.
424405fe67fSCaroline Tice         alias_arg.arg_type = eArgTypeAliasName;
425405fe67fSCaroline Tice         alias_arg.arg_repetition = eArgRepeatPlain;
426405fe67fSCaroline Tice 
427405fe67fSCaroline Tice         // There is only one variant this argument could be; put it into the argument entry.
428405fe67fSCaroline Tice         arg1.push_back (alias_arg);
429405fe67fSCaroline Tice 
430405fe67fSCaroline Tice         // Define the first (and only) variant of this arg.
431405fe67fSCaroline Tice         cmd_arg.arg_type = eArgTypeCommandName;
432405fe67fSCaroline Tice         cmd_arg.arg_repetition = eArgRepeatPlain;
433405fe67fSCaroline Tice 
434405fe67fSCaroline Tice         // There is only one variant this argument could be; put it into the argument entry.
435405fe67fSCaroline Tice         arg2.push_back (cmd_arg);
436405fe67fSCaroline Tice 
437405fe67fSCaroline Tice         // Define the first (and only) variant of this arg.
438405fe67fSCaroline Tice         options_arg.arg_type = eArgTypeAliasOptions;
439405fe67fSCaroline Tice         options_arg.arg_repetition = eArgRepeatOptional;
440405fe67fSCaroline Tice 
441405fe67fSCaroline Tice         // There is only one variant this argument could be; put it into the argument entry.
442405fe67fSCaroline Tice         arg3.push_back (options_arg);
443405fe67fSCaroline Tice 
444405fe67fSCaroline Tice         // Push the data for the first argument into the m_arguments vector.
445405fe67fSCaroline Tice         m_arguments.push_back (arg1);
446405fe67fSCaroline Tice         m_arguments.push_back (arg2);
447405fe67fSCaroline Tice         m_arguments.push_back (arg3);
448ebc09c36SJim Ingham     }
449ebc09c36SJim Ingham 
450ebc09c36SJim Ingham     ~CommandObjectCommandsAlias ()
451ebc09c36SJim Ingham     {
452ebc09c36SJim Ingham     }
453ebc09c36SJim Ingham 
454844d2303SCaroline Tice     bool
455844d2303SCaroline Tice     WantsRawCommandString ()
456844d2303SCaroline Tice     {
457844d2303SCaroline Tice         return true;
458844d2303SCaroline Tice     }
459844d2303SCaroline Tice 
460844d2303SCaroline Tice     bool
461844d2303SCaroline Tice     ExecuteRawCommandString (const char *raw_command_line, CommandReturnObject &result)
462844d2303SCaroline Tice     {
463844d2303SCaroline Tice         Args args (raw_command_line);
464844d2303SCaroline Tice         std::string raw_command_string (raw_command_line);
465844d2303SCaroline Tice 
466844d2303SCaroline Tice         size_t argc = args.GetArgumentCount();
467844d2303SCaroline Tice 
468844d2303SCaroline Tice         if (argc < 2)
469844d2303SCaroline Tice         {
470844d2303SCaroline Tice             result.AppendError ("'alias' requires at least two arguments");
471844d2303SCaroline Tice             result.SetStatus (eReturnStatusFailed);
472844d2303SCaroline Tice             return false;
473844d2303SCaroline Tice         }
474844d2303SCaroline Tice 
475844d2303SCaroline Tice         // Get the alias command.
476844d2303SCaroline Tice 
477844d2303SCaroline Tice         const std::string alias_command = args.GetArgumentAtIndex (0);
478844d2303SCaroline Tice 
479844d2303SCaroline Tice         // Strip the new alias name off 'raw_command_string'  (leave it on args, which gets passed to 'Execute', which
480844d2303SCaroline Tice         // does the stripping itself.
481844d2303SCaroline Tice         size_t pos = raw_command_string.find (alias_command);
482844d2303SCaroline Tice         if (pos == 0)
483844d2303SCaroline Tice         {
484844d2303SCaroline Tice             raw_command_string = raw_command_string.substr (alias_command.size());
485844d2303SCaroline Tice             pos = raw_command_string.find_first_not_of (' ');
486844d2303SCaroline Tice             if ((pos != std::string::npos) && (pos > 0))
487844d2303SCaroline Tice                 raw_command_string = raw_command_string.substr (pos);
488844d2303SCaroline Tice         }
489844d2303SCaroline Tice         else
490844d2303SCaroline Tice         {
491844d2303SCaroline Tice             result.AppendError ("Error parsing command string.  No alias created.");
492844d2303SCaroline Tice             result.SetStatus (eReturnStatusFailed);
493844d2303SCaroline Tice             return false;
494844d2303SCaroline Tice         }
495844d2303SCaroline Tice 
496844d2303SCaroline Tice 
497844d2303SCaroline Tice         // Verify that the command is alias-able.
498844d2303SCaroline Tice         if (m_interpreter.CommandExists (alias_command.c_str()))
499844d2303SCaroline Tice         {
500844d2303SCaroline Tice             result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n",
501844d2303SCaroline Tice                                           alias_command.c_str());
502844d2303SCaroline Tice             result.SetStatus (eReturnStatusFailed);
503844d2303SCaroline Tice             return false;
504844d2303SCaroline Tice         }
505844d2303SCaroline Tice 
506844d2303SCaroline Tice         // Get CommandObject that is being aliased. The command name is read from the front of raw_command_string.
507844d2303SCaroline Tice         // raw_command_string is returned with the name of the command object stripped off the front.
508844d2303SCaroline Tice         CommandObject *cmd_obj = m_interpreter.GetCommandObjectForCommand (raw_command_string);
509844d2303SCaroline Tice 
510844d2303SCaroline Tice         if (!cmd_obj)
511844d2303SCaroline Tice         {
51286edbf41SGreg Clayton             result.AppendErrorWithFormat ("invalid command given to 'alias'. '%s' does not begin with a valid command."
513844d2303SCaroline Tice                                           "  No alias created.", raw_command_string.c_str());
514844d2303SCaroline Tice             result.SetStatus (eReturnStatusFailed);
515844d2303SCaroline Tice             return false;
516844d2303SCaroline Tice         }
517844d2303SCaroline Tice         else if (!cmd_obj->WantsRawCommandString ())
518844d2303SCaroline Tice         {
519844d2303SCaroline Tice             // Note that args was initialized with the original command, and has not been updated to this point.
520844d2303SCaroline Tice             // Therefore can we pass it to the version of Execute that does not need/expect raw input in the alias.
521844d2303SCaroline Tice             return Execute (args, result);
522844d2303SCaroline Tice         }
523844d2303SCaroline Tice         else
524844d2303SCaroline Tice         {
525844d2303SCaroline Tice             // Verify & handle any options/arguments passed to the alias command
526844d2303SCaroline Tice 
527844d2303SCaroline Tice             OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector);
528844d2303SCaroline Tice             OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
529844d2303SCaroline Tice 
530ca90c47eSCaroline Tice             CommandObjectSP cmd_obj_sp = m_interpreter.GetCommandSPExact (cmd_obj->GetCommandName(), false);
531844d2303SCaroline Tice 
532ca90c47eSCaroline Tice             if (!m_interpreter.ProcessAliasOptionsArgs (cmd_obj_sp, raw_command_string.c_str(), option_arg_vector_sp))
533844d2303SCaroline Tice             {
534844d2303SCaroline Tice                 result.AppendError ("Unable to create requested alias.\n");
535ca90c47eSCaroline Tice                 result.SetStatus (eReturnStatusFailed);
536844d2303SCaroline Tice                 return false;
537844d2303SCaroline Tice             }
538844d2303SCaroline Tice 
539844d2303SCaroline Tice             // Create the alias
540844d2303SCaroline Tice             if (m_interpreter.AliasExists (alias_command.c_str())
541844d2303SCaroline Tice                 || m_interpreter.UserCommandExists (alias_command.c_str()))
542844d2303SCaroline Tice             {
543844d2303SCaroline Tice                 OptionArgVectorSP temp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str()));
544844d2303SCaroline Tice                 if (temp_option_arg_sp.get())
545844d2303SCaroline Tice                 {
546844d2303SCaroline Tice                     if (option_arg_vector->size() == 0)
547844d2303SCaroline Tice                         m_interpreter.RemoveAliasOptions (alias_command.c_str());
548844d2303SCaroline Tice                 }
549844d2303SCaroline Tice                 result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n",
550844d2303SCaroline Tice                                                 alias_command.c_str());
551844d2303SCaroline Tice             }
552844d2303SCaroline Tice 
553472362e6SCaroline Tice             if (cmd_obj_sp)
554472362e6SCaroline Tice             {
555844d2303SCaroline Tice                 m_interpreter.AddAlias (alias_command.c_str(), cmd_obj_sp);
556844d2303SCaroline Tice                 if (option_arg_vector->size() > 0)
557844d2303SCaroline Tice                     m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp);
558844d2303SCaroline Tice                 result.SetStatus (eReturnStatusSuccessFinishNoResult);
559844d2303SCaroline Tice             }
560472362e6SCaroline Tice             else
561472362e6SCaroline Tice             {
562472362e6SCaroline Tice                 result.AppendError ("Unable to create requested alias.\n");
563472362e6SCaroline Tice                 result.SetStatus (eReturnStatusFailed);
564472362e6SCaroline Tice             }
565472362e6SCaroline Tice         }
566844d2303SCaroline Tice         return result.Succeeded();
567844d2303SCaroline Tice     }
568ebc09c36SJim Ingham 
569ebc09c36SJim Ingham     bool
570ebc09c36SJim Ingham     Execute
571ebc09c36SJim Ingham     (
572ebc09c36SJim Ingham         Args& args,
573ebc09c36SJim Ingham         CommandReturnObject &result
574ebc09c36SJim Ingham     )
575ebc09c36SJim Ingham     {
576867b185dSCaroline Tice         size_t argc = args.GetArgumentCount();
577ebc09c36SJim Ingham 
578ebc09c36SJim Ingham         if (argc < 2)
579ebc09c36SJim Ingham         {
580ebc09c36SJim Ingham             result.AppendError ("'alias' requires at least two arguments");
581ebc09c36SJim Ingham             result.SetStatus (eReturnStatusFailed);
582ebc09c36SJim Ingham             return false;
583ebc09c36SJim Ingham         }
584ebc09c36SJim Ingham 
585ebc09c36SJim Ingham         const std::string alias_command = args.GetArgumentAtIndex(0);
586ebc09c36SJim Ingham         const std::string actual_command = args.GetArgumentAtIndex(1);
587ebc09c36SJim Ingham 
588ebc09c36SJim Ingham         args.Shift();  // Shift the alias command word off the argument vector.
589ebc09c36SJim Ingham         args.Shift();  // Shift the old command word off the argument vector.
590ebc09c36SJim Ingham 
591ebc09c36SJim Ingham         // Verify that the command is alias'able, and get the appropriate command object.
592ebc09c36SJim Ingham 
593a7015092SGreg Clayton         if (m_interpreter.CommandExists (alias_command.c_str()))
594ebc09c36SJim Ingham         {
595ebc09c36SJim Ingham             result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n",
596ebc09c36SJim Ingham                                          alias_command.c_str());
597ebc09c36SJim Ingham             result.SetStatus (eReturnStatusFailed);
598ebc09c36SJim Ingham         }
599ebc09c36SJim Ingham         else
600ebc09c36SJim Ingham         {
601a7015092SGreg Clayton              CommandObjectSP command_obj_sp(m_interpreter.GetCommandSPExact (actual_command.c_str(), true));
602ebc09c36SJim Ingham              CommandObjectSP subcommand_obj_sp;
603ebc09c36SJim Ingham              bool use_subcommand = false;
604ebc09c36SJim Ingham              if (command_obj_sp.get())
605ebc09c36SJim Ingham              {
606ebc09c36SJim Ingham                  CommandObject *cmd_obj = command_obj_sp.get();
607c982c768SGreg Clayton                  CommandObject *sub_cmd_obj = NULL;
608ebc09c36SJim Ingham                  OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector);
609ebc09c36SJim Ingham                  OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
610ebc09c36SJim Ingham 
611844d2303SCaroline Tice                  while (cmd_obj->IsMultiwordObject() && args.GetArgumentCount() > 0)
612ebc09c36SJim Ingham                  {
613ebc09c36SJim Ingham                      if (argc >= 3)
614ebc09c36SJim Ingham                      {
615ebc09c36SJim Ingham                          const std::string sub_command = args.GetArgumentAtIndex(0);
616ebc09c36SJim Ingham                          assert (sub_command.length() != 0);
617ebc09c36SJim Ingham                          subcommand_obj_sp =
618ebc09c36SJim Ingham                                            (((CommandObjectMultiword *) cmd_obj)->GetSubcommandSP (sub_command.c_str()));
619ebc09c36SJim Ingham                          if (subcommand_obj_sp.get())
620ebc09c36SJim Ingham                          {
621ebc09c36SJim Ingham                              sub_cmd_obj = subcommand_obj_sp.get();
622ebc09c36SJim Ingham                              use_subcommand = true;
623ebc09c36SJim Ingham                              args.Shift();  // Shift the sub_command word off the argument vector.
624844d2303SCaroline Tice                              cmd_obj = sub_cmd_obj;
625ebc09c36SJim Ingham                          }
626ebc09c36SJim Ingham                          else
627ebc09c36SJim Ingham                          {
628f415eeb4SCaroline Tice                              result.AppendErrorWithFormat("'%s' is not a valid sub-command of '%s'.  "
629f415eeb4SCaroline Tice                                                           "Unable to create alias.\n",
630f415eeb4SCaroline Tice                                                           sub_command.c_str(), actual_command.c_str());
631ebc09c36SJim Ingham                              result.SetStatus (eReturnStatusFailed);
632ebc09c36SJim Ingham                              return false;
633ebc09c36SJim Ingham                          }
634ebc09c36SJim Ingham                      }
635ebc09c36SJim Ingham                  }
636ebc09c36SJim Ingham 
637ebc09c36SJim Ingham                  // Verify & handle any options/arguments passed to the alias command
638ebc09c36SJim Ingham 
639ebc09c36SJim Ingham                  if (args.GetArgumentCount () > 0)
640ebc09c36SJim Ingham                  {
641ca90c47eSCaroline Tice                     CommandObjectSP tmp_sp = m_interpreter.GetCommandSPExact (cmd_obj->GetCommandName(), false);
642ebc09c36SJim Ingham                     if (use_subcommand)
643ca90c47eSCaroline Tice                         tmp_sp = m_interpreter.GetCommandSPExact (sub_cmd_obj->GetCommandName(), false);
644ca90c47eSCaroline Tice 
645ca90c47eSCaroline Tice                     std::string args_string;
646ca90c47eSCaroline Tice                     args.GetCommandString (args_string);
647ca90c47eSCaroline Tice 
648ca90c47eSCaroline Tice                     if (!m_interpreter.ProcessAliasOptionsArgs (tmp_sp, args_string.c_str(), option_arg_vector_sp))
649ebc09c36SJim Ingham                     {
650ca90c47eSCaroline Tice                         result.AppendError ("Unable to create requested alias.\n");
651ca90c47eSCaroline Tice                         result.SetStatus (eReturnStatusFailed);
652e7941795SCaroline Tice                         return false;
653867b185dSCaroline Tice                     }
654867b185dSCaroline Tice                  }
655867b185dSCaroline Tice 
656ebc09c36SJim Ingham                  // Create the alias.
657ebc09c36SJim Ingham 
658a7015092SGreg Clayton                  if (m_interpreter.AliasExists (alias_command.c_str())
659a7015092SGreg Clayton                      || m_interpreter.UserCommandExists (alias_command.c_str()))
660ebc09c36SJim Ingham                  {
661a7015092SGreg Clayton                      OptionArgVectorSP tmp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str()));
662ebc09c36SJim Ingham                      if (tmp_option_arg_sp.get())
663ebc09c36SJim Ingham                      {
664ebc09c36SJim Ingham                          if (option_arg_vector->size() == 0)
665a7015092SGreg Clayton                              m_interpreter.RemoveAliasOptions (alias_command.c_str());
666ebc09c36SJim Ingham                      }
667ebc09c36SJim Ingham                      result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n",
668ebc09c36SJim Ingham                                                      alias_command.c_str());
669ebc09c36SJim Ingham                  }
670ebc09c36SJim Ingham 
671ebc09c36SJim Ingham                  if (use_subcommand)
672a7015092SGreg Clayton                      m_interpreter.AddAlias (alias_command.c_str(), subcommand_obj_sp);
673ebc09c36SJim Ingham                  else
674a7015092SGreg Clayton                      m_interpreter.AddAlias (alias_command.c_str(), command_obj_sp);
675ebc09c36SJim Ingham                  if (option_arg_vector->size() > 0)
676a7015092SGreg Clayton                      m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp);
677ebc09c36SJim Ingham                  result.SetStatus (eReturnStatusSuccessFinishNoResult);
678ebc09c36SJim Ingham              }
679ebc09c36SJim Ingham              else
680ebc09c36SJim Ingham              {
681ebc09c36SJim Ingham                  result.AppendErrorWithFormat ("'%s' is not an existing command.\n", actual_command.c_str());
682ebc09c36SJim Ingham                  result.SetStatus (eReturnStatusFailed);
683e7941795SCaroline Tice                  return false;
684ebc09c36SJim Ingham              }
685ebc09c36SJim Ingham         }
686ebc09c36SJim Ingham 
687ebc09c36SJim Ingham         return result.Succeeded();
688ebc09c36SJim Ingham     }
689ebc09c36SJim Ingham };
690ebc09c36SJim Ingham 
691ebc09c36SJim Ingham #pragma mark CommandObjectCommandsUnalias
692ebc09c36SJim Ingham //-------------------------------------------------------------------------
693ebc09c36SJim Ingham // CommandObjectCommandsUnalias
694ebc09c36SJim Ingham //-------------------------------------------------------------------------
695ebc09c36SJim Ingham 
696ebc09c36SJim Ingham class CommandObjectCommandsUnalias : public CommandObject
697ebc09c36SJim Ingham {
698ebc09c36SJim Ingham public:
699a7015092SGreg Clayton     CommandObjectCommandsUnalias (CommandInterpreter &interpreter) :
700a7015092SGreg Clayton         CommandObject (interpreter,
7010e5e5a79SGreg Clayton                        "command unalias",
70286ddae50SCaroline Tice                        "Allow the user to remove/delete a user-defined command abbreviation.",
703405fe67fSCaroline Tice                        NULL)
704ebc09c36SJim Ingham     {
705405fe67fSCaroline Tice         CommandArgumentEntry arg;
706405fe67fSCaroline Tice         CommandArgumentData alias_arg;
707405fe67fSCaroline Tice 
708405fe67fSCaroline Tice         // Define the first (and only) variant of this arg.
709405fe67fSCaroline Tice         alias_arg.arg_type = eArgTypeAliasName;
710405fe67fSCaroline Tice         alias_arg.arg_repetition = eArgRepeatPlain;
711405fe67fSCaroline Tice 
712405fe67fSCaroline Tice         // There is only one variant this argument could be; put it into the argument entry.
713405fe67fSCaroline Tice         arg.push_back (alias_arg);
714405fe67fSCaroline Tice 
715405fe67fSCaroline Tice         // Push the data for the first argument into the m_arguments vector.
716405fe67fSCaroline Tice         m_arguments.push_back (arg);
717ebc09c36SJim Ingham     }
718ebc09c36SJim Ingham 
719ebc09c36SJim Ingham     ~CommandObjectCommandsUnalias()
720ebc09c36SJim Ingham     {
721ebc09c36SJim Ingham     }
722ebc09c36SJim Ingham 
723ebc09c36SJim Ingham 
724ebc09c36SJim Ingham     bool
725ebc09c36SJim Ingham     Execute
726ebc09c36SJim Ingham     (
727ebc09c36SJim Ingham         Args& args,
728ebc09c36SJim Ingham         CommandReturnObject &result
729ebc09c36SJim Ingham     )
730ebc09c36SJim Ingham     {
731ebc09c36SJim Ingham         CommandObject::CommandMap::iterator pos;
732ebc09c36SJim Ingham         CommandObject *cmd_obj;
733ebc09c36SJim Ingham 
734ebc09c36SJim Ingham         if (args.GetArgumentCount() != 0)
735ebc09c36SJim Ingham         {
736ebc09c36SJim Ingham             const char *command_name = args.GetArgumentAtIndex(0);
737a7015092SGreg Clayton             cmd_obj = m_interpreter.GetCommandObject(command_name);
738ebc09c36SJim Ingham             if (cmd_obj)
739ebc09c36SJim Ingham             {
740a7015092SGreg Clayton                 if (m_interpreter.CommandExists (command_name))
741ebc09c36SJim Ingham                 {
742ebc09c36SJim Ingham                     result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be removed.\n",
743ebc09c36SJim Ingham                                                   command_name);
744ebc09c36SJim Ingham                     result.SetStatus (eReturnStatusFailed);
745ebc09c36SJim Ingham                 }
746ebc09c36SJim Ingham                 else
747ebc09c36SJim Ingham                 {
748ebc09c36SJim Ingham 
749a7015092SGreg Clayton                     if (m_interpreter.RemoveAlias (command_name) == false)
750ebc09c36SJim Ingham                     {
751a7015092SGreg Clayton                         if (m_interpreter.AliasExists (command_name))
752ebc09c36SJim Ingham                             result.AppendErrorWithFormat ("Error occurred while attempting to unalias '%s'.\n",
753ebc09c36SJim Ingham                                                           command_name);
754ebc09c36SJim Ingham                         else
755ebc09c36SJim Ingham                             result.AppendErrorWithFormat ("'%s' is not an existing alias.\n", command_name);
756ebc09c36SJim Ingham                         result.SetStatus (eReturnStatusFailed);
757ebc09c36SJim Ingham                     }
758ebc09c36SJim Ingham                     else
759ebc09c36SJim Ingham                         result.SetStatus (eReturnStatusSuccessFinishNoResult);
760ebc09c36SJim Ingham                 }
761ebc09c36SJim Ingham             }
762ebc09c36SJim Ingham             else
763ebc09c36SJim Ingham             {
764ebc09c36SJim Ingham                 result.AppendErrorWithFormat ("'%s' is not a known command.\nTry 'help' to see a "
765ebc09c36SJim Ingham                                               "current list of commands.\n",
766ebc09c36SJim Ingham                                              command_name);
767ebc09c36SJim Ingham                 result.SetStatus (eReturnStatusFailed);
768ebc09c36SJim Ingham             }
769ebc09c36SJim Ingham         }
770ebc09c36SJim Ingham         else
771ebc09c36SJim Ingham         {
772ebc09c36SJim Ingham             result.AppendError ("must call 'unalias' with a valid alias");
773ebc09c36SJim Ingham             result.SetStatus (eReturnStatusFailed);
774ebc09c36SJim Ingham         }
775ebc09c36SJim Ingham 
776ebc09c36SJim Ingham         return result.Succeeded();
777ebc09c36SJim Ingham     }
778ebc09c36SJim Ingham };
779ebc09c36SJim Ingham 
780de164aaaSGreg Clayton #pragma mark CommandObjectCommandsAddRegex
781de164aaaSGreg Clayton //-------------------------------------------------------------------------
782de164aaaSGreg Clayton // CommandObjectCommandsAddRegex
783de164aaaSGreg Clayton //-------------------------------------------------------------------------
784de164aaaSGreg Clayton 
785de164aaaSGreg Clayton class CommandObjectCommandsAddRegex : public CommandObject
786de164aaaSGreg Clayton {
787de164aaaSGreg Clayton public:
788de164aaaSGreg Clayton     CommandObjectCommandsAddRegex (CommandInterpreter &interpreter) :
789de164aaaSGreg Clayton         CommandObject (interpreter,
7900e5e5a79SGreg Clayton                        "command regex",
791de164aaaSGreg Clayton                        "Allow the user to create a regular expression command.",
7920e5e5a79SGreg Clayton                        "command regex <cmd-name> [s/<regex>/<subst>/ ...]"),
793de164aaaSGreg Clayton         m_options (interpreter)
794de164aaaSGreg Clayton     {
7950e5e5a79SGreg Clayton         SetHelpLong(
7960e5e5a79SGreg Clayton "This command allows the user to create powerful regular expression commands\n"
7970e5e5a79SGreg Clayton "with substitutions. The regular expressions and substitutions are specified\n"
7980e5e5a79SGreg Clayton "using the regular exression substitution format of:\n"
7990e5e5a79SGreg Clayton "\n"
8000e5e5a79SGreg Clayton "    s/<regex>/<subst>/\n"
8010e5e5a79SGreg Clayton "\n"
8020e5e5a79SGreg Clayton "<regex> is a regular expression that can use parenthesis to capture regular\n"
8030e5e5a79SGreg Clayton "expression input and substitute the captured matches in the output using %1\n"
8040e5e5a79SGreg Clayton "for the first match, %2 for the second, and so on.\n"
8050e5e5a79SGreg Clayton "\n"
8060e5e5a79SGreg Clayton "The regular expressions can all be specified on the command line if more than\n"
8070e5e5a79SGreg Clayton "one argument is provided. If just the command name is provided on the command\n"
8080e5e5a79SGreg Clayton "line, then the regular expressions and substitutions can be entered on separate\n"
8090e5e5a79SGreg Clayton " lines, followed by an empty line to terminate the command definition.\n"
8100e5e5a79SGreg Clayton "\n"
8110e5e5a79SGreg Clayton "EXAMPLES\n"
8120e5e5a79SGreg Clayton "\n"
8130e5e5a79SGreg Clayton "The following example with define a regular expression command named 'f' that\n"
8140e5e5a79SGreg Clayton "will call 'finish' if there are no arguments, or 'frame select <frame-idx>' if\n"
8150e5e5a79SGreg Clayton "a number follows 'f':\n"
8160e5e5a79SGreg Clayton "(lldb) command regex f s/^$/finish/ 's/([0-9]+)/frame select %1/'\n"
8170e5e5a79SGreg Clayton                     );
818de164aaaSGreg Clayton     }
819de164aaaSGreg Clayton 
820de164aaaSGreg Clayton     ~CommandObjectCommandsAddRegex()
821de164aaaSGreg Clayton     {
822de164aaaSGreg Clayton     }
823de164aaaSGreg Clayton 
824de164aaaSGreg Clayton 
825de164aaaSGreg Clayton     bool
826de164aaaSGreg Clayton     Execute (Args& args, CommandReturnObject &result)
827de164aaaSGreg Clayton     {
8280e5e5a79SGreg Clayton         const size_t argc = args.GetArgumentCount();
8290e5e5a79SGreg Clayton         if (argc == 0)
830de164aaaSGreg Clayton         {
83169c12ccbSJason Molenda             result.AppendError ("usage: 'command regex <command-name> [s/<regex1>/<subst1>/ s/<regex2>/<subst2>/ ...]'\n");
8320e5e5a79SGreg Clayton             result.SetStatus (eReturnStatusFailed);
8330e5e5a79SGreg Clayton         }
8340e5e5a79SGreg Clayton         else
8350e5e5a79SGreg Clayton         {
8360e5e5a79SGreg Clayton             Error error;
837de164aaaSGreg Clayton             const char *name = args.GetArgumentAtIndex(0);
838de164aaaSGreg Clayton             m_regex_cmd_ap.reset (new CommandObjectRegexCommand (m_interpreter,
839de164aaaSGreg Clayton                                                                  name,
840de164aaaSGreg Clayton                                                                  m_options.GetHelp (),
841de164aaaSGreg Clayton                                                                  m_options.GetSyntax (),
842de164aaaSGreg Clayton                                                                  10));
8430e5e5a79SGreg Clayton 
8440e5e5a79SGreg Clayton             if (argc == 1)
8450e5e5a79SGreg Clayton             {
8460e5e5a79SGreg Clayton                 InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
847de164aaaSGreg Clayton                 if (reader_sp)
848de164aaaSGreg Clayton                 {
8490e5e5a79SGreg Clayton                     error =reader_sp->Initialize (CommandObjectCommandsAddRegex::InputReaderCallback,
850de164aaaSGreg Clayton                                                   this,                         // baton
851de164aaaSGreg Clayton                                                   eInputReaderGranularityLine,  // token size, to pass to callback function
8520e5e5a79SGreg Clayton                                                   NULL,                         // end token
853de164aaaSGreg Clayton                                                   "> ",                         // prompt
8540e5e5a79SGreg Clayton                                                   true);                        // echo input
8550e5e5a79SGreg Clayton                     if (error.Success())
856de164aaaSGreg Clayton                     {
857de164aaaSGreg Clayton                         m_interpreter.GetDebugger().PushInputReader (reader_sp);
858de164aaaSGreg Clayton                         result.SetStatus (eReturnStatusSuccessFinishNoResult);
8590e5e5a79SGreg Clayton                         return true;
860de164aaaSGreg Clayton                     }
861de164aaaSGreg Clayton                 }
862de164aaaSGreg Clayton             }
863de164aaaSGreg Clayton             else
864de164aaaSGreg Clayton             {
8650e5e5a79SGreg Clayton                 for (size_t arg_idx = 1; arg_idx < argc; ++arg_idx)
8660e5e5a79SGreg Clayton                 {
8670e5e5a79SGreg Clayton                     llvm::StringRef arg_strref (args.GetArgumentAtIndex(arg_idx));
8680e5e5a79SGreg Clayton                     error = AppendRegexSubstitution (arg_strref);
8690e5e5a79SGreg Clayton                     if (error.Fail())
8700e5e5a79SGreg Clayton                         break;
8710e5e5a79SGreg Clayton                 }
8720e5e5a79SGreg Clayton 
8730e5e5a79SGreg Clayton                 if (error.Success())
8740e5e5a79SGreg Clayton                 {
8750e5e5a79SGreg Clayton                     AddRegexCommandToInterpreter();
8760e5e5a79SGreg Clayton                 }
8770e5e5a79SGreg Clayton             }
8780e5e5a79SGreg Clayton             if (error.Fail())
8790e5e5a79SGreg Clayton             {
8800e5e5a79SGreg Clayton                 result.AppendError (error.AsCString());
881de164aaaSGreg Clayton                 result.SetStatus (eReturnStatusFailed);
882de164aaaSGreg Clayton             }
8830e5e5a79SGreg Clayton         }
8840e5e5a79SGreg Clayton 
885de164aaaSGreg Clayton         return result.Succeeded();
886de164aaaSGreg Clayton     }
887de164aaaSGreg Clayton 
8880e5e5a79SGreg Clayton     Error
8890e5e5a79SGreg Clayton     AppendRegexSubstitution (const llvm::StringRef &regex_sed)
890de164aaaSGreg Clayton     {
8910e5e5a79SGreg Clayton         Error error;
8920e5e5a79SGreg Clayton 
8930e5e5a79SGreg Clayton         if (m_regex_cmd_ap.get() == NULL)
894de164aaaSGreg Clayton         {
8950e5e5a79SGreg Clayton             error.SetErrorStringWithFormat("invalid regular expression command object for: '%.*s'",
8960e5e5a79SGreg Clayton                                            (int)regex_sed.size(),
8970e5e5a79SGreg Clayton                                            regex_sed.data());
8980e5e5a79SGreg Clayton             return error;
899de164aaaSGreg Clayton         }
9000e5e5a79SGreg Clayton 
9010e5e5a79SGreg Clayton         size_t regex_sed_size = regex_sed.size();
9020e5e5a79SGreg Clayton 
9030e5e5a79SGreg Clayton         if (regex_sed_size <= 1)
9040e5e5a79SGreg Clayton         {
9050e5e5a79SGreg Clayton             error.SetErrorStringWithFormat("regular expression substitution string is too short: '%.*s'",
9060e5e5a79SGreg Clayton                                            (int)regex_sed.size(),
9070e5e5a79SGreg Clayton                                            regex_sed.data());
9080e5e5a79SGreg Clayton             return error;
9090e5e5a79SGreg Clayton         }
9100e5e5a79SGreg Clayton 
9110e5e5a79SGreg Clayton         if (regex_sed[0] != 's')
9120e5e5a79SGreg Clayton         {
9130e5e5a79SGreg Clayton             error.SetErrorStringWithFormat("regular expression substitution string doesn't start with 's': '%.*s'",
9140e5e5a79SGreg Clayton                                            (int)regex_sed.size(),
9150e5e5a79SGreg Clayton                                            regex_sed.data());
9160e5e5a79SGreg Clayton             return error;
9170e5e5a79SGreg Clayton         }
9180e5e5a79SGreg Clayton         const size_t first_separator_char_pos = 1;
9190e5e5a79SGreg Clayton         // use the char that follows 's' as the regex separator character
9200e5e5a79SGreg Clayton         // so we can have "s/<regex>/<subst>/" or "s|<regex>|<subst>|"
9210e5e5a79SGreg Clayton         const char separator_char = regex_sed[first_separator_char_pos];
9220e5e5a79SGreg Clayton         const size_t second_separator_char_pos = regex_sed.find (separator_char, first_separator_char_pos + 1);
9230e5e5a79SGreg Clayton 
9240e5e5a79SGreg Clayton         if (second_separator_char_pos == std::string::npos)
9250e5e5a79SGreg Clayton         {
9260e5e5a79SGreg Clayton             error.SetErrorStringWithFormat("missing second '%c' separator char after '%.*s'",
9270e5e5a79SGreg Clayton                                            separator_char,
9280e5e5a79SGreg Clayton                                            (int)(regex_sed.size() - first_separator_char_pos - 1),
9290e5e5a79SGreg Clayton                                            regex_sed.data() + (first_separator_char_pos + 1));
9300e5e5a79SGreg Clayton             return error;
9310e5e5a79SGreg Clayton         }
9320e5e5a79SGreg Clayton 
9330e5e5a79SGreg Clayton         const size_t third_separator_char_pos = regex_sed.find (separator_char, second_separator_char_pos + 1);
9340e5e5a79SGreg Clayton 
9350e5e5a79SGreg Clayton         if (third_separator_char_pos == std::string::npos)
9360e5e5a79SGreg Clayton         {
9370e5e5a79SGreg Clayton             error.SetErrorStringWithFormat("missing third '%c' separator char after '%.*s'",
9380e5e5a79SGreg Clayton                                            separator_char,
9390e5e5a79SGreg Clayton                                            (int)(regex_sed.size() - second_separator_char_pos - 1),
9400e5e5a79SGreg Clayton                                            regex_sed.data() + (second_separator_char_pos + 1));
9410e5e5a79SGreg Clayton             return error;
9420e5e5a79SGreg Clayton         }
9430e5e5a79SGreg Clayton 
9440e5e5a79SGreg Clayton         if (third_separator_char_pos != regex_sed_size - 1)
9450e5e5a79SGreg Clayton         {
9460e5e5a79SGreg Clayton             // Make sure that everything that follows the last regex
9470e5e5a79SGreg Clayton             // separator char
9480e5e5a79SGreg Clayton             if (regex_sed.find_first_not_of("\t\n\v\f\r ", third_separator_char_pos + 1) != std::string::npos)
9490e5e5a79SGreg Clayton             {
9500e5e5a79SGreg Clayton                 error.SetErrorStringWithFormat("extra data found after the '%.*s' regular expression substitution string: '%.*s'",
9510e5e5a79SGreg Clayton                                                (int)third_separator_char_pos + 1,
9520e5e5a79SGreg Clayton                                                regex_sed.data(),
9530e5e5a79SGreg Clayton                                                (int)(regex_sed.size() - third_separator_char_pos - 1),
9540e5e5a79SGreg Clayton                                                regex_sed.data() + (third_separator_char_pos + 1));
9550e5e5a79SGreg Clayton                 return error;
9560e5e5a79SGreg Clayton             }
9570e5e5a79SGreg Clayton 
9580e5e5a79SGreg Clayton         }
9590e5e5a79SGreg Clayton         else if (first_separator_char_pos + 1 == second_separator_char_pos)
9600e5e5a79SGreg Clayton         {
9610e5e5a79SGreg Clayton             error.SetErrorStringWithFormat("<regex> can't be empty in 's%c<regex>%c<subst>%c' string: '%.*s'",
9620e5e5a79SGreg Clayton                                            separator_char,
9630e5e5a79SGreg Clayton                                            separator_char,
9640e5e5a79SGreg Clayton                                            separator_char,
9650e5e5a79SGreg Clayton                                            (int)regex_sed.size(),
9660e5e5a79SGreg Clayton                                            regex_sed.data());
9670e5e5a79SGreg Clayton             return error;
9680e5e5a79SGreg Clayton         }
9690e5e5a79SGreg Clayton         else if (second_separator_char_pos + 1 == third_separator_char_pos)
9700e5e5a79SGreg Clayton         {
9710e5e5a79SGreg Clayton             error.SetErrorStringWithFormat("<subst> can't be empty in 's%c<regex>%c<subst>%c' string: '%.*s'",
9720e5e5a79SGreg Clayton                                            separator_char,
9730e5e5a79SGreg Clayton                                            separator_char,
9740e5e5a79SGreg Clayton                                            separator_char,
9750e5e5a79SGreg Clayton                                            (int)regex_sed.size(),
9760e5e5a79SGreg Clayton                                            regex_sed.data());
9770e5e5a79SGreg Clayton             return error;
9780e5e5a79SGreg Clayton         }
9790e5e5a79SGreg Clayton         std::string regex(regex_sed.substr(first_separator_char_pos + 1, second_separator_char_pos - first_separator_char_pos - 1));
9800e5e5a79SGreg Clayton         std::string subst(regex_sed.substr(second_separator_char_pos + 1, third_separator_char_pos - second_separator_char_pos - 1));
9810e5e5a79SGreg Clayton         m_regex_cmd_ap->AddRegexCommand (regex.c_str(),
9820e5e5a79SGreg Clayton                                          subst.c_str());
9830e5e5a79SGreg Clayton         return error;
984de164aaaSGreg Clayton     }
985de164aaaSGreg Clayton 
986de164aaaSGreg Clayton     void
9870e5e5a79SGreg Clayton     AddRegexCommandToInterpreter()
988de164aaaSGreg Clayton     {
989de164aaaSGreg Clayton         if (m_regex_cmd_ap.get())
990de164aaaSGreg Clayton         {
991de164aaaSGreg Clayton             if (m_regex_cmd_ap->HasRegexEntries())
992de164aaaSGreg Clayton             {
993de164aaaSGreg Clayton                 CommandObjectSP cmd_sp (m_regex_cmd_ap.release());
994de164aaaSGreg Clayton                 m_interpreter.AddCommand(cmd_sp->GetCommandName(), cmd_sp, true);
995de164aaaSGreg Clayton             }
996de164aaaSGreg Clayton         }
997de164aaaSGreg Clayton     }
998de164aaaSGreg Clayton 
9990e5e5a79SGreg Clayton     void
10000e5e5a79SGreg Clayton     InputReaderDidCancel()
10010e5e5a79SGreg Clayton     {
10020e5e5a79SGreg Clayton         m_regex_cmd_ap.reset();
10030e5e5a79SGreg Clayton     }
10040e5e5a79SGreg Clayton 
1005de164aaaSGreg Clayton     static size_t
1006de164aaaSGreg Clayton     InputReaderCallback (void *baton,
1007de164aaaSGreg Clayton                          InputReader &reader,
1008de164aaaSGreg Clayton                          lldb::InputReaderAction notification,
1009de164aaaSGreg Clayton                          const char *bytes,
1010de164aaaSGreg Clayton                          size_t bytes_len);
1011de164aaaSGreg Clayton private:
1012de164aaaSGreg Clayton     std::auto_ptr<CommandObjectRegexCommand> m_regex_cmd_ap;
1013de164aaaSGreg Clayton 
1014de164aaaSGreg Clayton      class CommandOptions : public Options
1015de164aaaSGreg Clayton      {
1016de164aaaSGreg Clayton      public:
1017de164aaaSGreg Clayton 
1018de164aaaSGreg Clayton          CommandOptions (CommandInterpreter &interpreter) :
1019de164aaaSGreg Clayton             Options (interpreter)
1020de164aaaSGreg Clayton          {
1021de164aaaSGreg Clayton          }
1022de164aaaSGreg Clayton 
1023de164aaaSGreg Clayton          virtual
1024de164aaaSGreg Clayton          ~CommandOptions (){}
1025de164aaaSGreg Clayton 
1026de164aaaSGreg Clayton          virtual Error
1027de164aaaSGreg Clayton          SetOptionValue (uint32_t option_idx, const char *option_arg)
1028de164aaaSGreg Clayton          {
1029de164aaaSGreg Clayton              Error error;
1030de164aaaSGreg Clayton              char short_option = (char) m_getopt_table[option_idx].val;
1031de164aaaSGreg Clayton 
1032de164aaaSGreg Clayton              switch (short_option)
1033de164aaaSGreg Clayton              {
1034de164aaaSGreg Clayton                  case 'h':
1035de164aaaSGreg Clayton                      m_help.assign (option_arg);
1036de164aaaSGreg Clayton                      break;
1037de164aaaSGreg Clayton                  case 's':
1038de164aaaSGreg Clayton                      m_syntax.assign (option_arg);
1039de164aaaSGreg Clayton                      break;
1040de164aaaSGreg Clayton 
1041de164aaaSGreg Clayton                  default:
104286edbf41SGreg Clayton                      error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
1043de164aaaSGreg Clayton                      break;
1044de164aaaSGreg Clayton              }
1045de164aaaSGreg Clayton 
1046de164aaaSGreg Clayton              return error;
1047de164aaaSGreg Clayton          }
1048de164aaaSGreg Clayton 
1049de164aaaSGreg Clayton          void
1050de164aaaSGreg Clayton          OptionParsingStarting ()
1051de164aaaSGreg Clayton          {
1052de164aaaSGreg Clayton              m_help.clear();
1053de164aaaSGreg Clayton              m_syntax.clear();
1054de164aaaSGreg Clayton          }
1055de164aaaSGreg Clayton 
1056de164aaaSGreg Clayton          const OptionDefinition*
1057de164aaaSGreg Clayton          GetDefinitions ()
1058de164aaaSGreg Clayton          {
1059de164aaaSGreg Clayton              return g_option_table;
1060de164aaaSGreg Clayton          }
1061de164aaaSGreg Clayton 
1062de164aaaSGreg Clayton          // Options table: Required for subclasses of Options.
1063de164aaaSGreg Clayton 
1064de164aaaSGreg Clayton          static OptionDefinition g_option_table[];
1065de164aaaSGreg Clayton 
1066de164aaaSGreg Clayton          const char *
1067de164aaaSGreg Clayton          GetHelp ()
1068de164aaaSGreg Clayton          {
1069de164aaaSGreg Clayton              if (m_help.empty())
1070de164aaaSGreg Clayton                  return NULL;
1071de164aaaSGreg Clayton              return m_help.c_str();
1072de164aaaSGreg Clayton          }
1073de164aaaSGreg Clayton          const char *
1074de164aaaSGreg Clayton          GetSyntax ()
1075de164aaaSGreg Clayton          {
1076de164aaaSGreg Clayton              if (m_syntax.empty())
1077de164aaaSGreg Clayton                  return NULL;
1078de164aaaSGreg Clayton              return m_syntax.c_str();
1079de164aaaSGreg Clayton          }
1080de164aaaSGreg Clayton          // Instance variables to hold the values for command options.
1081de164aaaSGreg Clayton      protected:
1082de164aaaSGreg Clayton          std::string m_help;
1083de164aaaSGreg Clayton          std::string m_syntax;
1084de164aaaSGreg Clayton      };
1085de164aaaSGreg Clayton 
1086de164aaaSGreg Clayton      CommandOptions m_options;
1087de164aaaSGreg Clayton 
1088de164aaaSGreg Clayton      virtual Options *
1089de164aaaSGreg Clayton      GetOptions ()
1090de164aaaSGreg Clayton      {
1091de164aaaSGreg Clayton          return &m_options;
1092de164aaaSGreg Clayton      }
1093de164aaaSGreg Clayton 
1094de164aaaSGreg Clayton };
1095de164aaaSGreg Clayton 
1096de164aaaSGreg Clayton size_t
1097de164aaaSGreg Clayton CommandObjectCommandsAddRegex::InputReaderCallback (void *baton,
1098de164aaaSGreg Clayton                                                     InputReader &reader,
1099de164aaaSGreg Clayton                                                     lldb::InputReaderAction notification,
1100de164aaaSGreg Clayton                                                     const char *bytes,
1101de164aaaSGreg Clayton                                                     size_t bytes_len)
1102de164aaaSGreg Clayton {
1103de164aaaSGreg Clayton     CommandObjectCommandsAddRegex *add_regex_cmd = (CommandObjectCommandsAddRegex *) baton;
1104d61c10bcSCaroline Tice     bool batch_mode = reader.GetDebugger().GetCommandInterpreter().GetBatchCommandMode();
1105de164aaaSGreg Clayton 
1106de164aaaSGreg Clayton     switch (notification)
1107de164aaaSGreg Clayton     {
1108de164aaaSGreg Clayton         case eInputReaderActivate:
1109d61c10bcSCaroline Tice             if (!batch_mode)
111015356e7fSCaroline Tice             {
111115356e7fSCaroline Tice                 StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream ();
111215356e7fSCaroline Tice                 out_stream->Printf("%s\n", "Enter regular expressions in the form 's/<regex>/<subst>/' and terminate with an empty line:");
111315356e7fSCaroline Tice                 out_stream->Flush();
111415356e7fSCaroline Tice             }
1115de164aaaSGreg Clayton             break;
1116de164aaaSGreg Clayton         case eInputReaderReactivate:
1117de164aaaSGreg Clayton             break;
1118de164aaaSGreg Clayton 
1119de164aaaSGreg Clayton         case eInputReaderDeactivate:
1120de164aaaSGreg Clayton             break;
1121de164aaaSGreg Clayton 
1122969ed3d1SCaroline Tice         case eInputReaderAsynchronousOutputWritten:
1123969ed3d1SCaroline Tice             break;
1124969ed3d1SCaroline Tice 
1125de164aaaSGreg Clayton         case eInputReaderGotToken:
11260e5e5a79SGreg Clayton             while (bytes_len > 0 && (bytes[bytes_len-1] == '\r' || bytes[bytes_len-1] == '\n'))
11270e5e5a79SGreg Clayton                 --bytes_len;
1128de164aaaSGreg Clayton             if (bytes_len == 0)
1129de164aaaSGreg Clayton                 reader.SetIsDone(true);
1130de164aaaSGreg Clayton             else if (bytes)
1131de164aaaSGreg Clayton             {
11320e5e5a79SGreg Clayton                 llvm::StringRef bytes_strref (bytes, bytes_len);
11330e5e5a79SGreg Clayton                 Error error (add_regex_cmd->AppendRegexSubstitution (bytes_strref));
11340e5e5a79SGreg Clayton                 if (error.Fail())
1135de164aaaSGreg Clayton                 {
1136d61c10bcSCaroline Tice                     if (!batch_mode)
1137d61c10bcSCaroline Tice                     {
113815356e7fSCaroline Tice                         StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
113915356e7fSCaroline Tice                         out_stream->Printf("error: %s\n", error.AsCString());
114015356e7fSCaroline Tice                         out_stream->Flush();
1141d61c10bcSCaroline Tice                     }
11420e5e5a79SGreg Clayton                     add_regex_cmd->InputReaderDidCancel ();
11430e5e5a79SGreg Clayton                     reader.SetIsDone (true);
1144de164aaaSGreg Clayton                 }
1145de164aaaSGreg Clayton             }
1146de164aaaSGreg Clayton             break;
1147de164aaaSGreg Clayton 
1148de164aaaSGreg Clayton         case eInputReaderInterrupt:
114915356e7fSCaroline Tice             {
1150de164aaaSGreg Clayton                 reader.SetIsDone (true);
1151d61c10bcSCaroline Tice                 if (!batch_mode)
1152d61c10bcSCaroline Tice                 {
115315356e7fSCaroline Tice                     StreamSP out_stream = reader.GetDebugger().GetAsyncOutputStream();
115415356e7fSCaroline Tice                     out_stream->PutCString("Regular expression command creations was cancelled.\n");
115515356e7fSCaroline Tice                     out_stream->Flush();
1156d61c10bcSCaroline Tice                 }
11570e5e5a79SGreg Clayton                 add_regex_cmd->InputReaderDidCancel ();
115815356e7fSCaroline Tice             }
1159de164aaaSGreg Clayton             break;
1160de164aaaSGreg Clayton 
1161de164aaaSGreg Clayton         case eInputReaderEndOfFile:
1162de164aaaSGreg Clayton             reader.SetIsDone (true);
1163de164aaaSGreg Clayton             break;
1164de164aaaSGreg Clayton 
1165de164aaaSGreg Clayton         case eInputReaderDone:
11660e5e5a79SGreg Clayton             add_regex_cmd->AddRegexCommandToInterpreter();
1167de164aaaSGreg Clayton             break;
1168de164aaaSGreg Clayton     }
1169de164aaaSGreg Clayton 
1170de164aaaSGreg Clayton     return bytes_len;
1171de164aaaSGreg Clayton }
1172de164aaaSGreg Clayton 
1173de164aaaSGreg Clayton 
1174de164aaaSGreg Clayton OptionDefinition
1175de164aaaSGreg Clayton CommandObjectCommandsAddRegex::CommandOptions::g_option_table[] =
1176de164aaaSGreg Clayton {
1177de164aaaSGreg Clayton { LLDB_OPT_SET_1, false, "help"  , 'h', required_argument, NULL, 0, eArgTypeNone, "The help text to display for this command."},
1178de164aaaSGreg Clayton { LLDB_OPT_SET_1, false, "syntax", 's', required_argument, NULL, 0, eArgTypeNone, "A syntax string showing the typical usage syntax."},
1179de164aaaSGreg Clayton { 0             , false,  NULL   , 0  , 0                , NULL, 0, eArgTypeNone, NULL }
1180de164aaaSGreg Clayton };
1181de164aaaSGreg Clayton 
1182de164aaaSGreg Clayton 
1183223383edSEnrico Granata class CommandObjectPythonFunction : public CommandObject
1184223383edSEnrico Granata {
1185223383edSEnrico Granata private:
1186223383edSEnrico Granata     std::string m_function_name;
11870a305db7SEnrico Granata     ScriptedCommandSynchronicity m_synchro;
1188223383edSEnrico Granata 
1189223383edSEnrico Granata public:
1190223383edSEnrico Granata 
1191223383edSEnrico Granata     CommandObjectPythonFunction (CommandInterpreter &interpreter,
1192223383edSEnrico Granata                                  std::string name,
11930a305db7SEnrico Granata                                  std::string funct,
11940a305db7SEnrico Granata                                  ScriptedCommandSynchronicity synch) :
1195223383edSEnrico Granata     CommandObject (interpreter,
1196223383edSEnrico Granata                    name.c_str(),
1197223383edSEnrico Granata                    (std::string("Run Python function ") + funct).c_str(),
1198223383edSEnrico Granata                    NULL),
11990a305db7SEnrico Granata     m_function_name(funct),
12000a305db7SEnrico Granata     m_synchro(synch)
1201223383edSEnrico Granata     {
120299f0b8f9SEnrico Granata         ScriptInterpreter* scripter = m_interpreter.GetScriptInterpreter();
120399f0b8f9SEnrico Granata         if (scripter)
120499f0b8f9SEnrico Granata         {
120599f0b8f9SEnrico Granata             std::string docstring = scripter->GetDocumentationForItem(funct.c_str());
120699f0b8f9SEnrico Granata             if (!docstring.empty())
120799f0b8f9SEnrico Granata                 SetHelpLong(docstring);
120899f0b8f9SEnrico Granata         }
1209223383edSEnrico Granata     }
1210223383edSEnrico Granata 
1211223383edSEnrico Granata     virtual
1212223383edSEnrico Granata     ~CommandObjectPythonFunction ()
1213223383edSEnrico Granata     {
1214223383edSEnrico Granata     }
1215223383edSEnrico Granata 
1216223383edSEnrico Granata     virtual bool
1217223383edSEnrico Granata     ExecuteRawCommandString (const char *raw_command_line, CommandReturnObject &result)
1218223383edSEnrico Granata     {
1219223383edSEnrico Granata         ScriptInterpreter* scripter = m_interpreter.GetScriptInterpreter();
1220223383edSEnrico Granata 
1221223383edSEnrico Granata         Error error;
1222223383edSEnrico Granata 
1223223383edSEnrico Granata         if (!scripter || scripter->RunScriptBasedCommand(m_function_name.c_str(),
1224223383edSEnrico Granata                                                          raw_command_line,
12250a305db7SEnrico Granata                                                          m_synchro,
1226223383edSEnrico Granata                                                          result,
1227223383edSEnrico Granata                                                          error) == false)
1228223383edSEnrico Granata         {
1229223383edSEnrico Granata             result.AppendError(error.AsCString());
1230223383edSEnrico Granata             result.SetStatus(eReturnStatusFailed);
1231223383edSEnrico Granata         }
1232223383edSEnrico Granata         else
1233223383edSEnrico Granata             result.SetStatus(eReturnStatusSuccessFinishNoResult);
1234223383edSEnrico Granata 
1235223383edSEnrico Granata         return result.Succeeded();
1236223383edSEnrico Granata     }
1237223383edSEnrico Granata 
1238223383edSEnrico Granata     virtual bool
1239223383edSEnrico Granata     WantsRawCommandString ()
1240223383edSEnrico Granata     {
1241223383edSEnrico Granata         return true;
1242223383edSEnrico Granata     }
1243223383edSEnrico Granata 
1244223383edSEnrico Granata     bool
1245223383edSEnrico Granata     Execute (Args& command,
1246223383edSEnrico Granata              CommandReturnObject &result)
1247223383edSEnrico Granata     {
1248223383edSEnrico Granata         std::string cmd_string;
1249223383edSEnrico Granata         command.GetCommandString(cmd_string);
1250223383edSEnrico Granata         return ExecuteRawCommandString(cmd_string.c_str(), result);
1251223383edSEnrico Granata     }
1252223383edSEnrico Granata 
1253223383edSEnrico Granata     virtual bool
12540a305db7SEnrico Granata     IsRemovable ()
12550a305db7SEnrico Granata     {
12560a305db7SEnrico Granata         return true;
12570a305db7SEnrico Granata     }
12580a305db7SEnrico Granata 
12590a305db7SEnrico Granata     const std::string&
12600a305db7SEnrico Granata     GetFunctionName ()
12610a305db7SEnrico Granata     {
12620a305db7SEnrico Granata         return m_function_name;
12630a305db7SEnrico Granata     }
12640a305db7SEnrico Granata 
12650a305db7SEnrico Granata     ScriptedCommandSynchronicity
12660a305db7SEnrico Granata     GetSynchronicity ()
12670a305db7SEnrico Granata     {
12680a305db7SEnrico Granata         return m_synchro;
12690a305db7SEnrico Granata     }
1270223383edSEnrico Granata 
1271223383edSEnrico Granata };
1272223383edSEnrico Granata 
1273a9dbf432SEnrico Granata //-------------------------------------------------------------------------
1274a9dbf432SEnrico Granata // CommandObjectCommandsScriptImport
1275a9dbf432SEnrico Granata //-------------------------------------------------------------------------
1276a9dbf432SEnrico Granata 
1277a9dbf432SEnrico Granata class CommandObjectCommandsScriptImport : public CommandObject
1278a9dbf432SEnrico Granata {
12790a305db7SEnrico Granata private:
12800a305db7SEnrico Granata 
12810a305db7SEnrico Granata     class CommandOptions : public Options
12820a305db7SEnrico Granata     {
12830a305db7SEnrico Granata     public:
12840a305db7SEnrico Granata 
12850a305db7SEnrico Granata         CommandOptions (CommandInterpreter &interpreter) :
12860a305db7SEnrico Granata         Options (interpreter)
12870a305db7SEnrico Granata         {
12880a305db7SEnrico Granata         }
12890a305db7SEnrico Granata 
12900a305db7SEnrico Granata         virtual
12910a305db7SEnrico Granata         ~CommandOptions (){}
12920a305db7SEnrico Granata 
12930a305db7SEnrico Granata         virtual Error
12940a305db7SEnrico Granata         SetOptionValue (uint32_t option_idx, const char *option_arg)
12950a305db7SEnrico Granata         {
12960a305db7SEnrico Granata             Error error;
12970a305db7SEnrico Granata             char short_option = (char) m_getopt_table[option_idx].val;
12980a305db7SEnrico Granata 
12990a305db7SEnrico Granata             switch (short_option)
13000a305db7SEnrico Granata             {
13010a305db7SEnrico Granata                 case 'r':
13020a305db7SEnrico Granata                     m_allow_reload = true;
13030a305db7SEnrico Granata                     break;
13040a305db7SEnrico Granata                 default:
13050a305db7SEnrico Granata                     error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
13060a305db7SEnrico Granata                     break;
13070a305db7SEnrico Granata             }
13080a305db7SEnrico Granata 
13090a305db7SEnrico Granata             return error;
13100a305db7SEnrico Granata         }
13110a305db7SEnrico Granata 
13120a305db7SEnrico Granata         void
13130a305db7SEnrico Granata         OptionParsingStarting ()
13140a305db7SEnrico Granata         {
13150a305db7SEnrico Granata             m_allow_reload = false;
13160a305db7SEnrico Granata         }
13170a305db7SEnrico Granata 
13180a305db7SEnrico Granata         const OptionDefinition*
13190a305db7SEnrico Granata         GetDefinitions ()
13200a305db7SEnrico Granata         {
13210a305db7SEnrico Granata             return g_option_table;
13220a305db7SEnrico Granata         }
13230a305db7SEnrico Granata 
13240a305db7SEnrico Granata         // Options table: Required for subclasses of Options.
13250a305db7SEnrico Granata 
13260a305db7SEnrico Granata         static OptionDefinition g_option_table[];
13270a305db7SEnrico Granata 
13280a305db7SEnrico Granata         // Instance variables to hold the values for command options.
13290a305db7SEnrico Granata 
13300a305db7SEnrico Granata         bool m_allow_reload;
13310a305db7SEnrico Granata     };
13320a305db7SEnrico Granata 
13330a305db7SEnrico Granata     CommandOptions m_options;
13340a305db7SEnrico Granata 
13350a305db7SEnrico Granata     virtual Options *
13360a305db7SEnrico Granata     GetOptions ()
13370a305db7SEnrico Granata     {
13380a305db7SEnrico Granata         return &m_options;
13390a305db7SEnrico Granata     }
13400a305db7SEnrico Granata 
1341a9dbf432SEnrico Granata public:
1342a9dbf432SEnrico Granata     CommandObjectCommandsScriptImport (CommandInterpreter &interpreter) :
1343a9dbf432SEnrico Granata     CommandObject (interpreter,
1344a9dbf432SEnrico Granata                    "command script import",
1345a9dbf432SEnrico Granata                    "Import a scripting module in LLDB.",
13460a305db7SEnrico Granata                    NULL),
13470a305db7SEnrico Granata     m_options(interpreter)
1348a9dbf432SEnrico Granata     {
1349a9dbf432SEnrico Granata         CommandArgumentEntry arg1;
1350a9dbf432SEnrico Granata         CommandArgumentData cmd_arg;
1351a9dbf432SEnrico Granata 
1352a9dbf432SEnrico Granata         // Define the first (and only) variant of this arg.
13530a305db7SEnrico Granata         cmd_arg.arg_type = eArgTypeFilename;
1354a9dbf432SEnrico Granata         cmd_arg.arg_repetition = eArgRepeatPlain;
1355a9dbf432SEnrico Granata 
1356a9dbf432SEnrico Granata         // There is only one variant this argument could be; put it into the argument entry.
1357a9dbf432SEnrico Granata         arg1.push_back (cmd_arg);
1358a9dbf432SEnrico Granata 
1359a9dbf432SEnrico Granata         // Push the data for the first argument into the m_arguments vector.
1360a9dbf432SEnrico Granata         m_arguments.push_back (arg1);
1361a9dbf432SEnrico Granata     }
1362a9dbf432SEnrico Granata 
1363a9dbf432SEnrico Granata     ~CommandObjectCommandsScriptImport ()
1364a9dbf432SEnrico Granata     {
1365a9dbf432SEnrico Granata     }
1366a9dbf432SEnrico Granata 
1367a9dbf432SEnrico Granata     bool
1368a9dbf432SEnrico Granata     Execute
1369a9dbf432SEnrico Granata     (
1370a9dbf432SEnrico Granata      Args& args,
1371a9dbf432SEnrico Granata      CommandReturnObject &result
1372a9dbf432SEnrico Granata      )
1373a9dbf432SEnrico Granata     {
1374a9dbf432SEnrico Granata 
1375a9dbf432SEnrico Granata         if (m_interpreter.GetDebugger().GetScriptLanguage() != lldb::eScriptLanguagePython)
1376a9dbf432SEnrico Granata         {
1377a9dbf432SEnrico Granata             result.AppendError ("only scripting language supported for module importing is currently Python");
1378a9dbf432SEnrico Granata             result.SetStatus (eReturnStatusFailed);
1379a9dbf432SEnrico Granata             return false;
1380a9dbf432SEnrico Granata         }
1381a9dbf432SEnrico Granata 
1382a9dbf432SEnrico Granata         size_t argc = args.GetArgumentCount();
1383a9dbf432SEnrico Granata 
1384a9dbf432SEnrico Granata         if (argc != 1)
1385a9dbf432SEnrico Granata         {
1386a9dbf432SEnrico Granata             result.AppendError ("'command script import' requires one argument");
1387a9dbf432SEnrico Granata             result.SetStatus (eReturnStatusFailed);
1388a9dbf432SEnrico Granata             return false;
1389a9dbf432SEnrico Granata         }
1390a9dbf432SEnrico Granata 
1391a9dbf432SEnrico Granata         std::string path = args.GetArgumentAtIndex(0);
1392a9dbf432SEnrico Granata         Error error;
1393a9dbf432SEnrico Granata 
1394a9dbf432SEnrico Granata         if (m_interpreter.GetScriptInterpreter()->LoadScriptingModule(path.c_str(),
13950a305db7SEnrico Granata                                                                       m_options.m_allow_reload,
1396a9dbf432SEnrico Granata                                                                       error))
1397a9dbf432SEnrico Granata         {
1398a9dbf432SEnrico Granata             result.SetStatus (eReturnStatusSuccessFinishNoResult);
1399a9dbf432SEnrico Granata         }
1400a9dbf432SEnrico Granata         else
1401a9dbf432SEnrico Granata         {
1402a9dbf432SEnrico Granata             result.AppendErrorWithFormat("module importing failed: %s", error.AsCString());
1403a9dbf432SEnrico Granata             result.SetStatus (eReturnStatusFailed);
1404a9dbf432SEnrico Granata         }
1405a9dbf432SEnrico Granata 
1406a9dbf432SEnrico Granata         return result.Succeeded();
1407a9dbf432SEnrico Granata     }
14080a305db7SEnrico Granata 
14090a305db7SEnrico Granata     int
14100a305db7SEnrico Granata     HandleArgumentCompletion (Args &input,
14110a305db7SEnrico Granata                               int &cursor_index,
14120a305db7SEnrico Granata                               int &cursor_char_position,
14130a305db7SEnrico Granata                               OptionElementVector &opt_element_vector,
14140a305db7SEnrico Granata                               int match_start_point,
14150a305db7SEnrico Granata                               int max_return_elements,
14160a305db7SEnrico Granata                               bool &word_complete,
14170a305db7SEnrico Granata                               StringList &matches)
14180a305db7SEnrico Granata     {
14190a305db7SEnrico Granata         std::string completion_str (input.GetArgumentAtIndex(cursor_index));
14200a305db7SEnrico Granata         completion_str.erase (cursor_char_position);
14210a305db7SEnrico Granata 
14220a305db7SEnrico Granata         CommandCompletions::InvokeCommonCompletionCallbacks (m_interpreter,
14230a305db7SEnrico Granata                                                              CommandCompletions::eDiskFileCompletion,
14240a305db7SEnrico Granata                                                              completion_str.c_str(),
14250a305db7SEnrico Granata                                                              match_start_point,
14260a305db7SEnrico Granata                                                              max_return_elements,
14270a305db7SEnrico Granata                                                              NULL,
14280a305db7SEnrico Granata                                                              word_complete,
14290a305db7SEnrico Granata                                                              matches);
14300a305db7SEnrico Granata         return matches.GetSize();
14310a305db7SEnrico Granata     }
1432a9dbf432SEnrico Granata };
1433223383edSEnrico Granata 
14340a305db7SEnrico Granata OptionDefinition
14350a305db7SEnrico Granata CommandObjectCommandsScriptImport::CommandOptions::g_option_table[] =
14360a305db7SEnrico Granata {
14370a305db7SEnrico Granata     { LLDB_OPT_SET_1, false, "allow-reload", 'r', no_argument, NULL, 0, eArgTypeNone,        "Allow the script to be loaded even if it was already loaded before (for Python, the __lldb_init_module function will be called again, but the module will not be reloaded from disk)."},
14380a305db7SEnrico Granata     { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
14390a305db7SEnrico Granata };
14400a305db7SEnrico Granata 
14410a305db7SEnrico Granata 
1442223383edSEnrico Granata //-------------------------------------------------------------------------
1443223383edSEnrico Granata // CommandObjectCommandsScriptAdd
1444223383edSEnrico Granata //-------------------------------------------------------------------------
1445223383edSEnrico Granata 
1446223383edSEnrico Granata class CommandObjectCommandsScriptAdd : public CommandObject
1447223383edSEnrico Granata {
1448223383edSEnrico Granata private:
1449223383edSEnrico Granata 
1450223383edSEnrico Granata     class CommandOptions : public Options
1451223383edSEnrico Granata     {
1452223383edSEnrico Granata     public:
1453223383edSEnrico Granata 
1454223383edSEnrico Granata         CommandOptions (CommandInterpreter &interpreter) :
1455223383edSEnrico Granata         Options (interpreter)
1456223383edSEnrico Granata         {
1457223383edSEnrico Granata         }
1458223383edSEnrico Granata 
1459223383edSEnrico Granata         virtual
1460223383edSEnrico Granata         ~CommandOptions (){}
1461223383edSEnrico Granata 
1462223383edSEnrico Granata         virtual Error
1463223383edSEnrico Granata         SetOptionValue (uint32_t option_idx, const char *option_arg)
1464223383edSEnrico Granata         {
1465223383edSEnrico Granata             Error error;
1466223383edSEnrico Granata             char short_option = (char) m_getopt_table[option_idx].val;
1467223383edSEnrico Granata 
1468223383edSEnrico Granata             switch (short_option)
1469223383edSEnrico Granata             {
1470223383edSEnrico Granata                 case 'f':
1471223383edSEnrico Granata                     m_funct_name = std::string(option_arg);
1472223383edSEnrico Granata                     break;
14730a305db7SEnrico Granata                 case 's':
14740a305db7SEnrico Granata                     m_synchronous = (ScriptedCommandSynchronicity) Args::StringToOptionEnum(option_arg, g_option_table[option_idx].enum_values, 0, error);
14750a305db7SEnrico Granata                     if (!error.Success())
14760a305db7SEnrico Granata                         error.SetErrorStringWithFormat ("unrecognized value for synchronicity '%s'", option_arg);
14770a305db7SEnrico Granata                     break;
1478223383edSEnrico Granata                 default:
147986edbf41SGreg Clayton                     error.SetErrorStringWithFormat ("unrecognized option '%c'", short_option);
1480223383edSEnrico Granata                     break;
1481223383edSEnrico Granata             }
1482223383edSEnrico Granata 
1483223383edSEnrico Granata             return error;
1484223383edSEnrico Granata         }
1485223383edSEnrico Granata 
1486223383edSEnrico Granata         void
1487223383edSEnrico Granata         OptionParsingStarting ()
1488223383edSEnrico Granata         {
1489223383edSEnrico Granata             m_funct_name = "";
14900a305db7SEnrico Granata             m_synchronous = eScriptedCommandSynchronicitySynchronous;
1491223383edSEnrico Granata         }
1492223383edSEnrico Granata 
1493223383edSEnrico Granata         const OptionDefinition*
1494223383edSEnrico Granata         GetDefinitions ()
1495223383edSEnrico Granata         {
1496223383edSEnrico Granata             return g_option_table;
1497223383edSEnrico Granata         }
1498223383edSEnrico Granata 
1499223383edSEnrico Granata         // Options table: Required for subclasses of Options.
1500223383edSEnrico Granata 
1501223383edSEnrico Granata         static OptionDefinition g_option_table[];
1502223383edSEnrico Granata 
1503223383edSEnrico Granata         // Instance variables to hold the values for command options.
1504223383edSEnrico Granata 
1505223383edSEnrico Granata         std::string m_funct_name;
15060a305db7SEnrico Granata         ScriptedCommandSynchronicity m_synchronous;
1507223383edSEnrico Granata     };
1508223383edSEnrico Granata 
1509223383edSEnrico Granata     CommandOptions m_options;
1510223383edSEnrico Granata 
1511223383edSEnrico Granata     virtual Options *
1512223383edSEnrico Granata     GetOptions ()
1513223383edSEnrico Granata     {
1514223383edSEnrico Granata         return &m_options;
1515223383edSEnrico Granata     }
1516223383edSEnrico Granata 
1517223383edSEnrico Granata     class PythonAliasReader : public InputReaderEZ
1518223383edSEnrico Granata     {
1519223383edSEnrico Granata     private:
1520223383edSEnrico Granata         CommandInterpreter& m_interpreter;
1521223383edSEnrico Granata         std::string m_cmd_name;
15220a305db7SEnrico Granata         ScriptedCommandSynchronicity m_synchronous;
1523223383edSEnrico Granata         StringList m_user_input;
1524223383edSEnrico Granata         DISALLOW_COPY_AND_ASSIGN (PythonAliasReader);
1525223383edSEnrico Granata     public:
1526223383edSEnrico Granata         PythonAliasReader(Debugger& debugger,
1527223383edSEnrico Granata                           CommandInterpreter& interpreter,
15280a305db7SEnrico Granata                           std::string cmd_name,
15290a305db7SEnrico Granata                           ScriptedCommandSynchronicity synch) :
1530223383edSEnrico Granata         InputReaderEZ(debugger),
1531223383edSEnrico Granata         m_interpreter(interpreter),
1532223383edSEnrico Granata         m_cmd_name(cmd_name),
15330a305db7SEnrico Granata         m_synchronous(synch),
1534223383edSEnrico Granata         m_user_input()
1535223383edSEnrico Granata         {}
1536223383edSEnrico Granata 
1537223383edSEnrico Granata         virtual
1538223383edSEnrico Granata         ~PythonAliasReader()
1539223383edSEnrico Granata         {
1540223383edSEnrico Granata         }
1541223383edSEnrico Granata 
1542223383edSEnrico Granata         virtual void ActivateHandler(HandlerData& data)
1543223383edSEnrico Granata         {
1544223383edSEnrico Granata             StreamSP out_stream = data.GetOutStream();
1545223383edSEnrico Granata             bool batch_mode = data.GetBatchMode();
1546223383edSEnrico Granata             if (!batch_mode)
1547223383edSEnrico Granata             {
1548223383edSEnrico Granata                 out_stream->Printf ("%s\n", g_python_command_instructions);
1549223383edSEnrico Granata                 if (data.reader.GetPrompt())
1550223383edSEnrico Granata                     out_stream->Printf ("%s", data.reader.GetPrompt());
1551223383edSEnrico Granata                 out_stream->Flush();
1552223383edSEnrico Granata             }
1553223383edSEnrico Granata         }
1554223383edSEnrico Granata 
1555223383edSEnrico Granata         virtual void ReactivateHandler(HandlerData& data)
1556223383edSEnrico Granata         {
1557223383edSEnrico Granata             StreamSP out_stream = data.GetOutStream();
1558223383edSEnrico Granata             bool batch_mode = data.GetBatchMode();
1559223383edSEnrico Granata             if (data.reader.GetPrompt() && !batch_mode)
1560223383edSEnrico Granata             {
1561223383edSEnrico Granata                 out_stream->Printf ("%s", data.reader.GetPrompt());
1562223383edSEnrico Granata                 out_stream->Flush();
1563223383edSEnrico Granata             }
1564223383edSEnrico Granata         }
1565223383edSEnrico Granata         virtual void GotTokenHandler(HandlerData& data)
1566223383edSEnrico Granata         {
1567223383edSEnrico Granata             StreamSP out_stream = data.GetOutStream();
1568223383edSEnrico Granata             bool batch_mode = data.GetBatchMode();
1569223383edSEnrico Granata             if (data.bytes && data.bytes_len)
1570223383edSEnrico Granata             {
1571223383edSEnrico Granata                 m_user_input.AppendString(data.bytes, data.bytes_len);
1572223383edSEnrico Granata             }
1573223383edSEnrico Granata             if (!data.reader.IsDone() && data.reader.GetPrompt() && !batch_mode)
1574223383edSEnrico Granata             {
1575223383edSEnrico Granata                 out_stream->Printf ("%s", data.reader.GetPrompt());
1576223383edSEnrico Granata                 out_stream->Flush();
1577223383edSEnrico Granata             }
1578223383edSEnrico Granata         }
1579223383edSEnrico Granata         virtual void InterruptHandler(HandlerData& data)
1580223383edSEnrico Granata         {
1581223383edSEnrico Granata             StreamSP out_stream = data.GetOutStream();
1582223383edSEnrico Granata             bool batch_mode = data.GetBatchMode();
1583223383edSEnrico Granata             data.reader.SetIsDone (true);
1584223383edSEnrico Granata             if (!batch_mode)
1585223383edSEnrico Granata             {
15860a305db7SEnrico Granata                 out_stream->Printf ("Warning: No script attached.\n");
1587223383edSEnrico Granata                 out_stream->Flush();
1588223383edSEnrico Granata             }
1589223383edSEnrico Granata         }
1590223383edSEnrico Granata         virtual void EOFHandler(HandlerData& data)
1591223383edSEnrico Granata         {
1592223383edSEnrico Granata             data.reader.SetIsDone (true);
1593223383edSEnrico Granata         }
1594223383edSEnrico Granata         virtual void DoneHandler(HandlerData& data)
1595223383edSEnrico Granata         {
1596223383edSEnrico Granata             StreamSP out_stream = data.GetOutStream();
1597223383edSEnrico Granata 
1598223383edSEnrico Granata             ScriptInterpreter *interpreter = data.reader.GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
1599223383edSEnrico Granata             if (!interpreter)
1600223383edSEnrico Granata             {
16010a305db7SEnrico Granata                 out_stream->Printf ("Script interpreter missing: no script attached.\n");
1602223383edSEnrico Granata                 out_stream->Flush();
1603223383edSEnrico Granata                 return;
1604223383edSEnrico Granata             }
1605a73b7df7SEnrico Granata             std::string funct_name_str;
1606223383edSEnrico Granata             if (!interpreter->GenerateScriptAliasFunction (m_user_input,
1607a73b7df7SEnrico Granata                                                            funct_name_str))
1608223383edSEnrico Granata             {
16090a305db7SEnrico Granata                 out_stream->Printf ("Unable to create function: no script attached.\n");
1610223383edSEnrico Granata                 out_stream->Flush();
1611223383edSEnrico Granata                 return;
1612223383edSEnrico Granata             }
1613a73b7df7SEnrico Granata             if (funct_name_str.empty())
1614223383edSEnrico Granata             {
16150a305db7SEnrico Granata                 out_stream->Printf ("Unable to obtain a function name: no script attached.\n");
1616223383edSEnrico Granata                 out_stream->Flush();
1617223383edSEnrico Granata                 return;
1618223383edSEnrico Granata             }
1619223383edSEnrico Granata             // everything should be fine now, let's add this alias
1620223383edSEnrico Granata 
1621223383edSEnrico Granata             CommandObjectSP command_obj_sp(new CommandObjectPythonFunction(m_interpreter,
1622223383edSEnrico Granata                                                                            m_cmd_name,
1623a73b7df7SEnrico Granata                                                                            funct_name_str.c_str(),
16240a305db7SEnrico Granata                                                                            m_synchronous));
1625223383edSEnrico Granata 
16260a305db7SEnrico Granata             if (!m_interpreter.AddUserCommand(m_cmd_name, command_obj_sp, true))
1627223383edSEnrico Granata             {
16280a305db7SEnrico Granata                 out_stream->Printf ("Unable to add selected command: no script attached.\n");
1629223383edSEnrico Granata                 out_stream->Flush();
1630223383edSEnrico Granata                 return;
1631223383edSEnrico Granata             }
1632223383edSEnrico Granata         }
1633223383edSEnrico Granata     };
1634223383edSEnrico Granata 
1635223383edSEnrico Granata public:
1636223383edSEnrico Granata     CommandObjectCommandsScriptAdd(CommandInterpreter &interpreter) :
1637223383edSEnrico Granata     CommandObject (interpreter,
1638223383edSEnrico Granata                    "command script add",
1639223383edSEnrico Granata                    "Add a scripted function as an LLDB command.",
1640223383edSEnrico Granata                    NULL),
1641223383edSEnrico Granata     m_options (interpreter)
1642223383edSEnrico Granata     {
1643223383edSEnrico Granata         CommandArgumentEntry arg1;
1644223383edSEnrico Granata         CommandArgumentData cmd_arg;
1645223383edSEnrico Granata 
1646223383edSEnrico Granata         // Define the first (and only) variant of this arg.
1647223383edSEnrico Granata         cmd_arg.arg_type = eArgTypeCommandName;
1648223383edSEnrico Granata         cmd_arg.arg_repetition = eArgRepeatPlain;
1649223383edSEnrico Granata 
1650223383edSEnrico Granata         // There is only one variant this argument could be; put it into the argument entry.
1651223383edSEnrico Granata         arg1.push_back (cmd_arg);
1652223383edSEnrico Granata 
1653223383edSEnrico Granata         // Push the data for the first argument into the m_arguments vector.
1654223383edSEnrico Granata         m_arguments.push_back (arg1);
1655223383edSEnrico Granata     }
1656223383edSEnrico Granata 
1657223383edSEnrico Granata     ~CommandObjectCommandsScriptAdd ()
1658223383edSEnrico Granata     {
1659223383edSEnrico Granata     }
1660223383edSEnrico Granata 
1661223383edSEnrico Granata     bool
1662223383edSEnrico Granata     Execute
1663223383edSEnrico Granata     (
1664223383edSEnrico Granata      Args& args,
1665223383edSEnrico Granata      CommandReturnObject &result
1666223383edSEnrico Granata      )
1667223383edSEnrico Granata     {
166899f0b8f9SEnrico Granata 
166999f0b8f9SEnrico Granata         if (m_interpreter.GetDebugger().GetScriptLanguage() != lldb::eScriptLanguagePython)
167099f0b8f9SEnrico Granata         {
167199f0b8f9SEnrico Granata             result.AppendError ("only scripting language supported for scripted commands is currently Python");
167299f0b8f9SEnrico Granata             result.SetStatus (eReturnStatusFailed);
167399f0b8f9SEnrico Granata             return false;
167499f0b8f9SEnrico Granata         }
167599f0b8f9SEnrico Granata 
1676223383edSEnrico Granata         size_t argc = args.GetArgumentCount();
1677223383edSEnrico Granata 
1678223383edSEnrico Granata         if (argc != 1)
1679223383edSEnrico Granata         {
1680223383edSEnrico Granata             result.AppendError ("'command script add' requires one argument");
1681223383edSEnrico Granata             result.SetStatus (eReturnStatusFailed);
1682223383edSEnrico Granata             return false;
1683223383edSEnrico Granata         }
1684223383edSEnrico Granata 
1685223383edSEnrico Granata         std::string cmd_name = args.GetArgumentAtIndex(0);
1686223383edSEnrico Granata 
1687223383edSEnrico Granata         if (m_options.m_funct_name.empty())
1688223383edSEnrico Granata         {
1689223383edSEnrico Granata             InputReaderSP reader_sp (new PythonAliasReader (m_interpreter.GetDebugger(),
1690223383edSEnrico Granata                                                             m_interpreter,
16910a305db7SEnrico Granata                                                             cmd_name,
16920a305db7SEnrico Granata                                                             m_options.m_synchronous));
1693223383edSEnrico Granata 
1694223383edSEnrico Granata             if (reader_sp)
1695223383edSEnrico Granata             {
1696223383edSEnrico Granata 
1697223383edSEnrico Granata                 InputReaderEZ::InitializationParameters ipr;
1698223383edSEnrico Granata 
1699223383edSEnrico Granata                 Error err (reader_sp->Initialize (ipr.SetBaton(NULL).SetPrompt("     ")));
1700223383edSEnrico Granata                 if (err.Success())
1701223383edSEnrico Granata                 {
1702223383edSEnrico Granata                     m_interpreter.GetDebugger().PushInputReader (reader_sp);
1703223383edSEnrico Granata                     result.SetStatus (eReturnStatusSuccessFinishNoResult);
1704223383edSEnrico Granata                 }
1705223383edSEnrico Granata                 else
1706223383edSEnrico Granata                 {
1707223383edSEnrico Granata                     result.AppendError (err.AsCString());
1708223383edSEnrico Granata                     result.SetStatus (eReturnStatusFailed);
1709223383edSEnrico Granata                 }
1710223383edSEnrico Granata             }
1711223383edSEnrico Granata             else
1712223383edSEnrico Granata             {
1713223383edSEnrico Granata                 result.AppendError("out of memory");
1714223383edSEnrico Granata                 result.SetStatus (eReturnStatusFailed);
1715223383edSEnrico Granata             }
1716223383edSEnrico Granata         }
1717223383edSEnrico Granata         else
1718223383edSEnrico Granata         {
17190a305db7SEnrico Granata             CommandObjectSP new_cmd(new CommandObjectPythonFunction(m_interpreter,
17200a305db7SEnrico Granata                                                                     cmd_name,
17210a305db7SEnrico Granata                                                                     m_options.m_funct_name,
17220a305db7SEnrico Granata                                                                     m_options.m_synchronous));
17230a305db7SEnrico Granata             if (m_interpreter.AddUserCommand(cmd_name, new_cmd, true))
1724223383edSEnrico Granata             {
1725223383edSEnrico Granata                 result.SetStatus (eReturnStatusSuccessFinishNoResult);
1726223383edSEnrico Granata             }
1727223383edSEnrico Granata             else
1728223383edSEnrico Granata             {
1729223383edSEnrico Granata                 result.AppendError("cannot add command");
1730223383edSEnrico Granata                 result.SetStatus (eReturnStatusFailed);
1731223383edSEnrico Granata             }
1732223383edSEnrico Granata         }
1733223383edSEnrico Granata 
1734223383edSEnrico Granata         return result.Succeeded();
1735223383edSEnrico Granata 
1736223383edSEnrico Granata     }
1737223383edSEnrico Granata };
1738223383edSEnrico Granata 
17390a305db7SEnrico Granata static OptionEnumValueElement g_script_synchro_type[] =
17400a305db7SEnrico Granata {
17410a305db7SEnrico Granata     { eScriptedCommandSynchronicitySynchronous,      "synchronous",       "Run synchronous"},
17420a305db7SEnrico Granata     { eScriptedCommandSynchronicityAsynchronous,     "asynchronous",      "Run asynchronous"},
17430a305db7SEnrico Granata     { eScriptedCommandSynchronicityCurrentValue,     "current",           "Do not alter current setting"},
17440a305db7SEnrico Granata     { 0, NULL, NULL }
17450a305db7SEnrico Granata };
17460a305db7SEnrico Granata 
1747223383edSEnrico Granata OptionDefinition
1748223383edSEnrico Granata CommandObjectCommandsScriptAdd::CommandOptions::g_option_table[] =
1749223383edSEnrico Granata {
17509128ee2fSEnrico Granata     { LLDB_OPT_SET_1, false, "function", 'f', required_argument, NULL, 0, eArgTypePythonFunction,        "Name of the Python function to bind to this command name."},
17510a305db7SEnrico Granata     { LLDB_OPT_SET_1, false, "synchronicity", 's', required_argument, g_script_synchro_type, 0, eArgTypeScriptedCommandSynchronicity,        "Set the synchronicity of this command's executions with regard to LLDB event system."},
1752223383edSEnrico Granata     { 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
1753223383edSEnrico Granata };
1754223383edSEnrico Granata 
1755223383edSEnrico Granata //-------------------------------------------------------------------------
1756223383edSEnrico Granata // CommandObjectCommandsScriptList
1757223383edSEnrico Granata //-------------------------------------------------------------------------
1758223383edSEnrico Granata 
1759223383edSEnrico Granata class CommandObjectCommandsScriptList : public CommandObject
1760223383edSEnrico Granata {
1761223383edSEnrico Granata private:
1762223383edSEnrico Granata 
1763223383edSEnrico Granata public:
1764223383edSEnrico Granata     CommandObjectCommandsScriptList(CommandInterpreter &interpreter) :
1765223383edSEnrico Granata     CommandObject (interpreter,
1766223383edSEnrico Granata                    "command script list",
1767223383edSEnrico Granata                    "List defined scripted commands.",
1768223383edSEnrico Granata                    NULL)
1769223383edSEnrico Granata     {
1770223383edSEnrico Granata     }
1771223383edSEnrico Granata 
1772223383edSEnrico Granata     ~CommandObjectCommandsScriptList ()
1773223383edSEnrico Granata     {
1774223383edSEnrico Granata     }
1775223383edSEnrico Granata 
1776223383edSEnrico Granata     bool
1777223383edSEnrico Granata     Execute
1778223383edSEnrico Granata     (
1779223383edSEnrico Granata      Args& args,
1780223383edSEnrico Granata      CommandReturnObject &result
1781223383edSEnrico Granata      )
1782223383edSEnrico Granata     {
1783223383edSEnrico Granata 
1784223383edSEnrico Granata         m_interpreter.GetHelp(result,
1785223383edSEnrico Granata                               CommandInterpreter::eCommandTypesUserDef);
1786223383edSEnrico Granata 
1787223383edSEnrico Granata         result.SetStatus (eReturnStatusSuccessFinishResult);
1788223383edSEnrico Granata 
1789223383edSEnrico Granata         return true;
1790223383edSEnrico Granata 
1791223383edSEnrico Granata 
1792223383edSEnrico Granata     }
1793223383edSEnrico Granata };
1794223383edSEnrico Granata 
1795223383edSEnrico Granata //-------------------------------------------------------------------------
1796223383edSEnrico Granata // CommandObjectCommandsScriptClear
1797223383edSEnrico Granata //-------------------------------------------------------------------------
1798223383edSEnrico Granata 
1799223383edSEnrico Granata class CommandObjectCommandsScriptClear : public CommandObject
1800223383edSEnrico Granata {
1801223383edSEnrico Granata private:
1802223383edSEnrico Granata 
1803223383edSEnrico Granata public:
1804223383edSEnrico Granata     CommandObjectCommandsScriptClear(CommandInterpreter &interpreter) :
1805223383edSEnrico Granata     CommandObject (interpreter,
1806223383edSEnrico Granata                    "command script clear",
1807223383edSEnrico Granata                    "Delete all scripted commands.",
1808223383edSEnrico Granata                    NULL)
1809223383edSEnrico Granata     {
1810223383edSEnrico Granata     }
1811223383edSEnrico Granata 
1812223383edSEnrico Granata     ~CommandObjectCommandsScriptClear ()
1813223383edSEnrico Granata     {
1814223383edSEnrico Granata     }
1815223383edSEnrico Granata 
1816223383edSEnrico Granata     bool
1817223383edSEnrico Granata     Execute
1818223383edSEnrico Granata     (
1819223383edSEnrico Granata      Args& args,
1820223383edSEnrico Granata      CommandReturnObject &result
1821223383edSEnrico Granata      )
1822223383edSEnrico Granata     {
1823223383edSEnrico Granata 
1824223383edSEnrico Granata         m_interpreter.RemoveAllUser();
1825223383edSEnrico Granata 
1826223383edSEnrico Granata         result.SetStatus (eReturnStatusSuccessFinishResult);
1827223383edSEnrico Granata 
1828223383edSEnrico Granata         return true;
1829223383edSEnrico Granata 
1830223383edSEnrico Granata 
1831223383edSEnrico Granata     }
1832223383edSEnrico Granata };
1833223383edSEnrico Granata 
1834223383edSEnrico Granata //-------------------------------------------------------------------------
1835223383edSEnrico Granata // CommandObjectCommandsScriptDelete
1836223383edSEnrico Granata //-------------------------------------------------------------------------
1837223383edSEnrico Granata 
1838223383edSEnrico Granata class CommandObjectCommandsScriptDelete : public CommandObject
1839223383edSEnrico Granata {
1840223383edSEnrico Granata private:
1841223383edSEnrico Granata 
1842223383edSEnrico Granata public:
1843223383edSEnrico Granata     CommandObjectCommandsScriptDelete(CommandInterpreter &interpreter) :
1844223383edSEnrico Granata     CommandObject (interpreter,
1845223383edSEnrico Granata                    "command script delete",
1846223383edSEnrico Granata                    "Delete a scripted command.",
1847223383edSEnrico Granata                    NULL)
1848223383edSEnrico Granata     {
1849223383edSEnrico Granata         CommandArgumentEntry arg1;
1850223383edSEnrico Granata         CommandArgumentData cmd_arg;
1851223383edSEnrico Granata 
1852223383edSEnrico Granata         // Define the first (and only) variant of this arg.
1853223383edSEnrico Granata         cmd_arg.arg_type = eArgTypeCommandName;
1854223383edSEnrico Granata         cmd_arg.arg_repetition = eArgRepeatPlain;
1855223383edSEnrico Granata 
1856223383edSEnrico Granata         // There is only one variant this argument could be; put it into the argument entry.
1857223383edSEnrico Granata         arg1.push_back (cmd_arg);
1858223383edSEnrico Granata 
1859223383edSEnrico Granata         // Push the data for the first argument into the m_arguments vector.
1860223383edSEnrico Granata         m_arguments.push_back (arg1);
1861223383edSEnrico Granata     }
1862223383edSEnrico Granata 
1863223383edSEnrico Granata     ~CommandObjectCommandsScriptDelete ()
1864223383edSEnrico Granata     {
1865223383edSEnrico Granata     }
1866223383edSEnrico Granata 
1867223383edSEnrico Granata     bool
1868223383edSEnrico Granata     Execute
1869223383edSEnrico Granata     (
1870223383edSEnrico Granata      Args& args,
1871223383edSEnrico Granata      CommandReturnObject &result
1872223383edSEnrico Granata      )
1873223383edSEnrico Granata     {
1874223383edSEnrico Granata 
1875223383edSEnrico Granata         size_t argc = args.GetArgumentCount();
1876223383edSEnrico Granata 
1877223383edSEnrico Granata         if (argc != 1)
1878223383edSEnrico Granata         {
1879223383edSEnrico Granata             result.AppendError ("'command script delete' requires one argument");
1880223383edSEnrico Granata             result.SetStatus (eReturnStatusFailed);
1881223383edSEnrico Granata             return false;
1882223383edSEnrico Granata         }
1883223383edSEnrico Granata 
1884223383edSEnrico Granata         const char* cmd_name = args.GetArgumentAtIndex(0);
1885223383edSEnrico Granata 
1886223383edSEnrico Granata         if (cmd_name && *cmd_name && m_interpreter.HasUserCommands() && m_interpreter.UserCommandExists(cmd_name))
1887223383edSEnrico Granata         {
1888223383edSEnrico Granata             m_interpreter.RemoveUser(cmd_name);
1889223383edSEnrico Granata             result.SetStatus (eReturnStatusSuccessFinishResult);
1890223383edSEnrico Granata         }
1891223383edSEnrico Granata         else
1892223383edSEnrico Granata         {
1893223383edSEnrico Granata             result.AppendErrorWithFormat ("command %s not found", cmd_name);
1894223383edSEnrico Granata             result.SetStatus (eReturnStatusFailed);
1895223383edSEnrico Granata         }
1896223383edSEnrico Granata 
1897223383edSEnrico Granata         return result.Succeeded();
1898223383edSEnrico Granata 
1899223383edSEnrico Granata     }
1900223383edSEnrico Granata };
1901223383edSEnrico Granata 
1902223383edSEnrico Granata #pragma mark CommandObjectMultiwordCommandsScript
1903223383edSEnrico Granata 
1904223383edSEnrico Granata //-------------------------------------------------------------------------
1905223383edSEnrico Granata // CommandObjectMultiwordCommandsScript
1906223383edSEnrico Granata //-------------------------------------------------------------------------
1907223383edSEnrico Granata 
1908223383edSEnrico Granata class CommandObjectMultiwordCommandsScript : public CommandObjectMultiword
1909223383edSEnrico Granata {
1910223383edSEnrico Granata public:
1911223383edSEnrico Granata     CommandObjectMultiwordCommandsScript (CommandInterpreter &interpreter) :
1912223383edSEnrico Granata     CommandObjectMultiword (interpreter,
1913223383edSEnrico Granata                             "command script",
1914223383edSEnrico Granata                             "A set of commands for managing or customizing script commands.",
1915223383edSEnrico Granata                             "command script <subcommand> [<subcommand-options>]")
1916223383edSEnrico Granata     {
1917223383edSEnrico Granata         LoadSubCommand ("add",  CommandObjectSP (new CommandObjectCommandsScriptAdd (interpreter)));
1918223383edSEnrico Granata         LoadSubCommand ("delete",   CommandObjectSP (new CommandObjectCommandsScriptDelete (interpreter)));
1919223383edSEnrico Granata         LoadSubCommand ("clear", CommandObjectSP (new CommandObjectCommandsScriptClear (interpreter)));
1920223383edSEnrico Granata         LoadSubCommand ("list",   CommandObjectSP (new CommandObjectCommandsScriptList (interpreter)));
1921a9dbf432SEnrico Granata         LoadSubCommand ("import",   CommandObjectSP (new CommandObjectCommandsScriptImport (interpreter)));
1922223383edSEnrico Granata     }
1923223383edSEnrico Granata 
1924223383edSEnrico Granata     ~CommandObjectMultiwordCommandsScript ()
1925223383edSEnrico Granata     {
1926223383edSEnrico Granata     }
1927223383edSEnrico Granata 
1928223383edSEnrico Granata };
1929223383edSEnrico Granata 
1930223383edSEnrico Granata 
1931ebc09c36SJim Ingham #pragma mark CommandObjectMultiwordCommands
1932ebc09c36SJim Ingham 
1933ebc09c36SJim Ingham //-------------------------------------------------------------------------
1934ebc09c36SJim Ingham // CommandObjectMultiwordCommands
1935ebc09c36SJim Ingham //-------------------------------------------------------------------------
1936ebc09c36SJim Ingham 
1937ebc09c36SJim Ingham CommandObjectMultiwordCommands::CommandObjectMultiwordCommands (CommandInterpreter &interpreter) :
1938a7015092SGreg Clayton     CommandObjectMultiword (interpreter,
19390e5e5a79SGreg Clayton                             "command",
19403f4c09c1SCaroline Tice                             "A set of commands for managing or customizing the debugger commands.",
19410e5e5a79SGreg Clayton                             "command <subcommand> [<subcommand-options>]")
1942ebc09c36SJim Ingham {
1943a7015092SGreg Clayton     LoadSubCommand ("source",  CommandObjectSP (new CommandObjectCommandsSource (interpreter)));
1944a7015092SGreg Clayton     LoadSubCommand ("alias",   CommandObjectSP (new CommandObjectCommandsAlias (interpreter)));
1945a7015092SGreg Clayton     LoadSubCommand ("unalias", CommandObjectSP (new CommandObjectCommandsUnalias (interpreter)));
1946de164aaaSGreg Clayton     LoadSubCommand ("regex",   CommandObjectSP (new CommandObjectCommandsAddRegex (interpreter)));
1947a5a97ebeSJim Ingham     LoadSubCommand ("history",   CommandObjectSP (new CommandObjectCommandsHistory (interpreter)));
1948223383edSEnrico Granata     LoadSubCommand ("script",   CommandObjectSP (new CommandObjectMultiwordCommandsScript (interpreter)));
1949ebc09c36SJim Ingham }
1950ebc09c36SJim Ingham 
1951ebc09c36SJim Ingham CommandObjectMultiwordCommands::~CommandObjectMultiwordCommands ()
1952ebc09c36SJim Ingham {
1953ebc09c36SJim Ingham }
1954ebc09c36SJim Ingham 
1955