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
268f00907e68af707b7728901f1ea1d9c40add5168Daniel Maleanamespace lldb_private {
272eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea
282eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea  static inline bool
292eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea  isprint8 (int ch)
302eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea  {
312eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea      if (ch & 0xffffff00u)
322eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea          return false;
332eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea      return isprint(ch);
342eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea  }
352eafcaafe722598d937cc64fd5ae4a3bb49e8dcfDaniel Malea
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
3884cdc15005983e5244d665fa779e33c2b6fac95fJim Ingham/// @class Options Options.h "lldb/Interpreter/Options.h"
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// @brief A command line option parsing protocol class.
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Options is designed to be subclassed to contain all needed
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// options for a given command. The options can be parsed by calling:
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \code
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     Error Args::ParseOptions (Options &);
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \endcode
4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// The options are specified using the format defined for the libc
483f2f741bb533b78e2fac5332c4698338ea2fd3acGreg Clayton/// options parsing function getopt_long_only:
4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \code
5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     #include <getopt.h>
513f2f741bb533b78e2fac5332c4698338ea2fd3acGreg Clayton///     int getopt_long_only(int argc, char * const *argv, const char *optstring, const struct option *longopts, int *longindex);
5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \endcode
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// Example code:
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \code
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     #include <getopt.h>
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     #include <string>
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     class CommandOptions : public Options
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     {
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     public:
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         virtual struct option *
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         GetLongOptions() {
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             return g_options;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         }
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         virtual Error
68143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton///         SetOptionValue (uint32_t option_idx, int option_val, const char *option_arg)
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         {
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             Error error;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             switch (option_val)
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             {
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'g': debug = true; break;
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'v': verbose = true; break;
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'l': log_file = option_arg; break;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             case 'f': log_flags = strtoull(option_arg, NULL, 0); break;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             default:
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///                 error.SetErrorStringWithFormat("unrecognized short option %c", option_val);
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///                 break;
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             }
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             return error;
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         }
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
85f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton///         CommandOptions (CommandInterpreter &interpreter) : debug (true), verbose (false), log_file (), log_flags (0)
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         {}
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         bool debug;
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         bool verbose;
9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         std::string log_file;
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         uint32_t log_flags;
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         static struct option g_options[];
9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     };
9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     struct option CommandOptions::g_options[] =
9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     {
9924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "debug",              no_argument,        NULL,   'g' },
10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "log-file",           required_argument,  NULL,   'l' },
10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "log-flags",          required_argument,  NULL,   'f' },
10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { "verbose",            no_argument,        NULL,   'v' },
10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         { NULL,                 0,                  NULL,   0   }
10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     };
10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     int main (int argc, const char **argv, const char **envp)
10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     {
10824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         CommandOptions options;
10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         Args main_command;
11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         main_command.SetArguments(argc, argv, false);
11124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         main_command.ParseOptions(options);
11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///
11324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         if (options.verbose)
11424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         {
11524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///             std::cout << "verbose is on" << std::endl;
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///         }
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner///     }
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner/// \endcode
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass Options
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
124f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    Options (CommandInterpreter &interpreter);
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~Options ();
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BuildGetoptTable ();
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    BuildValidOptionSets ();
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    uint32_t
13624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    NumCommandOptions ();
13724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
13924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Get the option definitions to use when parsing Args options.
14024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
14124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::ParseOptions (Options&)
1423f2f741bb533b78e2fac5332c4698338ea2fd3acGreg Clayton    /// @see man getopt_long_only
14324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
14424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    struct option *
14524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    GetLongOptions ();
14624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
14734e9a98dcff785b0693594b6d6753f560abf8be2Jim Ingham    // This gets passed the short option as an integer...
14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
14934e9a98dcff785b0693594b6d6753f560abf8be2Jim Ingham    OptionSeen (int short_option);
15024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
15224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VerifyOptions (CommandReturnObject &result);
15324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
154143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // Verify that the options given are in the options table and can
155143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // be used together, but there may be some required options that are
156143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // missing (used to verify options that get folded into command aliases).
15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    VerifyPartialOptions (CommandReturnObject &result);
16024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OutputFormattedUsageText (Stream &strm,
16324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              const char *text,
16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                              uint32_t output_max_columns);
16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
16624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
167f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    GenerateOptionUsage (Stream &strm,
168238c0a1e7b733cee539258faa656159c63f9e893Greg Clayton                         CommandObject *cmd);
16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
170d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton    bool
171d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton    SupportsLongOption (const char *long_option);
172d8a218d998d0dd805a8e4ec7bbaa9aeb229590ccGreg Clayton
173143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // The following two pure virtual functions must be defined by every
174143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // class that inherits from this class.
17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
176b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    virtual const OptionDefinition*
1775bc7b67ccc8bb4a977d129e51313067dcbc7bb94Chris Lattner    GetDefinitions () { return NULL; }
17824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
17924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Call this prior to parsing any options. This call will call the
180143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // subclass OptionParsingStarting() and will avoid the need for all
181143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // OptionParsingStarting() function instances from having to call the
182143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    // Option::OptionParsingStarting() like they did before. This was error
18324bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // prone and subclasses shouldn't have to do it.
18424bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    void
185143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    NotifyOptionParsingStarting ();
186143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
187143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    Error
188143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    NotifyOptionParsingFinished ();
18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
19024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// Set the value of an option.
19224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] option_idx
19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index into the "struct option" array that was returned
19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     by Options::GetLongOptions().
19624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
19724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] option_arg
19824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The argument value for the option that the user entered, or
19924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     NULL if there is no argument for the current option.
20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @see Args::ParseOptions (Options&)
2033f2f741bb533b78e2fac5332c4698338ea2fd3acGreg Clayton    /// @see man getopt_long_only
20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual Error
206143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    SetOptionValue (uint32_t option_idx, const char *option_arg) = 0;
20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
20824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
209143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// Handles the generic bits of figuring out whether we are in an
210143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// option, and if so completing it.
21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] input
21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The command line parsed into words
21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] cursor_index
21624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index in \ainput of the word in which the cursor lies.
21724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
21824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] char_pos
21924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The character position of the cursor in its argument word.
22024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_start_point
22224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_return_elements
223143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     See CommandObject::HandleCompletions for a description of
224143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     how these work.
22524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
22624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] interpreter
22724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The interpreter that's doing the completing.
22824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
229802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    /// @param[out] word_complete
230143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     \btrue if this is a complete option value (a space will be
231143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     inserted after the completion.) \b false otherwise.
232802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    ///
23324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] matches
23424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The array of matches returned.
23524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
236143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// FIXME: This is the wrong return value, since we also need to
237143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// make a distinction between total number of matches, and the
238143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// window the user wants returned.
23924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
24024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \btrue if we were in an option, \bfalse otherwise.
24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
244f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    HandleOptionCompletion (Args &input,
24524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            OptionElementVector &option_map,
24624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int cursor_index,
24724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int char_pos,
24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int match_start_point,
24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            int max_return_elements,
250802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                            bool &word_complete,
25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            lldb_private::StringList &matches);
25224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
25324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
254143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// Handles the generic bits of figuring out whether we are in an
255143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// option, and if so completing it.
25624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
257802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    /// @param[in] interpreter
258802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    ///    The command interpreter doing the completion.
259802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    ///
26024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] input
26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///    The command line parsed into words
26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] cursor_index
26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The index in \ainput of the word in which the cursor lies.
26524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] char_pos
26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The character position of the cursor in its argument word.
26824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
26924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] opt_element_vector
27024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The results of the options parse of \a input.
27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] opt_element_index
273143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     The position in \a opt_element_vector of the word in \a
274143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     input containing the cursor.
27524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
27624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_start_point
27724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[in] match_return_elements
278143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     See CommandObject::HandleCompletions for a description of
279143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     how these work.
28024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
281802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham    /// @param[out] word_complete
282143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     \btrue if this is a complete option value (a space will
283143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    ///     be inserted after the completion.) \bfalse otherwise.
28424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
28524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @param[out] matches
28624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     The array of matches returned.
28724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
288143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// FIXME: This is the wrong return value, since we also need to
289143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// make a distinction between total number of matches, and the
290143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    /// window the user wants returned.
29124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///
29224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    /// @return
29324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ///     \btrue if we were in an option, \bfalse otherwise.
29424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
29524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual bool
296f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    HandleOptionArgumentCompletion (Args &input,
29763094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int cursor_index,
29863094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int char_pos,
29963094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    OptionElementVector &opt_element_vector,
30063094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int opt_element_index,
30163094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int match_start_point,
30263094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    int max_return_elements,
303802f8b0e11525a61f6becfd3562222b2cfaea965Jim Ingham                                    bool &word_complete,
30463094e0bb161580564954dee512955c1c79d3476Greg Clayton                                    StringList &matches);
30563094e0bb161580564954dee512955c1c79d3476Greg Clayton
30624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
30734e9a98dcff785b0693594b6d6753f560abf8be2Jim Ingham    // This is a set of options expressed as indexes into the options table for this Option.
3086475c42148a8ea1ca86e5db465db7eca742d897dGreg Clayton    typedef std::set<int> OptionSet;
3098b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    typedef std::vector<OptionSet> OptionSetVector;
31024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
311f15996eea072cdaa8a092f22d3a1212b3d95f0ecGreg Clayton    CommandInterpreter &m_interpreter;
31224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    std::vector<struct option> m_getopt_table;
31324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionSet m_seen_options;
3148b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector m_required_options;
3158b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector m_optional_options;
3168b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham
3178b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector &GetRequiredOptions ()
3188b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    {
3198b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        BuildValidOptionSets();
3208b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        return m_required_options;
3218b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    }
3228b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham
3238b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    OptionSetVector &GetOptionalOptions ()
3248b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    {
3258b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        BuildValidOptionSets();
3268b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham        return m_optional_options;
3278b9af1caac91c9e66440370a79705a3370e0a360Jim Ingham    }
32824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
32924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool
33024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    IsASubset (const OptionSet& set_a, const OptionSet& set_b);
33124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    size_t
33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionsSetDiff (const OptionSet &set_a, const OptionSet &set_b, OptionSet &diffs);
33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void
33624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    OptionsSetUnion (const OptionSet &set_a, const OptionSet &set_b, OptionSet &union_set);
33724bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton
33824bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // Subclasses must reset their option values prior to starting a new
33924bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // option parse. Each subclass must override this function and revert
34024bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    // all option settings to default values.
34124bc5d9bfad2a1c562c27e7cf37e1c56d85c45e7Greg Clayton    virtual void
342143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    OptionParsingStarting () = 0;
343143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
344143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    virtual Error
345143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    OptionParsingFinished ()
346143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    {
347143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        // If subclasses need to know when the options are done being parsed
348143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        // they can implement this function to do extra checking
349143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        Error error;
350143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        return error;
351143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    }
35224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
35324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
354143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    class OptionGroup
355143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    {
356143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    public:
357143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionGroup ()
358143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
359143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
360143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
361143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual
362143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        ~OptionGroup ()
363143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
364143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
365143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
366143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual uint32_t
367143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        GetNumDefinitions () = 0;
368143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
369143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual const OptionDefinition*
370143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        GetDefinitions () = 0;
371143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
372143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
373143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (CommandInterpreter &interpreter,
374143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                        uint32_t option_idx,
375143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                        const char *option_value) = 0;
376143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
377143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual void
378143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting (CommandInterpreter &interpreter) = 0;
379143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
380143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
381143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingFinished (CommandInterpreter &interpreter)
382143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
383143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            // If subclasses need to know when the options are done being parsed
384143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            // they can implement this function to do extra checking
385143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            Error error;
386143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            return error;
387143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
388143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    };
389143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
390143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    class OptionGroupOptions : public Options
391143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    {
392143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    public:
393143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
394143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionGroupOptions (CommandInterpreter &interpreter) :
395143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            Options (interpreter),
396143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            m_option_defs (),
3975e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            m_option_infos (),
398143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            m_did_finalize (false)
399143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
400143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
401143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
402143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual
403143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        ~OptionGroupOptions ()
404143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
405143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
406143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
40757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
40857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        //----------------------------------------------------------------------
40957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        /// Append options from a OptionGroup class.
41057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        ///
41157b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        /// Append all options from \a group using the exact same option groups
41257b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        /// that each option is defined with.
41357b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        ///
41457b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        /// @param[in] group
41557b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        ///     A group of options to take option values from and copy their
41657b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        ///     definitions into this class.
41757b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        //----------------------------------------------------------------------
41857b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        void
41957b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton        Append (OptionGroup* group);
42057b3c6b12812b0a7a79f896855c787bd4d893ecbGreg Clayton
4215e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        //----------------------------------------------------------------------
4225e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// Append options from a OptionGroup class.
4235e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
4245e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// Append options from \a group that have a usage mask that has any bits
4255e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// in "src_mask" set. After the option definition is copied into the
4265e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// options definitions in this class, set the usage_mask to "dst_mask".
4275e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
4285e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// @param[in] group
4295e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     A group of options to take option values from and copy their
4305e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     definitions into this class.
4315e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
4325e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// @param[in] src_mask
4335e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     When copying options from \a group, you might only want some of
4345e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     the options to be appended to this group. This mask allows you
4355e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     to control which options from \a group get added. It also allows
4365e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     you to specify the same options from \a group multiple times
4375e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     for different option sets.
4385e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///
4395e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        /// @param[in] dst_mask
4405e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     Set the usage mask for any copied options to \a dst_mask after
4415e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        ///     copying the option definition.
4425e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        //----------------------------------------------------------------------
443143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        void
4445e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        Append (OptionGroup* group,
4455e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                uint32_t src_mask,
4465e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                uint32_t dst_mask);
447143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
448143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        void
449143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        Finalize ();
450143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
451143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
452143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        SetOptionValue (uint32_t option_idx,
453143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton                        const char *option_arg);
454143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
455143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual void
456143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingStarting ();
457143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
458143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        virtual Error
459143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        OptionParsingFinished ();
460143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
461143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        const OptionDefinition*
462143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        GetDefinitions ()
463143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        {
464143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            assert (m_did_finalize);
465143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton            return &m_option_defs[0];
466143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        }
4675e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        struct OptionInfo
4685e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        {
4695e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            OptionInfo (OptionGroup* g, uint32_t i) :
4705e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                option_group (g),
4715e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton                option_index (i)
4725e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            {
4735e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            }
4745e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            OptionGroup* option_group;  // The group that this option came from
4755e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton            uint32_t option_index;      // The original option index from the OptionGroup
4765e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        };
4775e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        typedef std::vector<OptionInfo> OptionInfos;
478143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
479143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        std::vector<OptionDefinition> m_option_defs;
4805e342f50b42b265d8568e1c926328858e74b2c0aGreg Clayton        OptionInfos m_option_infos;
481143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton        bool m_did_finalize;
482143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton    };
483143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
484143fcc3a15425659b381502ed4e1e50a3e726f36Greg Clayton
48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} // namespace lldb_private
48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // liblldb_Options_h_
488