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