Options.h revision 5e342f50b42b265d8568e1c926328858e74b2c0a
124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- Options.h -----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef liblldb_Options_h_
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define liblldb_Options_h_
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <getopt.h>
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <set>
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <vector>
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/lldb-private.h"
2334e9a98dcff785b0693594b6d6753f560abf8be2Jim Ingham#include "lldb/lldb-defines.h"
2484cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham#include "lldb/Interpreter/Args.h"
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnernamespace lldb_private {
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
2984cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham/// @class Options Options.h "lldb/Interpreter/Options.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A command line option parsing protocol class.
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Options is designed to be subclassed to contain all needed
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// options for a given command. The options can be parsed by calling:
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \code
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     Error Args::ParseOptions (Options &);
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \endcode
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The options are specified using the format defined for the libc
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// options parsing function getopt_long:
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \code
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     #include <getopt.h>
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     int getopt_long(int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex);
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \endcode
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Example code:
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \code
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     #include <getopt.h>
4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     #include <string>
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     class CommandOptions : public Options
5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     {
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     public:
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         virtual struct option *
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         GetLongOptions() {
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             return g_options;
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         }
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         virtual Error
59143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton///         SetOptionValue (uint32_t option_idx, int option_val, const char *option_arg)
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         {
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             Error error;
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             switch (option_val)
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             {
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'g': debug = true; break;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'v': verbose = true; break;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'l': log_file = option_arg; break;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'f': log_flags = strtoull(option_arg, NULL, 0); break;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             default:
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///                 error.SetErrorStringWithFormat("unrecognized short option %c", option_val);
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///                 break;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             }
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             return error;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         }
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
76f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton///         CommandOptions (CommandInterpreter &interpreter) : debug (true), verbose (false), log_file (), log_flags (0)
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         {}
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         bool debug;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         bool verbose;
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         std::string log_file;
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         uint32_t log_flags;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         static struct option g_options[];
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     };
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     struct option CommandOptions::g_options[] =
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     {
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "debug",              no_argument,        NULL,   'g' },
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "log-file",           required_argument,  NULL,   'l' },
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "log-flags",          required_argument,  NULL,   'f' },
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "verbose",            no_argument,        NULL,   'v' },
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { NULL,                 0,                  NULL,   0   }
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     };
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     int main (int argc, const char **argv, const char **envp)
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     {
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         CommandOptions options;
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         Args main_command;
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         main_command.SetArguments(argc, argv, false);
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         main_command.ParseOptions(options);
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         if (options.verbose)
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         {
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             std::cout << "verbose is on" << std::endl;
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         }
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     }
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \endcode
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Options
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
115f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    Options (CommandInterpreter &interpreter);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Options ();
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BuildGetoptTable ();
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BuildValidOptionSets ();
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NumCommandOptions ();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the option definitions to use when parsing Args options.
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::ParseOptions (Options&)
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see man getopt_long
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct option *
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetLongOptions ();
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13834e9a98dcff785b0693594b6d6753f560abf8be2Jim Ingham    // This gets passed the short option as an integer...
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
14034e9a98dcff785b0693594b6d6753f560abf8be2Jim Ingham    OptionSeen (int short_option);
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VerifyOptions (CommandReturnObject &result);
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
145143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // Verify that the options given are in the options table and can
146143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // be used together, but there may be some required options that are
147143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // missing (used to verify options that get folded into command aliases).
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VerifyPartialOptions (CommandReturnObject &result);
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OutputFormattedUsageText (Stream &strm,
15424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              const char *text,
15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              uint32_t output_max_columns);
15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
158f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    GenerateOptionUsage (Stream &strm,
159238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                         CommandObject *cmd);
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
161143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // The following two pure virtual functions must be defined by every
162143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // class that inherits from this class.
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
164b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    virtual const OptionDefinition*
1655bc7b67ccc8bb4a977d129e51313067dcbc7bb94Chris Lattner    GetDefinitions () { return NULL; }
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Call this prior to parsing any options. This call will call the
168143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // subclass OptionParsingStarting() and will avoid the need for all
169143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // OptionParsingStarting() function instances from having to call the
170143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // Option::OptionParsingStarting() like they did before. This was error
17124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // prone and subclasses shouldn't have to do it.
17224bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    void
173143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    NotifyOptionParsingStarting ();
174143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
175143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    Error
176143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    NotifyOptionParsingFinished ();
17724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
17924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the value of an option.
18024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] option_idx
18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index into the "struct option" array that was returned
18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     by Options::GetLongOptions().
18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] option_arg
18624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The argument value for the option that the user entered, or
18724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     NULL if there is no argument for the current option.
18824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::ParseOptions (Options&)
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see man getopt_long
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Error
194143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    SetOptionValue (uint32_t option_idx, const char *option_arg) = 0;
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
197143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// Handles the generic bits of figuring out whether we are in an
198143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// option, and if so completing it.
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] input
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The command line parsed into words
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] cursor_index
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index in \ainput of the word in which the cursor lies.
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] char_pos
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The character position of the cursor in its argument word.
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_start_point
21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_return_elements
211143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     See CommandObject::HandleCompletions for a description of
212143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     how these work.
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] interpreter
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The interpreter that's doing the completing.
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
217802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    /// @param[out] word_complete
218143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     \btrue if this is a complete option value (a space will be
219143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     inserted after the completion.) \b false otherwise.
220802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    ///
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] matches
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The array of matches returned.
22324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
224143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// FIXME: This is the wrong return value, since we also need to
225143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// make a distinction between total number of matches, and the
226143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// window the user wants returned.
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
22924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \btrue if we were in an option, \bfalse otherwise.
23024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
23124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
232f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    HandleOptionCompletion (Args &input,
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            OptionElementVector &option_map,
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int cursor_index,
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int char_pos,
23624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int match_start_point,
23724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int max_return_elements,
238802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                            bool &word_complete,
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            lldb_private::StringList &matches);
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
242143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// Handles the generic bits of figuring out whether we are in an
243143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// option, and if so completing it.
24424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
245802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    /// @param[in] interpreter
246802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    ///    The command interpreter doing the completion.
247802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    ///
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] input
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The command line parsed into words
25024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] cursor_index
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index in \ainput of the word in which the cursor lies.
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] char_pos
25524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The character position of the cursor in its argument word.
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
25724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] opt_element_vector
25824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The results of the options parse of \a input.
25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] opt_element_index
261143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     The position in \a opt_element_vector of the word in \a
262143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     input containing the cursor.
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_start_point
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_return_elements
266143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     See CommandObject::HandleCompletions for a description of
267143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     how these work.
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
269802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    /// @param[out] word_complete
270143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     \btrue if this is a complete option value (a space will
271143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     be inserted after the completion.) \bfalse otherwise.
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] matches
27424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The array of matches returned.
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
276143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// FIXME: This is the wrong return value, since we also need to
277143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// make a distinction between total number of matches, and the
278143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// window the user wants returned.
27924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
28124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \btrue if we were in an option, \bfalse otherwise.
28224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
28324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
284f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    HandleOptionArgumentCompletion (Args &input,
28563094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int cursor_index,
28663094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int char_pos,
28763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    OptionElementVector &opt_element_vector,
28863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int opt_element_index,
28963094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int match_start_point,
29063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int max_return_elements,
291802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                    bool &word_complete,
29263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    StringList &matches);
29363094e0bb161580564954dee512955c1c79d3476Greg Clayton
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
29534e9a98dcff785b0693594b6d6753f560abf8be2Jim Ingham    // This is a set of options expressed as indexes into the options table for this Option.
29624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef std::set<char> OptionSet;
2978b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    typedef std::vector<OptionSet> OptionSetVector;
29824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
299f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    CommandInterpreter &m_interpreter;
30024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<struct option> m_getopt_table;
30124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionSet m_seen_options;
3028b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector m_required_options;
3038b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector m_optional_options;
3048b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham
3058b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector &GetRequiredOptions ()
3068b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    {
3078b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        BuildValidOptionSets();
3088b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        return m_required_options;
3098b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    }
3108b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham
3118b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector &GetOptionalOptions ()
3128b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    {
3138b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        BuildValidOptionSets();
3148b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        return m_optional_options;
3158b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    }
31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsASubset (const OptionSet& set_a, const OptionSet& set_b);
31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
32124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionsSetDiff (const OptionSet &set_a, const OptionSet &set_b, OptionSet &diffs);
32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
32424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionsSetUnion (const OptionSet &set_a, const OptionSet &set_b, OptionSet &union_set);
32524bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
32624bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Subclasses must reset their option values prior to starting a new
32724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // option parse. Each subclass must override this function and revert
32824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // all option settings to default values.
32924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    virtual void
330143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    OptionParsingStarting () = 0;
331143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
332143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    virtual Error
333143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    OptionParsingFinished ()
334143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    {
335143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        // If subclasses need to know when the options are done being parsed
336143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        // they can implement this function to do extra checking
337143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        Error error;
338143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        return error;
339143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    }
34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
342143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    class OptionGroup
343143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    {
344143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    public:
345143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionGroup ()
346143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
347143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
348143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
349143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual
350143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        ~OptionGroup ()
351143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
352143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
353143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
354143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual uint32_t
355143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        GetNumDefinitions () = 0;
356143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
357143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual const OptionDefinition*
358143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        GetDefinitions () = 0;
359143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
360143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
361143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (CommandInterpreter &interpreter,
362143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                        uint32_t option_idx,
363143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                        const char *option_value) = 0;
364143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
365143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual void
366143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting (CommandInterpreter &interpreter) = 0;
367143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
368143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
369143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingFinished (CommandInterpreter &interpreter)
370143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
371143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            // If subclasses need to know when the options are done being parsed
372143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            // they can implement this function to do extra checking
373143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            Error error;
374143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            return error;
375143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
376143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    };
377143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
378143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    class OptionGroupOptions : public Options
379143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    {
380143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    public:
381143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
382143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionGroupOptions (CommandInterpreter &interpreter) :
383143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            Options (interpreter),
384143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            m_option_defs (),
3855e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            m_option_infos (),
386143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            m_did_finalize (false)
387143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
388143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
389143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
390143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual
391143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        ~OptionGroupOptions ()
392143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
393143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
394143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
3955e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        //----------------------------------------------------------------------
3965e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// Append options from a OptionGroup class.
3975e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
3985e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// Append options from \a group that have a usage mask that has any bits
3995e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// in "src_mask" set. After the option definition is copied into the
4005e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// options definitions in this class, set the usage_mask to "dst_mask".
4015e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
4025e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// @param[in] group
4035e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     A group of options to take option values from and copy their
4045e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     definitions into this class.
4055e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
4065e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// @param[in] src_mask
4075e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     When copying options from \a group, you might only want some of
4085e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     the options to be appended to this group. This mask allows you
4095e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     to control which options from \a group get added. It also allows
4105e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     you to specify the same options from \a group multiple times
4115e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     for different option sets.
4125e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
4135e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// @param[in] dst_mask
4145e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     Set the usage mask for any copied options to \a dst_mask after
4155e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     copying the option definition.
4165e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        //----------------------------------------------------------------------
417143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        void
4185e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        Append (OptionGroup* group,
4195e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                uint32_t src_mask,
4205e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                uint32_t dst_mask);
421143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
422143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        void
423143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        Finalize ();
424143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
425143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
426143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx,
427143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                        const char *option_arg);
428143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
429143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual void
430143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ();
431143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
432143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
433143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingFinished ();
434143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
435143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        const OptionDefinition*
436143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        GetDefinitions ()
437143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
438143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            assert (m_did_finalize);
439143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            return &m_option_defs[0];
440143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
4415e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        struct OptionInfo
4425e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        {
4435e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            OptionInfo (OptionGroup* g, uint32_t i) :
4445e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                option_group (g),
4455e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                option_index (i)
4465e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            {
4475e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            }
4485e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            OptionGroup* option_group;  // The group that this option came from
4495e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            uint32_t option_index;      // The original option index from the OptionGroup
4505e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        };
4515e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        typedef std::vector<OptionInfo> OptionInfos;
452143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
453143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        std::vector<OptionDefinition> m_option_defs;
4545e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        OptionInfos m_option_infos;
455143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        bool m_did_finalize;
456143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    };
457143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
458143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
46024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Options_h_
462