CommandObjectCommands.cpp revision 40e482434007a7cac49fb1f437fe7d13db2cf523
1767af88aa617288e584afcfed055f7755e408542Jim Ingham//===-- CommandObjectSource.cpp ---------------------------------*- C++ -*-===//
2767af88aa617288e584afcfed055f7755e408542Jim Ingham//
3767af88aa617288e584afcfed055f7755e408542Jim Ingham//                     The LLVM Compiler Infrastructure
4767af88aa617288e584afcfed055f7755e408542Jim Ingham//
5767af88aa617288e584afcfed055f7755e408542Jim Ingham// This file is distributed under the University of Illinois Open Source
6767af88aa617288e584afcfed055f7755e408542Jim Ingham// License. See LICENSE.TXT for details.
7767af88aa617288e584afcfed055f7755e408542Jim Ingham//
8767af88aa617288e584afcfed055f7755e408542Jim Ingham//===----------------------------------------------------------------------===//
9767af88aa617288e584afcfed055f7755e408542Jim Ingham
10767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "CommandObjectCommands.h"
11767af88aa617288e584afcfed055f7755e408542Jim Ingham
12767af88aa617288e584afcfed055f7755e408542Jim Ingham// C Includes
13767af88aa617288e584afcfed055f7755e408542Jim Ingham// C++ Includes
14767af88aa617288e584afcfed055f7755e408542Jim Ingham// Other libraries and framework includes
1540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton#include "llvm/ADT/StringRef.h"
1640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
17767af88aa617288e584afcfed055f7755e408542Jim Ingham// Project includes
18767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Core/Debugger.h"
19d12aeab33bab559e138307f599077da3918a3238Greg Clayton#include "lldb/Core/InputReader.h"
20d12aeab33bab559e138307f599077da3918a3238Greg Clayton#include "lldb/Interpreter/Args.h"
21767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandInterpreter.h"
22d12aeab33bab559e138307f599077da3918a3238Greg Clayton#include "lldb/Interpreter/CommandObjectRegexCommand.h"
23767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/CommandReturnObject.h"
24767af88aa617288e584afcfed055f7755e408542Jim Ingham#include "lldb/Interpreter/Options.h"
25767af88aa617288e584afcfed055f7755e408542Jim Ingham
26767af88aa617288e584afcfed055f7755e408542Jim Inghamusing namespace lldb;
27767af88aa617288e584afcfed055f7755e408542Jim Inghamusing namespace lldb_private;
28767af88aa617288e584afcfed055f7755e408542Jim Ingham
29767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
30767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectCommandsSource
31767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
32767af88aa617288e584afcfed055f7755e408542Jim Ingham
33767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectCommandsSource : public CommandObject
34767af88aa617288e584afcfed055f7755e408542Jim Ingham{
35949d5acde6684b5824a26034457410cdf3823dfeJim Inghamprivate:
36949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
37949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    class CommandOptions : public Options
38949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
39949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    public:
40949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
41f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        CommandOptions (CommandInterpreter &interpreter) :
42f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton            Options (interpreter)
43f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        {
44f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        }
45949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
46949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        virtual
47949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        ~CommandOptions (){}
48949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
49949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        virtual Error
50143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx, const char *option_arg)
51949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
52949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            Error error;
53949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            char short_option = (char) m_getopt_table[option_idx].val;
54949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            bool success;
55949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
56949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            switch (short_option)
57949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            {
58949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                case 'e':
59949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    m_stop_on_error = Args::StringToBoolean(option_arg, true, &success);
60949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    if (!success)
61949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                        error.SetErrorStringWithFormat("Invalid value for stop-on-error: %s.\n", option_arg);
62949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    break;
63949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                case 'c':
64949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    m_stop_on_continue = Args::StringToBoolean(option_arg, true, &success);
65949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    if (!success)
66949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                        error.SetErrorStringWithFormat("Invalid value for stop-on-continue: %s.\n", option_arg);
67949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    break;
68949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                default:
69949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    error.SetErrorStringWithFormat ("Unrecognized option '%c'.\n", short_option);
70949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                    break;
71949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            }
72949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
73949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            return error;
74949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
75949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
76949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        void
77143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ()
78949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
79949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            m_stop_on_error = true;
80949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            m_stop_on_continue = true;
81949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
82949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
83b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        const OptionDefinition*
84949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        GetDefinitions ()
85949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        {
86949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            return g_option_table;
87949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        }
88949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
89949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // Options table: Required for subclasses of Options.
90949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
91b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton        static OptionDefinition g_option_table[];
92949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
93949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        // Instance variables to hold the values for command options.
94949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
95949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool m_stop_on_error;
96949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        bool m_stop_on_continue;
97949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    };
98949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
99949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    CommandOptions m_options;
100949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
101949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    virtual Options *
102949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    GetOptions ()
103949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    {
104949d5acde6684b5824a26034457410cdf3823dfeJim Ingham        return &m_options;
105949d5acde6684b5824a26034457410cdf3823dfeJim Ingham    }
106949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
107767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
108238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectCommandsSource(CommandInterpreter &interpreter) :
109238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
11040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                       "command source",
111238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                       "Read in debugger commands from the file <filename> and execute them.",
112f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton                       NULL),
113f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton        m_options (interpreter)
114767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
11543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
11643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData file_arg;
11743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
11843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
11943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_type = eArgTypeFilename;
12043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        file_arg.arg_repetition = eArgRepeatPlain;
12143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
12243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
12343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (file_arg);
12443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
12543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
12643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
127767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
128767af88aa617288e584afcfed055f7755e408542Jim Ingham
129767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectCommandsSource ()
130767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
131767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
132767af88aa617288e584afcfed055f7755e408542Jim Ingham
133767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
134767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
135767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
136767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
137767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
138767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
139767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
140767af88aa617288e584afcfed055f7755e408542Jim Ingham        const int argc = args.GetArgumentCount();
141767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (argc == 1)
142767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
143767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char *filename = args.GetArgumentAtIndex(0);
144767af88aa617288e584afcfed055f7755e408542Jim Ingham
145767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendMessageWithFormat ("Executing commands in '%s'.\n", filename);
146767af88aa617288e584afcfed055f7755e408542Jim Ingham
147a83ea887f6165d59cfeac1bbb96011f3b0568af8Johnny Chen            FileSpec cmd_file (filename, true);
148949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            ExecutionContext *exe_ctx = NULL;  // Just use the default context.
149949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            bool echo_commands    = true;
150949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            bool print_results    = true;
151949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
152949d5acde6684b5824a26034457410cdf3823dfeJim Ingham            m_interpreter.HandleCommandsFromFile (cmd_file,
153949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                  exe_ctx,
154949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                  m_options.m_stop_on_continue,
155949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                  m_options.m_stop_on_error,
156949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                  echo_commands,
157949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                  print_results,
158949d5acde6684b5824a26034457410cdf3823dfeJim Ingham                                                  result);
159767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
160767af88aa617288e584afcfed055f7755e408542Jim Ingham        else
161767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
162767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendErrorWithFormat("'%s' takes exactly one executable filename argument.\n", GetCommandName());
163767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
164767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
165767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
166767af88aa617288e584afcfed055f7755e408542Jim Ingham
167767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
168767af88aa617288e584afcfed055f7755e408542Jim Ingham};
169767af88aa617288e584afcfed055f7755e408542Jim Ingham
170b344843f75ef893762c93fd0a22d2d45712ce74dGreg ClaytonOptionDefinition
171949d5acde6684b5824a26034457410cdf3823dfeJim InghamCommandObjectCommandsSource::CommandOptions::g_option_table[] =
172949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{
173949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{ LLDB_OPT_SET_ALL, false, "stop-on-error", 'e', required_argument, NULL, 0, eArgTypeBoolean,    "If true, stop executing commands on error."},
174949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{ LLDB_OPT_SET_ALL, false, "stop-on-continue", 'c', required_argument, NULL, 0, eArgTypeBoolean, "If true, stop executing commands on continue."},
175949d5acde6684b5824a26034457410cdf3823dfeJim Ingham{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
176949d5acde6684b5824a26034457410cdf3823dfeJim Ingham};
177949d5acde6684b5824a26034457410cdf3823dfeJim Ingham
178767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectCommandsAlias
179767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
180767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectCommandsAlias
181767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
182767af88aa617288e584afcfed055f7755e408542Jim Ingham
183767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectCommandsAlias : public CommandObject
184767af88aa617288e584afcfed055f7755e408542Jim Ingham{
185767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
186238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectCommandsAlias (CommandInterpreter &interpreter) :
187238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
18840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                       "command alias",
189abb507ae79e20ab2dd8365049921df73a24c95a5Caroline Tice                       "Allow users to define their own debugger command abbreviations.",
19043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       NULL)
191767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
192767af88aa617288e584afcfed055f7755e408542Jim Ingham        SetHelpLong(
193767af88aa617288e584afcfed055f7755e408542Jim Ingham    "'alias' allows the user to create a short-cut or abbreviation for long \n\
194767af88aa617288e584afcfed055f7755e408542Jim Ingham    commands, multi-word commands, and commands that take particular options. \n\
195767af88aa617288e584afcfed055f7755e408542Jim Ingham    Below are some simple examples of how one might use the 'alias' command: \n\
19631fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    \n    'commands alias sc script'           // Creates the abbreviation 'sc' for the 'script' \n\
19731fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice                                         // command. \n\
19831fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    'commands alias bp breakpoint'       // Creates the abbreviation 'bp' for the 'breakpoint' \n\
19931fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice                                         // command.  Since breakpoint commands are two-word \n\
20031fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice                                         // commands, the user will still need to enter the \n\
20131fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice                                         // second word after 'bp', e.g. 'bp enable' or \n\
20231fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice                                         // 'bp delete'. \n\
20331fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    'commands alias bpl breakpoint list' // Creates the abbreviation 'bpl' for the \n\
20431fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice                                         // two-word command 'breakpoint list'. \n\
205767af88aa617288e584afcfed055f7755e408542Jim Ingham    \nAn alias can include some options for the command, with the values either \n\
206767af88aa617288e584afcfed055f7755e408542Jim Ingham    filled in at the time the alias is created, or specified as positional \n\
207767af88aa617288e584afcfed055f7755e408542Jim Ingham    arguments, to be filled in when the alias is invoked.  The following example \n\
208767af88aa617288e584afcfed055f7755e408542Jim Ingham    shows how to create aliases with options: \n\
209767af88aa617288e584afcfed055f7755e408542Jim Ingham    \n\
21031fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    'commands alias bfl breakpoint set -f %1 -l %2' \n\
211767af88aa617288e584afcfed055f7755e408542Jim Ingham    \nThis creates the abbreviation 'bfl' (for break-file-line), with the -f and -l \n\
212767af88aa617288e584afcfed055f7755e408542Jim Ingham    options already part of the alias.  So if the user wants to set a breakpoint \n\
213767af88aa617288e584afcfed055f7755e408542Jim Ingham    by file and line without explicitly having to use the -f and -l options, the \n\
214767af88aa617288e584afcfed055f7755e408542Jim Ingham    user can now use 'bfl' instead.  The '%1' and '%2' are positional placeholders \n\
215767af88aa617288e584afcfed055f7755e408542Jim Ingham    for the actual arguments that will be passed when the alias command is used. \n\
216767af88aa617288e584afcfed055f7755e408542Jim Ingham    The number in the placeholder refers to the position/order the actual value \n\
217767af88aa617288e584afcfed055f7755e408542Jim Ingham    occupies when the alias is used.  So all the occurrences of '%1' in the alias \n\
218767af88aa617288e584afcfed055f7755e408542Jim Ingham    will be replaced with the first argument, all the occurrences of '%2' in the \n\
219767af88aa617288e584afcfed055f7755e408542Jim Ingham    alias will be replaced with the second argument, and so on.  This also allows \n\
220767af88aa617288e584afcfed055f7755e408542Jim Ingham    actual arguments to be used multiple times within an alias (see 'process \n\
221767af88aa617288e584afcfed055f7755e408542Jim Ingham    launch' example below).  So in the 'bfl' case, the actual file value will be \n\
222767af88aa617288e584afcfed055f7755e408542Jim Ingham    filled in with the first argument following 'bfl' and the actual line number \n\
223767af88aa617288e584afcfed055f7755e408542Jim Ingham    value will be filled in with the second argument.  The user would use this \n\
224767af88aa617288e584afcfed055f7755e408542Jim Ingham    alias as follows: \n\
22531fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    \n    (lldb)  commands alias bfl breakpoint set -f %1 -l %2 \n\
226a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan    <... some time later ...> \n\
22731fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    (lldb)  bfl my-file.c 137 \n\
228767af88aa617288e584afcfed055f7755e408542Jim Ingham    \nThis would be the same as if the user had entered \n\
229767af88aa617288e584afcfed055f7755e408542Jim Ingham    'breakpoint set -f my-file.c -l 137'. \n\
230767af88aa617288e584afcfed055f7755e408542Jim Ingham    \nAnother example: \n\
23131fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    \n    (lldb)  commands alias pltty  process launch -s -o %1 -e %1 \n\
23231fbb64aee1432672f776610e15466cbdc2f9795Caroline Tice    (lldb)  pltty /dev/tty0 \n\
233a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan           // becomes 'process launch -s -o /dev/tty0 -e /dev/tty0' \n\
234767af88aa617288e584afcfed055f7755e408542Jim Ingham    \nIf the user always wanted to pass the same value to a particular option, the \n\
235767af88aa617288e584afcfed055f7755e408542Jim Ingham    alias could be defined with that value directly in the alias as a constant, \n\
236767af88aa617288e584afcfed055f7755e408542Jim Ingham    rather than using a positional placeholder: \n\
237a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan    \n    commands alias bl3  breakpoint set -f %1 -l 3  // Always sets a breakpoint on line \n\
238a3aff73b5151c97b3adb1cea3022df967e33db45Sean Callanan                                                   // 3 of whatever file is indicated. \n");
239767af88aa617288e584afcfed055f7755e408542Jim Ingham
24043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg1;
24143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg2;
24243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg3;
24343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData alias_arg;
24443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData cmd_arg;
24543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData options_arg;
24643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
24743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
24843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        alias_arg.arg_type = eArgTypeAliasName;
24943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        alias_arg.arg_repetition = eArgRepeatPlain;
25043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
25143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
25243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg1.push_back (alias_arg);
25343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
25443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
25543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        cmd_arg.arg_type = eArgTypeCommandName;
25643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        cmd_arg.arg_repetition = eArgRepeatPlain;
25743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
25843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
25943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg2.push_back (cmd_arg);
26043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
26143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
26243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        options_arg.arg_type = eArgTypeAliasOptions;
26343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        options_arg.arg_repetition = eArgRepeatOptional;
26443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
26543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
26643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg3.push_back (options_arg);
26743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
26843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
26943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg1);
27043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg2);
27143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg3);
272767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
273767af88aa617288e584afcfed055f7755e408542Jim Ingham
274767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectCommandsAlias ()
275767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
276767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
277767af88aa617288e584afcfed055f7755e408542Jim Ingham
278e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool
279e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    WantsRawCommandString ()
280e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
281e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        return true;
282e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
283e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
284e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    bool
285e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    ExecuteRawCommandString (const char *raw_command_line, CommandReturnObject &result)
286e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    {
287e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        Args args (raw_command_line);
288e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        std::string raw_command_string (raw_command_line);
289e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
290e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        size_t argc = args.GetArgumentCount();
291e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
292e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (argc < 2)
293e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
294e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendError ("'alias' requires at least two arguments");
295e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.SetStatus (eReturnStatusFailed);
296e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            return false;
297e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
298e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
299e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // Get the alias command.
300e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
301e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        const std::string alias_command = args.GetArgumentAtIndex (0);
302e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
303e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // Strip the new alias name off 'raw_command_string'  (leave it on args, which gets passed to 'Execute', which
304e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // does the stripping itself.
305e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        size_t pos = raw_command_string.find (alias_command);
306e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (pos == 0)
307e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
308e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            raw_command_string = raw_command_string.substr (alias_command.size());
309e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            pos = raw_command_string.find_first_not_of (' ');
310e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if ((pos != std::string::npos) && (pos > 0))
311e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                raw_command_string = raw_command_string.substr (pos);
312e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
313e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
314e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
315e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendError ("Error parsing command string.  No alias created.");
316e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.SetStatus (eReturnStatusFailed);
317e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            return false;
318e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
319e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
320e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
321e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // Verify that the command is alias-able.
322e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (m_interpreter.CommandExists (alias_command.c_str()))
323e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
324e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n",
325e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                          alias_command.c_str());
326e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.SetStatus (eReturnStatusFailed);
327e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            return false;
328e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
329e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
330e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // Get CommandObject that is being aliased. The command name is read from the front of raw_command_string.
331e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        // raw_command_string is returned with the name of the command object stripped off the front.
332e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        CommandObject *cmd_obj = m_interpreter.GetCommandObjectForCommand (raw_command_string);
333e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
334e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        if (!cmd_obj)
335e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
336e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.AppendErrorWithFormat ("Invalid command given to 'alias'. '%s' does not begin with a valid command."
337e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                          "  No alias created.", raw_command_string.c_str());
338e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            result.SetStatus (eReturnStatusFailed);
339e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            return false;
340e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
341e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else if (!cmd_obj->WantsRawCommandString ())
342e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
343e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Note that args was initialized with the original command, and has not been updated to this point.
344e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Therefore can we pass it to the version of Execute that does not need/expect raw input in the alias.
345e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            return Execute (args, result);
346e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
347e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        else
348e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        {
349e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Verify & handle any options/arguments passed to the alias command
350e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
351e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector);
352e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
353e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
354e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Check to see if there's anything left in the input command string.
355e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (raw_command_string.size() > 0)
356e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
357e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
358e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // Check to see if the command being aliased can take any command options.
359e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                Options *options = cmd_obj->GetOptions();
360e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                if (options)
361e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                {
362e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    // See if any options were specified as part of the alias; if so, handle them appropriately
363143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                    options->NotifyOptionParsingStarting ();
364e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    Args tmp_args (raw_command_string.c_str());
365e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    args.Unshift ("dummy_arg");
366e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    args.ParseAliasOptions (*options, result, option_arg_vector, raw_command_string);
367e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    args.Shift ();
368e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    if (result.Succeeded())
369e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        options->VerifyPartialOptions (result);
370e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted)
371e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    {
372e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        result.AppendError ("Unable to create requested alias.\n");
373e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        return false;
374e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    }
375e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                }
376e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                // Anything remaining must be plain raw input.  Push it in as a single raw input argument.
377e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                if (raw_command_string.size() > 0)
378e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    option_arg_vector->push_back (OptionArgPair ("<argument>",
379e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                                                 OptionArgValue (-1,
380e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                                                                  raw_command_string)));
381e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
382e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
383e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            // Create the alias
384e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            if (m_interpreter.AliasExists (alias_command.c_str())
385e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                || m_interpreter.UserCommandExists (alias_command.c_str()))
386e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            {
387e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                OptionArgVectorSP temp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str()));
388e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                if (temp_option_arg_sp.get())
389e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                {
390e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                    if (option_arg_vector->size() == 0)
391e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                        m_interpreter.RemoveAliasOptions (alias_command.c_str());
392e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                }
393e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n",
394e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                                                alias_command.c_str());
395e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            }
396e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice
397e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice            CommandObjectSP cmd_obj_sp = m_interpreter.GetCommandSPExact (cmd_obj->GetCommandName(), false);
39856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            if (cmd_obj_sp)
39956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            {
40056d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                m_interpreter.AddAlias (alias_command.c_str(), cmd_obj_sp);
40156d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                if (option_arg_vector->size() > 0)
40256d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                    m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp);
40356d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                result.SetStatus (eReturnStatusSuccessFinishNoResult);
40456d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            }
40556d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            else
40656d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            {
40756d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                result.AppendError ("Unable to create requested alias.\n");
40856d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice                result.SetStatus (eReturnStatusFailed);
40956d2fc45b9461d50054af20c33b836eb8ebd93f5Caroline Tice            }
410e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        }
411e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice        return result.Succeeded();
412e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice    }
413767af88aa617288e584afcfed055f7755e408542Jim Ingham
414767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
415767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
416767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
417767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
418767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
419767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
420767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
4218bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice        size_t argc = args.GetArgumentCount();
422767af88aa617288e584afcfed055f7755e408542Jim Ingham
423767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (argc < 2)
42454e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        {
425767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendError ("'alias' requires at least two arguments");
426767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
427767af88aa617288e584afcfed055f7755e408542Jim Ingham            return false;
42854e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton        }
429767af88aa617288e584afcfed055f7755e408542Jim Ingham
430767af88aa617288e584afcfed055f7755e408542Jim Ingham        const std::string alias_command = args.GetArgumentAtIndex(0);
431767af88aa617288e584afcfed055f7755e408542Jim Ingham        const std::string actual_command = args.GetArgumentAtIndex(1);
432767af88aa617288e584afcfed055f7755e408542Jim Ingham
433767af88aa617288e584afcfed055f7755e408542Jim Ingham        args.Shift();  // Shift the alias command word off the argument vector.
434767af88aa617288e584afcfed055f7755e408542Jim Ingham        args.Shift();  // Shift the old command word off the argument vector.
435767af88aa617288e584afcfed055f7755e408542Jim Ingham
436767af88aa617288e584afcfed055f7755e408542Jim Ingham        // Verify that the command is alias'able, and get the appropriate command object.
437767af88aa617288e584afcfed055f7755e408542Jim Ingham
438238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        if (m_interpreter.CommandExists (alias_command.c_str()))
439767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
440767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be redefined.\n",
441767af88aa617288e584afcfed055f7755e408542Jim Ingham                                         alias_command.c_str());
442767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
443767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
444767af88aa617288e584afcfed055f7755e408542Jim Ingham        else
445767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
446238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton             CommandObjectSP command_obj_sp(m_interpreter.GetCommandSPExact (actual_command.c_str(), true));
447767af88aa617288e584afcfed055f7755e408542Jim Ingham             CommandObjectSP subcommand_obj_sp;
448767af88aa617288e584afcfed055f7755e408542Jim Ingham             bool use_subcommand = false;
449767af88aa617288e584afcfed055f7755e408542Jim Ingham             if (command_obj_sp.get())
450767af88aa617288e584afcfed055f7755e408542Jim Ingham             {
451767af88aa617288e584afcfed055f7755e408542Jim Ingham                 CommandObject *cmd_obj = command_obj_sp.get();
45254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton                 CommandObject *sub_cmd_obj = NULL;
453767af88aa617288e584afcfed055f7755e408542Jim Ingham                 OptionArgVectorSP option_arg_vector_sp = OptionArgVectorSP (new OptionArgVector);
454767af88aa617288e584afcfed055f7755e408542Jim Ingham                 OptionArgVector *option_arg_vector = option_arg_vector_sp.get();
455767af88aa617288e584afcfed055f7755e408542Jim Ingham
456e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                 while (cmd_obj->IsMultiwordObject() && args.GetArgumentCount() > 0)
457767af88aa617288e584afcfed055f7755e408542Jim Ingham                 {
458767af88aa617288e584afcfed055f7755e408542Jim Ingham                     if (argc >= 3)
459767af88aa617288e584afcfed055f7755e408542Jim Ingham                     {
460767af88aa617288e584afcfed055f7755e408542Jim Ingham                         const std::string sub_command = args.GetArgumentAtIndex(0);
461767af88aa617288e584afcfed055f7755e408542Jim Ingham                         assert (sub_command.length() != 0);
462767af88aa617288e584afcfed055f7755e408542Jim Ingham                         subcommand_obj_sp =
463767af88aa617288e584afcfed055f7755e408542Jim Ingham                                           (((CommandObjectMultiword *) cmd_obj)->GetSubcommandSP (sub_command.c_str()));
464767af88aa617288e584afcfed055f7755e408542Jim Ingham                         if (subcommand_obj_sp.get())
465767af88aa617288e584afcfed055f7755e408542Jim Ingham                         {
466767af88aa617288e584afcfed055f7755e408542Jim Ingham                             sub_cmd_obj = subcommand_obj_sp.get();
467767af88aa617288e584afcfed055f7755e408542Jim Ingham                             use_subcommand = true;
468767af88aa617288e584afcfed055f7755e408542Jim Ingham                             args.Shift();  // Shift the sub_command word off the argument vector.
469e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                             cmd_obj = sub_cmd_obj;
470767af88aa617288e584afcfed055f7755e408542Jim Ingham                         }
471767af88aa617288e584afcfed055f7755e408542Jim Ingham                         else
472767af88aa617288e584afcfed055f7755e408542Jim Ingham                         {
4735d53b621dea6a2ca6ece7528b22d089f864ae18fCaroline Tice                             result.AppendErrorWithFormat("'%s' is not a valid sub-command of '%s'.  "
4745d53b621dea6a2ca6ece7528b22d089f864ae18fCaroline Tice                                                          "Unable to create alias.\n",
4755d53b621dea6a2ca6ece7528b22d089f864ae18fCaroline Tice                                                          sub_command.c_str(), actual_command.c_str());
476767af88aa617288e584afcfed055f7755e408542Jim Ingham                             result.SetStatus (eReturnStatusFailed);
477767af88aa617288e584afcfed055f7755e408542Jim Ingham                             return false;
478767af88aa617288e584afcfed055f7755e408542Jim Ingham                         }
479767af88aa617288e584afcfed055f7755e408542Jim Ingham                     }
480767af88aa617288e584afcfed055f7755e408542Jim Ingham                 }
481767af88aa617288e584afcfed055f7755e408542Jim Ingham
482767af88aa617288e584afcfed055f7755e408542Jim Ingham                 // Verify & handle any options/arguments passed to the alias command
483767af88aa617288e584afcfed055f7755e408542Jim Ingham
484767af88aa617288e584afcfed055f7755e408542Jim Ingham                 if (args.GetArgumentCount () > 0)
485767af88aa617288e584afcfed055f7755e408542Jim Ingham                 {
486767af88aa617288e584afcfed055f7755e408542Jim Ingham                     if ((!use_subcommand && (cmd_obj->GetOptions() != NULL))
487767af88aa617288e584afcfed055f7755e408542Jim Ingham                         || (use_subcommand && (sub_cmd_obj->GetOptions() != NULL)))
488767af88aa617288e584afcfed055f7755e408542Jim Ingham                     {
489767af88aa617288e584afcfed055f7755e408542Jim Ingham                         Options *options;
490767af88aa617288e584afcfed055f7755e408542Jim Ingham                         if (use_subcommand)
491767af88aa617288e584afcfed055f7755e408542Jim Ingham                             options = sub_cmd_obj->GetOptions();
492767af88aa617288e584afcfed055f7755e408542Jim Ingham                         else
493767af88aa617288e584afcfed055f7755e408542Jim Ingham                             options = cmd_obj->GetOptions();
494143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                         options->NotifyOptionParsingStarting ();
495e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                         std::string empty_string;
496767af88aa617288e584afcfed055f7755e408542Jim Ingham                         args.Unshift ("dummy_arg");
497e0da7a5ba288669df3a4d51059aa0f78f729c6b1Caroline Tice                         args.ParseAliasOptions (*options, result, option_arg_vector, empty_string);
498767af88aa617288e584afcfed055f7755e408542Jim Ingham                         args.Shift ();
499767af88aa617288e584afcfed055f7755e408542Jim Ingham                         if (result.Succeeded())
500767af88aa617288e584afcfed055f7755e408542Jim Ingham                             options->VerifyPartialOptions (result);
5018bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice                         if (!result.Succeeded() && result.GetStatus() != lldb::eReturnStatusStarted)
5028bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice                        {
5038bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice                            result.AppendError ("Unable to create requested command alias.\n");
504e6866a3819d68be21004ffdf773e36e7f00a6a26Caroline Tice                            return false;
5058bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice                        }
506767af88aa617288e584afcfed055f7755e408542Jim Ingham                     }
5078bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice
5088bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice                     // Anything remaining in args must be a plain argument.
5098bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice
5108bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice                     argc = args.GetArgumentCount();
5118bb61f099795a3fd98edf655c3e6899cd2668f6cCaroline Tice                     for (size_t i = 0; i < argc; ++i)
51244c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                         if (strcmp (args.GetArgumentAtIndex (i), "") != 0)
51344c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                             option_arg_vector->push_back
51444c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                                           (OptionArgPair ("<argument>",
51544c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                                                           OptionArgValue (-1,
51644c841d68a439da13e3f170427675bff8c7f2731Caroline Tice                                                                           std::string (args.GetArgumentAtIndex (i)))));
517767af88aa617288e584afcfed055f7755e408542Jim Ingham                 }
518767af88aa617288e584afcfed055f7755e408542Jim Ingham
519767af88aa617288e584afcfed055f7755e408542Jim Ingham                 // Create the alias.
520767af88aa617288e584afcfed055f7755e408542Jim Ingham
521238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                 if (m_interpreter.AliasExists (alias_command.c_str())
522238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                     || m_interpreter.UserCommandExists (alias_command.c_str()))
523767af88aa617288e584afcfed055f7755e408542Jim Ingham                 {
524238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                     OptionArgVectorSP tmp_option_arg_sp (m_interpreter.GetAliasOptions (alias_command.c_str()));
525767af88aa617288e584afcfed055f7755e408542Jim Ingham                     if (tmp_option_arg_sp.get())
526767af88aa617288e584afcfed055f7755e408542Jim Ingham                     {
527767af88aa617288e584afcfed055f7755e408542Jim Ingham                         if (option_arg_vector->size() == 0)
528238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                             m_interpreter.RemoveAliasOptions (alias_command.c_str());
529767af88aa617288e584afcfed055f7755e408542Jim Ingham                     }
530767af88aa617288e584afcfed055f7755e408542Jim Ingham                     result.AppendWarningWithFormat ("Overwriting existing definition for '%s'.\n",
531767af88aa617288e584afcfed055f7755e408542Jim Ingham                                                     alias_command.c_str());
532767af88aa617288e584afcfed055f7755e408542Jim Ingham                 }
533767af88aa617288e584afcfed055f7755e408542Jim Ingham
534767af88aa617288e584afcfed055f7755e408542Jim Ingham                 if (use_subcommand)
535238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                     m_interpreter.AddAlias (alias_command.c_str(), subcommand_obj_sp);
536767af88aa617288e584afcfed055f7755e408542Jim Ingham                 else
537238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                     m_interpreter.AddAlias (alias_command.c_str(), command_obj_sp);
538767af88aa617288e584afcfed055f7755e408542Jim Ingham                 if (option_arg_vector->size() > 0)
539238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                     m_interpreter.AddOrReplaceAliasOptions (alias_command.c_str(), option_arg_vector_sp);
540767af88aa617288e584afcfed055f7755e408542Jim Ingham                 result.SetStatus (eReturnStatusSuccessFinishNoResult);
541767af88aa617288e584afcfed055f7755e408542Jim Ingham             }
542767af88aa617288e584afcfed055f7755e408542Jim Ingham             else
543767af88aa617288e584afcfed055f7755e408542Jim Ingham             {
544767af88aa617288e584afcfed055f7755e408542Jim Ingham                 result.AppendErrorWithFormat ("'%s' is not an existing command.\n", actual_command.c_str());
545767af88aa617288e584afcfed055f7755e408542Jim Ingham                 result.SetStatus (eReturnStatusFailed);
546e6866a3819d68be21004ffdf773e36e7f00a6a26Caroline Tice                 return false;
547767af88aa617288e584afcfed055f7755e408542Jim Ingham             }
548767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
549767af88aa617288e584afcfed055f7755e408542Jim Ingham
550767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
551767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
552767af88aa617288e584afcfed055f7755e408542Jim Ingham};
553767af88aa617288e584afcfed055f7755e408542Jim Ingham
554767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectCommandsUnalias
555767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
556767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectCommandsUnalias
557767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
558767af88aa617288e584afcfed055f7755e408542Jim Ingham
559767af88aa617288e584afcfed055f7755e408542Jim Inghamclass CommandObjectCommandsUnalias : public CommandObject
560767af88aa617288e584afcfed055f7755e408542Jim Ingham{
561767af88aa617288e584afcfed055f7755e408542Jim Inghampublic:
562238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectCommandsUnalias (CommandInterpreter &interpreter) :
563238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton        CommandObject (interpreter,
56440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                       "command unalias",
565146292c83470680b98a4e4046428e0849e1ffe8fCaroline Tice                       "Allow the user to remove/delete a user-defined command abbreviation.",
56643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice                       NULL)
567767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
56843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentEntry arg;
56943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        CommandArgumentData alias_arg;
57043b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
57143b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Define the first (and only) variant of this arg.
57243b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        alias_arg.arg_type = eArgTypeAliasName;
57343b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        alias_arg.arg_repetition = eArgRepeatPlain;
57443b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
57543b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // There is only one variant this argument could be; put it into the argument entry.
57643b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        arg.push_back (alias_arg);
57743b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice
57843b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        // Push the data for the first argument into the m_arguments vector.
57943b014aa33e20e61790e16ed69a2c57aae2fbc6eCaroline Tice        m_arguments.push_back (arg);
580767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
581767af88aa617288e584afcfed055f7755e408542Jim Ingham
582767af88aa617288e584afcfed055f7755e408542Jim Ingham    ~CommandObjectCommandsUnalias()
583767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
584767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
585767af88aa617288e584afcfed055f7755e408542Jim Ingham
586767af88aa617288e584afcfed055f7755e408542Jim Ingham
587767af88aa617288e584afcfed055f7755e408542Jim Ingham    bool
588767af88aa617288e584afcfed055f7755e408542Jim Ingham    Execute
589767af88aa617288e584afcfed055f7755e408542Jim Ingham    (
590767af88aa617288e584afcfed055f7755e408542Jim Ingham        Args& args,
591767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandReturnObject &result
592767af88aa617288e584afcfed055f7755e408542Jim Ingham    )
593767af88aa617288e584afcfed055f7755e408542Jim Ingham    {
594767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandObject::CommandMap::iterator pos;
595767af88aa617288e584afcfed055f7755e408542Jim Ingham        CommandObject *cmd_obj;
596767af88aa617288e584afcfed055f7755e408542Jim Ingham
597767af88aa617288e584afcfed055f7755e408542Jim Ingham        if (args.GetArgumentCount() != 0)
598767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
599767af88aa617288e584afcfed055f7755e408542Jim Ingham            const char *command_name = args.GetArgumentAtIndex(0);
600238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton            cmd_obj = m_interpreter.GetCommandObject(command_name);
601767af88aa617288e584afcfed055f7755e408542Jim Ingham            if (cmd_obj)
602767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
603238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                if (m_interpreter.CommandExists (command_name))
604767af88aa617288e584afcfed055f7755e408542Jim Ingham                {
605767af88aa617288e584afcfed055f7755e408542Jim Ingham                    result.AppendErrorWithFormat ("'%s' is a permanent debugger command and cannot be removed.\n",
606767af88aa617288e584afcfed055f7755e408542Jim Ingham                                                  command_name);
607767af88aa617288e584afcfed055f7755e408542Jim Ingham                    result.SetStatus (eReturnStatusFailed);
608767af88aa617288e584afcfed055f7755e408542Jim Ingham                }
609767af88aa617288e584afcfed055f7755e408542Jim Ingham                else
610767af88aa617288e584afcfed055f7755e408542Jim Ingham                {
611767af88aa617288e584afcfed055f7755e408542Jim Ingham
612238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                    if (m_interpreter.RemoveAlias (command_name) == false)
613767af88aa617288e584afcfed055f7755e408542Jim Ingham                    {
614238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                        if (m_interpreter.AliasExists (command_name))
615767af88aa617288e584afcfed055f7755e408542Jim Ingham                            result.AppendErrorWithFormat ("Error occurred while attempting to unalias '%s'.\n",
616767af88aa617288e584afcfed055f7755e408542Jim Ingham                                                          command_name);
617767af88aa617288e584afcfed055f7755e408542Jim Ingham                        else
618767af88aa617288e584afcfed055f7755e408542Jim Ingham                            result.AppendErrorWithFormat ("'%s' is not an existing alias.\n", command_name);
619767af88aa617288e584afcfed055f7755e408542Jim Ingham                        result.SetStatus (eReturnStatusFailed);
620767af88aa617288e584afcfed055f7755e408542Jim Ingham                    }
621767af88aa617288e584afcfed055f7755e408542Jim Ingham                    else
622767af88aa617288e584afcfed055f7755e408542Jim Ingham                        result.SetStatus (eReturnStatusSuccessFinishNoResult);
623767af88aa617288e584afcfed055f7755e408542Jim Ingham                }
624767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
625767af88aa617288e584afcfed055f7755e408542Jim Ingham            else
626767af88aa617288e584afcfed055f7755e408542Jim Ingham            {
627767af88aa617288e584afcfed055f7755e408542Jim Ingham                result.AppendErrorWithFormat ("'%s' is not a known command.\nTry 'help' to see a "
628767af88aa617288e584afcfed055f7755e408542Jim Ingham                                              "current list of commands.\n",
629767af88aa617288e584afcfed055f7755e408542Jim Ingham                                             command_name);
630767af88aa617288e584afcfed055f7755e408542Jim Ingham                result.SetStatus (eReturnStatusFailed);
631767af88aa617288e584afcfed055f7755e408542Jim Ingham            }
632767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
633767af88aa617288e584afcfed055f7755e408542Jim Ingham        else
634767af88aa617288e584afcfed055f7755e408542Jim Ingham        {
635767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.AppendError ("must call 'unalias' with a valid alias");
636767af88aa617288e584afcfed055f7755e408542Jim Ingham            result.SetStatus (eReturnStatusFailed);
637767af88aa617288e584afcfed055f7755e408542Jim Ingham        }
638767af88aa617288e584afcfed055f7755e408542Jim Ingham
639767af88aa617288e584afcfed055f7755e408542Jim Ingham        return result.Succeeded();
640767af88aa617288e584afcfed055f7755e408542Jim Ingham    }
641767af88aa617288e584afcfed055f7755e408542Jim Ingham};
642767af88aa617288e584afcfed055f7755e408542Jim Ingham
643d12aeab33bab559e138307f599077da3918a3238Greg Clayton#pragma mark CommandObjectCommandsAddRegex
644d12aeab33bab559e138307f599077da3918a3238Greg Clayton//-------------------------------------------------------------------------
645d12aeab33bab559e138307f599077da3918a3238Greg Clayton// CommandObjectCommandsAddRegex
646d12aeab33bab559e138307f599077da3918a3238Greg Clayton//-------------------------------------------------------------------------
647d12aeab33bab559e138307f599077da3918a3238Greg Clayton
648d12aeab33bab559e138307f599077da3918a3238Greg Claytonclass CommandObjectCommandsAddRegex : public CommandObject
649d12aeab33bab559e138307f599077da3918a3238Greg Clayton{
650d12aeab33bab559e138307f599077da3918a3238Greg Claytonpublic:
651d12aeab33bab559e138307f599077da3918a3238Greg Clayton    CommandObjectCommandsAddRegex (CommandInterpreter &interpreter) :
652d12aeab33bab559e138307f599077da3918a3238Greg Clayton        CommandObject (interpreter,
65340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                       "command regex",
654d12aeab33bab559e138307f599077da3918a3238Greg Clayton                       "Allow the user to create a regular expression command.",
65540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                       "command regex <cmd-name> [s/<regex>/<subst>/ ...]"),
656d12aeab33bab559e138307f599077da3918a3238Greg Clayton        m_options (interpreter)
657d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
65840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        SetHelpLong(
65940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"This command allows the user to create powerful regular expression commands\n"
66040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"with substitutions. The regular expressions and substitutions are specified\n"
66140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"using the regular exression substitution format of:\n"
66240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n"
66340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"    s/<regex>/<subst>/\n"
66440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n"
66540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"<regex> is a regular expression that can use parenthesis to capture regular\n"
66640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"expression input and substitute the captured matches in the output using %1\n"
66740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"for the first match, %2 for the second, and so on.\n"
66840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n"
66940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"The regular expressions can all be specified on the command line if more than\n"
67040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"one argument is provided. If just the command name is provided on the command\n"
67140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"line, then the regular expressions and substitutions can be entered on separate\n"
67240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton" lines, followed by an empty line to terminate the command definition.\n"
67340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n"
67440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"EXAMPLES\n"
67540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"\n"
67640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"The following example with define a regular expression command named 'f' that\n"
67740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"will call 'finish' if there are no arguments, or 'frame select <frame-idx>' if\n"
67840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"a number follows 'f':\n"
67940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton"(lldb) command regex f s/^$/finish/ 's/([0-9]+)/frame select %1/'\n"
68040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    );
681d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
682d12aeab33bab559e138307f599077da3918a3238Greg Clayton
683d12aeab33bab559e138307f599077da3918a3238Greg Clayton    ~CommandObjectCommandsAddRegex()
684d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
685d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
686d12aeab33bab559e138307f599077da3918a3238Greg Clayton
687d12aeab33bab559e138307f599077da3918a3238Greg Clayton
688d12aeab33bab559e138307f599077da3918a3238Greg Clayton    bool
689d12aeab33bab559e138307f599077da3918a3238Greg Clayton    Execute (Args& args, CommandReturnObject &result)
690d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
69140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        const size_t argc = args.GetArgumentCount();
69240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        if (argc == 0)
693d12aeab33bab559e138307f599077da3918a3238Greg Clayton        {
69440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            result.AppendError ("usage: 'commands regex <command-name> [s/<regex1>/<subst1>/ s/<regex2>/<subst2>/ ...]'\n");
69540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            result.SetStatus (eReturnStatusFailed);
69640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
69740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        else
69840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
69940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            Error error;
700d12aeab33bab559e138307f599077da3918a3238Greg Clayton            const char *name = args.GetArgumentAtIndex(0);
701d12aeab33bab559e138307f599077da3918a3238Greg Clayton            m_regex_cmd_ap.reset (new CommandObjectRegexCommand (m_interpreter,
702d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                                 name,
703d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                                 m_options.GetHelp (),
704d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                                 m_options.GetSyntax (),
705d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                                 10));
70640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
70740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            if (argc == 1)
708d12aeab33bab559e138307f599077da3918a3238Greg Clayton            {
70940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                InputReaderSP reader_sp (new InputReader(m_interpreter.GetDebugger()));
71040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                if (reader_sp)
71140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                {
71240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    error =reader_sp->Initialize (CommandObjectCommandsAddRegex::InputReaderCallback,
713d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                  this,                         // baton
714d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                  eInputReaderGranularityLine,  // token size, to pass to callback function
71540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                                  NULL,                         // end token
716d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                  "> ",                         // prompt
71740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                                  true);                        // echo input
71840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    if (error.Success())
71940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    {
72040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                        m_interpreter.GetDebugger().PushInputReader (reader_sp);
72140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                        result.SetStatus (eReturnStatusSuccessFinishNoResult);
72240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                        return true;
72340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    }
72440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                }
72540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            }
72640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            else
72740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            {
72840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                for (size_t arg_idx = 1; arg_idx < argc; ++arg_idx)
729d12aeab33bab559e138307f599077da3918a3238Greg Clayton                {
73040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    llvm::StringRef arg_strref (args.GetArgumentAtIndex(arg_idx));
73140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    error = AppendRegexSubstitution (arg_strref);
73240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    if (error.Fail())
73340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                        break;
734d12aeab33bab559e138307f599077da3918a3238Greg Clayton                }
73540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
73640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                if (error.Success())
737d12aeab33bab559e138307f599077da3918a3238Greg Clayton                {
73840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    AddRegexCommandToInterpreter();
739d12aeab33bab559e138307f599077da3918a3238Greg Clayton                }
740d12aeab33bab559e138307f599077da3918a3238Greg Clayton            }
74140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            if (error.Fail())
74240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            {
74340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                result.AppendError (error.AsCString());
74440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                result.SetStatus (eReturnStatusFailed);
74540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            }
746d12aeab33bab559e138307f599077da3918a3238Greg Clayton        }
74740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
748d12aeab33bab559e138307f599077da3918a3238Greg Clayton        return result.Succeeded();
749d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
750d12aeab33bab559e138307f599077da3918a3238Greg Clayton
75140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton    Error
75240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton    AppendRegexSubstitution (const llvm::StringRef &regex_sed)
753d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
75440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        Error error;
75540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
75640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        if (m_regex_cmd_ap.get() == NULL)
75740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
75840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            error.SetErrorStringWithFormat("invalid regular expression command object for: '%.*s'",
75940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           (int)regex_sed.size(),
76040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           regex_sed.data());
76140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            return error;
76240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
76340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
76440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        size_t regex_sed_size = regex_sed.size();
76540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
76640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        if (regex_sed_size <= 1)
767d12aeab33bab559e138307f599077da3918a3238Greg Clayton        {
76840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            error.SetErrorStringWithFormat("regular expression substitution string is too short: '%.*s'",
76940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           (int)regex_sed.size(),
77040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           regex_sed.data());
77140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            return error;
772d12aeab33bab559e138307f599077da3918a3238Greg Clayton        }
77340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
77440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        if (regex_sed[0] != 's')
77540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
77640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            error.SetErrorStringWithFormat("regular expression substitution string doesn't start with 's': '%.*s'",
77740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           (int)regex_sed.size(),
77840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           regex_sed.data());
77940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            return error;
78040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
78140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        const size_t first_separator_char_pos = 1;
78240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        // use the char that follows 's' as the regex separator character
78340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        // so we can have "s/<regex>/<subst>/" or "s|<regex>|<subst>|"
78440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        const char separator_char = regex_sed[first_separator_char_pos];
78540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        const size_t second_separator_char_pos = regex_sed.find (separator_char, first_separator_char_pos + 1);
78640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
78740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        if (second_separator_char_pos == std::string::npos)
78840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
78940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            error.SetErrorStringWithFormat("missing second '%c' separator char after '%.*s'",
79040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
79140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           (int)(regex_sed.size() - first_separator_char_pos - 1),
79240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           regex_sed.data() + (first_separator_char_pos + 1));
79340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            return error;
79440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
79540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
79640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        const size_t third_separator_char_pos = regex_sed.find (separator_char, second_separator_char_pos + 1);
79740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
79840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        if (third_separator_char_pos == std::string::npos)
79940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
80040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            error.SetErrorStringWithFormat("missing third '%c' separator char after '%.*s'",
80140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
80240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           (int)(regex_sed.size() - second_separator_char_pos - 1),
80340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           regex_sed.data() + (second_separator_char_pos + 1));
80440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            return error;
80540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
80640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
80740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        if (third_separator_char_pos != regex_sed_size - 1)
80840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
80940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            // Make sure that everything that follows the last regex
81040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            // separator char
81140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            if (regex_sed.find_first_not_of("\t\n\v\f\r ", third_separator_char_pos + 1) != std::string::npos)
81240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            {
81340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                error.SetErrorStringWithFormat("extra data found after the '%.*s' regular expression substitution string: '%.*s'",
81440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                               (int)third_separator_char_pos + 1,
81540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                               regex_sed.data(),
81640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                               (int)(regex_sed.size() - third_separator_char_pos - 1),
81740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                               regex_sed.data() + (third_separator_char_pos + 1));
81840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                return error;
81940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            }
82040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
82140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
82240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        else if (first_separator_char_pos + 1 == second_separator_char_pos)
82340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
82440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            error.SetErrorStringWithFormat("<regex> can't be empty in 's%c<regex>%c<subst>%c' string: '%.*s'",
82540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
82640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
82740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
82840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           (int)regex_sed.size(),
82940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           regex_sed.data());
83040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            return error;
83140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
83240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        else if (second_separator_char_pos + 1 == third_separator_char_pos)
83340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        {
83440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            error.SetErrorStringWithFormat("<subst> can't be empty in 's%c<regex>%c<subst>%c' string: '%.*s'",
83540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
83640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
83740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           separator_char,
83840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           (int)regex_sed.size(),
83940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                           regex_sed.data());
84040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            return error;
84140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        }
84240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        std::string regex(regex_sed.substr(first_separator_char_pos + 1, second_separator_char_pos - first_separator_char_pos - 1));
84340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        std::string subst(regex_sed.substr(second_separator_char_pos + 1, third_separator_char_pos - second_separator_char_pos - 1));
84440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        m_regex_cmd_ap->AddRegexCommand (regex.c_str(),
84540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                                         subst.c_str());
84640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        return error;
847d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
848d12aeab33bab559e138307f599077da3918a3238Greg Clayton
849d12aeab33bab559e138307f599077da3918a3238Greg Clayton    void
85040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton    AddRegexCommandToInterpreter()
851d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
852d12aeab33bab559e138307f599077da3918a3238Greg Clayton        if (m_regex_cmd_ap.get())
853d12aeab33bab559e138307f599077da3918a3238Greg Clayton        {
854d12aeab33bab559e138307f599077da3918a3238Greg Clayton            if (m_regex_cmd_ap->HasRegexEntries())
855d12aeab33bab559e138307f599077da3918a3238Greg Clayton            {
856d12aeab33bab559e138307f599077da3918a3238Greg Clayton                CommandObjectSP cmd_sp (m_regex_cmd_ap.release());
857d12aeab33bab559e138307f599077da3918a3238Greg Clayton                m_interpreter.AddCommand(cmd_sp->GetCommandName(), cmd_sp, true);
858d12aeab33bab559e138307f599077da3918a3238Greg Clayton            }
859d12aeab33bab559e138307f599077da3918a3238Greg Clayton        }
860d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
861d12aeab33bab559e138307f599077da3918a3238Greg Clayton
86240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton    void
86340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton    InputReaderDidCancel()
86440e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton    {
86540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton        m_regex_cmd_ap.reset();
86640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton    }
86740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton
868d12aeab33bab559e138307f599077da3918a3238Greg Clayton    static size_t
869d12aeab33bab559e138307f599077da3918a3238Greg Clayton    InputReaderCallback (void *baton,
870d12aeab33bab559e138307f599077da3918a3238Greg Clayton                         InputReader &reader,
871d12aeab33bab559e138307f599077da3918a3238Greg Clayton                         lldb::InputReaderAction notification,
872d12aeab33bab559e138307f599077da3918a3238Greg Clayton                         const char *bytes,
873d12aeab33bab559e138307f599077da3918a3238Greg Clayton                         size_t bytes_len);
874d12aeab33bab559e138307f599077da3918a3238Greg Claytonprivate:
875d12aeab33bab559e138307f599077da3918a3238Greg Clayton    std::auto_ptr<CommandObjectRegexCommand> m_regex_cmd_ap;
876d12aeab33bab559e138307f599077da3918a3238Greg Clayton
877d12aeab33bab559e138307f599077da3918a3238Greg Clayton     class CommandOptions : public Options
878d12aeab33bab559e138307f599077da3918a3238Greg Clayton     {
879d12aeab33bab559e138307f599077da3918a3238Greg Clayton     public:
880d12aeab33bab559e138307f599077da3918a3238Greg Clayton
881d12aeab33bab559e138307f599077da3918a3238Greg Clayton         CommandOptions (CommandInterpreter &interpreter) :
882d12aeab33bab559e138307f599077da3918a3238Greg Clayton            Options (interpreter)
883d12aeab33bab559e138307f599077da3918a3238Greg Clayton         {
884d12aeab33bab559e138307f599077da3918a3238Greg Clayton         }
885d12aeab33bab559e138307f599077da3918a3238Greg Clayton
886d12aeab33bab559e138307f599077da3918a3238Greg Clayton         virtual
887d12aeab33bab559e138307f599077da3918a3238Greg Clayton         ~CommandOptions (){}
888d12aeab33bab559e138307f599077da3918a3238Greg Clayton
889d12aeab33bab559e138307f599077da3918a3238Greg Clayton         virtual Error
890d12aeab33bab559e138307f599077da3918a3238Greg Clayton         SetOptionValue (uint32_t option_idx, const char *option_arg)
891d12aeab33bab559e138307f599077da3918a3238Greg Clayton         {
892d12aeab33bab559e138307f599077da3918a3238Greg Clayton             Error error;
893d12aeab33bab559e138307f599077da3918a3238Greg Clayton             char short_option = (char) m_getopt_table[option_idx].val;
894d12aeab33bab559e138307f599077da3918a3238Greg Clayton
895d12aeab33bab559e138307f599077da3918a3238Greg Clayton             switch (short_option)
896d12aeab33bab559e138307f599077da3918a3238Greg Clayton             {
897d12aeab33bab559e138307f599077da3918a3238Greg Clayton                 case 'h':
898d12aeab33bab559e138307f599077da3918a3238Greg Clayton                     m_help.assign (option_arg);
899d12aeab33bab559e138307f599077da3918a3238Greg Clayton                     break;
900d12aeab33bab559e138307f599077da3918a3238Greg Clayton                 case 's':
901d12aeab33bab559e138307f599077da3918a3238Greg Clayton                     m_syntax.assign (option_arg);
902d12aeab33bab559e138307f599077da3918a3238Greg Clayton                     break;
903d12aeab33bab559e138307f599077da3918a3238Greg Clayton
904d12aeab33bab559e138307f599077da3918a3238Greg Clayton                 default:
905d12aeab33bab559e138307f599077da3918a3238Greg Clayton                     error.SetErrorStringWithFormat ("Unrecognized option '%c'.\n", short_option);
906d12aeab33bab559e138307f599077da3918a3238Greg Clayton                     break;
907d12aeab33bab559e138307f599077da3918a3238Greg Clayton             }
908d12aeab33bab559e138307f599077da3918a3238Greg Clayton
909d12aeab33bab559e138307f599077da3918a3238Greg Clayton             return error;
910d12aeab33bab559e138307f599077da3918a3238Greg Clayton         }
911d12aeab33bab559e138307f599077da3918a3238Greg Clayton
912d12aeab33bab559e138307f599077da3918a3238Greg Clayton         void
913d12aeab33bab559e138307f599077da3918a3238Greg Clayton         OptionParsingStarting ()
914d12aeab33bab559e138307f599077da3918a3238Greg Clayton         {
915d12aeab33bab559e138307f599077da3918a3238Greg Clayton             m_help.clear();
916d12aeab33bab559e138307f599077da3918a3238Greg Clayton             m_syntax.clear();
917d12aeab33bab559e138307f599077da3918a3238Greg Clayton         }
918d12aeab33bab559e138307f599077da3918a3238Greg Clayton
919d12aeab33bab559e138307f599077da3918a3238Greg Clayton         const OptionDefinition*
920d12aeab33bab559e138307f599077da3918a3238Greg Clayton         GetDefinitions ()
921d12aeab33bab559e138307f599077da3918a3238Greg Clayton         {
922d12aeab33bab559e138307f599077da3918a3238Greg Clayton             return g_option_table;
923d12aeab33bab559e138307f599077da3918a3238Greg Clayton         }
924d12aeab33bab559e138307f599077da3918a3238Greg Clayton
925d12aeab33bab559e138307f599077da3918a3238Greg Clayton         // Options table: Required for subclasses of Options.
926d12aeab33bab559e138307f599077da3918a3238Greg Clayton
927d12aeab33bab559e138307f599077da3918a3238Greg Clayton         static OptionDefinition g_option_table[];
928d12aeab33bab559e138307f599077da3918a3238Greg Clayton
929d12aeab33bab559e138307f599077da3918a3238Greg Clayton         const char *
930d12aeab33bab559e138307f599077da3918a3238Greg Clayton         GetHelp ()
931d12aeab33bab559e138307f599077da3918a3238Greg Clayton         {
932d12aeab33bab559e138307f599077da3918a3238Greg Clayton             if (m_help.empty())
933d12aeab33bab559e138307f599077da3918a3238Greg Clayton                 return NULL;
934d12aeab33bab559e138307f599077da3918a3238Greg Clayton             return m_help.c_str();
935d12aeab33bab559e138307f599077da3918a3238Greg Clayton         }
936d12aeab33bab559e138307f599077da3918a3238Greg Clayton         const char *
937d12aeab33bab559e138307f599077da3918a3238Greg Clayton         GetSyntax ()
938d12aeab33bab559e138307f599077da3918a3238Greg Clayton         {
939d12aeab33bab559e138307f599077da3918a3238Greg Clayton             if (m_syntax.empty())
940d12aeab33bab559e138307f599077da3918a3238Greg Clayton                 return NULL;
941d12aeab33bab559e138307f599077da3918a3238Greg Clayton             return m_syntax.c_str();
942d12aeab33bab559e138307f599077da3918a3238Greg Clayton         }
943d12aeab33bab559e138307f599077da3918a3238Greg Clayton         // Instance variables to hold the values for command options.
944d12aeab33bab559e138307f599077da3918a3238Greg Clayton     protected:
945d12aeab33bab559e138307f599077da3918a3238Greg Clayton         std::string m_help;
946d12aeab33bab559e138307f599077da3918a3238Greg Clayton         std::string m_syntax;
947d12aeab33bab559e138307f599077da3918a3238Greg Clayton     };
948d12aeab33bab559e138307f599077da3918a3238Greg Clayton
949d12aeab33bab559e138307f599077da3918a3238Greg Clayton     CommandOptions m_options;
950d12aeab33bab559e138307f599077da3918a3238Greg Clayton
951d12aeab33bab559e138307f599077da3918a3238Greg Clayton     virtual Options *
952d12aeab33bab559e138307f599077da3918a3238Greg Clayton     GetOptions ()
953d12aeab33bab559e138307f599077da3918a3238Greg Clayton     {
954d12aeab33bab559e138307f599077da3918a3238Greg Clayton         return &m_options;
955d12aeab33bab559e138307f599077da3918a3238Greg Clayton     }
956d12aeab33bab559e138307f599077da3918a3238Greg Clayton
957d12aeab33bab559e138307f599077da3918a3238Greg Clayton};
958d12aeab33bab559e138307f599077da3918a3238Greg Clayton
959d12aeab33bab559e138307f599077da3918a3238Greg Claytonsize_t
960d12aeab33bab559e138307f599077da3918a3238Greg ClaytonCommandObjectCommandsAddRegex::InputReaderCallback (void *baton,
961d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                    InputReader &reader,
962d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                    lldb::InputReaderAction notification,
963d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                    const char *bytes,
964d12aeab33bab559e138307f599077da3918a3238Greg Clayton                                                    size_t bytes_len)
965d12aeab33bab559e138307f599077da3918a3238Greg Clayton{
966d12aeab33bab559e138307f599077da3918a3238Greg Clayton    CommandObjectCommandsAddRegex *add_regex_cmd = (CommandObjectCommandsAddRegex *) baton;
967d12aeab33bab559e138307f599077da3918a3238Greg Clayton
968d12aeab33bab559e138307f599077da3918a3238Greg Clayton    switch (notification)
969d12aeab33bab559e138307f599077da3918a3238Greg Clayton    {
970d12aeab33bab559e138307f599077da3918a3238Greg Clayton        case eInputReaderActivate:
97140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            reader.GetDebugger().GetOutputStream().Printf("%s\n", "Enter regular expressions in the form 's/<regex>/<subst>/' and terminate with an empty line:");
972d12aeab33bab559e138307f599077da3918a3238Greg Clayton            break;
973d12aeab33bab559e138307f599077da3918a3238Greg Clayton        case eInputReaderReactivate:
974d12aeab33bab559e138307f599077da3918a3238Greg Clayton            break;
975d12aeab33bab559e138307f599077da3918a3238Greg Clayton
976d12aeab33bab559e138307f599077da3918a3238Greg Clayton        case eInputReaderDeactivate:
977d12aeab33bab559e138307f599077da3918a3238Greg Clayton            break;
978d12aeab33bab559e138307f599077da3918a3238Greg Clayton
979d12aeab33bab559e138307f599077da3918a3238Greg Clayton        case eInputReaderGotToken:
98040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            while (bytes_len > 0 && (bytes[bytes_len-1] == '\r' || bytes[bytes_len-1] == '\n'))
98140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                --bytes_len;
982d12aeab33bab559e138307f599077da3918a3238Greg Clayton            if (bytes_len == 0)
983d12aeab33bab559e138307f599077da3918a3238Greg Clayton                reader.SetIsDone(true);
984d12aeab33bab559e138307f599077da3918a3238Greg Clayton            else if (bytes)
985d12aeab33bab559e138307f599077da3918a3238Greg Clayton            {
98640e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                llvm::StringRef bytes_strref (bytes, bytes_len);
98740e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                Error error (add_regex_cmd->AppendRegexSubstitution (bytes_strref));
98840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                if (error.Fail())
989d12aeab33bab559e138307f599077da3918a3238Greg Clayton                {
99040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    reader.GetDebugger().GetOutputStream().Printf("error: %s\n", error.AsCString());
99140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    add_regex_cmd->InputReaderDidCancel ();
99240e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                    reader.SetIsDone (true);
993d12aeab33bab559e138307f599077da3918a3238Greg Clayton                }
994d12aeab33bab559e138307f599077da3918a3238Greg Clayton            }
995d12aeab33bab559e138307f599077da3918a3238Greg Clayton            break;
996d12aeab33bab559e138307f599077da3918a3238Greg Clayton
997d12aeab33bab559e138307f599077da3918a3238Greg Clayton        case eInputReaderInterrupt:
998d12aeab33bab559e138307f599077da3918a3238Greg Clayton            reader.SetIsDone (true);
999d12aeab33bab559e138307f599077da3918a3238Greg Clayton            reader.GetDebugger().GetOutputStream().PutCString("Regular expression command creations was cancelled.\n");
100040e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            add_regex_cmd->InputReaderDidCancel ();
1001d12aeab33bab559e138307f599077da3918a3238Greg Clayton            break;
1002d12aeab33bab559e138307f599077da3918a3238Greg Clayton
1003d12aeab33bab559e138307f599077da3918a3238Greg Clayton        case eInputReaderEndOfFile:
1004d12aeab33bab559e138307f599077da3918a3238Greg Clayton            reader.SetIsDone (true);
1005d12aeab33bab559e138307f599077da3918a3238Greg Clayton            break;
1006d12aeab33bab559e138307f599077da3918a3238Greg Clayton
1007d12aeab33bab559e138307f599077da3918a3238Greg Clayton        case eInputReaderDone:
100840e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton            add_regex_cmd->AddRegexCommandToInterpreter();
1009d12aeab33bab559e138307f599077da3918a3238Greg Clayton            break;
1010d12aeab33bab559e138307f599077da3918a3238Greg Clayton    }
1011d12aeab33bab559e138307f599077da3918a3238Greg Clayton
1012d12aeab33bab559e138307f599077da3918a3238Greg Clayton    return bytes_len;
1013d12aeab33bab559e138307f599077da3918a3238Greg Clayton}
1014d12aeab33bab559e138307f599077da3918a3238Greg Clayton
1015d12aeab33bab559e138307f599077da3918a3238Greg Clayton
1016d12aeab33bab559e138307f599077da3918a3238Greg ClaytonOptionDefinition
1017d12aeab33bab559e138307f599077da3918a3238Greg ClaytonCommandObjectCommandsAddRegex::CommandOptions::g_option_table[] =
1018d12aeab33bab559e138307f599077da3918a3238Greg Clayton{
101940e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton{ LLDB_OPT_SET_1, false, "help"  , 'h', required_argument, NULL, 0, eArgTypeNone, "The help text to display for this command."},
1020d12aeab33bab559e138307f599077da3918a3238Greg Clayton{ LLDB_OPT_SET_1, false, "syntax", 's', required_argument, NULL, 0, eArgTypeNone, "A syntax string showing the typical usage syntax."},
102140e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton{ 0             , false,  NULL   , 0  , 0                , NULL, 0, eArgTypeNone, NULL }
1022d12aeab33bab559e138307f599077da3918a3238Greg Clayton};
1023d12aeab33bab559e138307f599077da3918a3238Greg Clayton
1024d12aeab33bab559e138307f599077da3918a3238Greg Clayton
1025767af88aa617288e584afcfed055f7755e408542Jim Ingham#pragma mark CommandObjectMultiwordCommands
1026767af88aa617288e584afcfed055f7755e408542Jim Ingham
1027767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
1028767af88aa617288e584afcfed055f7755e408542Jim Ingham// CommandObjectMultiwordCommands
1029767af88aa617288e584afcfed055f7755e408542Jim Ingham//-------------------------------------------------------------------------
1030767af88aa617288e584afcfed055f7755e408542Jim Ingham
1031767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordCommands::CommandObjectMultiwordCommands (CommandInterpreter &interpreter) :
1032238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    CommandObjectMultiword (interpreter,
103340e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                            "command",
1034c1ad82eb979ee856b86aec6e2acb7bddf75f7c4fCaroline Tice                            "A set of commands for managing or customizing the debugger commands.",
103540e482434007a7cac49fb1f437fe7d13db2cf523Greg Clayton                            "command <subcommand> [<subcommand-options>]")
1036767af88aa617288e584afcfed055f7755e408542Jim Ingham{
1037238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("source",  CommandObjectSP (new CommandObjectCommandsSource (interpreter)));
1038238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("alias",   CommandObjectSP (new CommandObjectCommandsAlias (interpreter)));
1039238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton    LoadSubCommand ("unalias", CommandObjectSP (new CommandObjectCommandsUnalias (interpreter)));
1040d12aeab33bab559e138307f599077da3918a3238Greg Clayton    LoadSubCommand ("regex",   CommandObjectSP (new CommandObjectCommandsAddRegex (interpreter)));
1041767af88aa617288e584afcfed055f7755e408542Jim Ingham}
1042767af88aa617288e584afcfed055f7755e408542Jim Ingham
1043767af88aa617288e584afcfed055f7755e408542Jim InghamCommandObjectMultiwordCommands::~CommandObjectMultiwordCommands ()
1044767af88aa617288e584afcfed055f7755e408542Jim Ingham{
1045767af88aa617288e584afcfed055f7755e408542Jim Ingham}
1046767af88aa617288e584afcfed055f7755e408542Jim Ingham
1047