diff options
Diffstat (limited to 'source/Interpreter/Options.cpp')
-rw-r--r-- | source/Interpreter/Options.cpp | 315 |
1 files changed, 166 insertions, 149 deletions
diff --git a/source/Interpreter/Options.cpp b/source/Interpreter/Options.cpp index 7f0e0abc03ea..70f532ed75de 100644 --- a/source/Interpreter/Options.cpp +++ b/source/Interpreter/Options.cpp @@ -14,6 +14,7 @@ #include <algorithm> #include <bitset> #include <map> +#include <set> // Other libraries and framework includes // Project includes @@ -477,6 +478,7 @@ Options::GenerateOptionUsage CommandObject *cmd ) { + const bool only_print_args = cmd->IsDashDashCommand(); const uint32_t screen_width = m_interpreter.GetDebugger().GetTerminalWidth(); const OptionDefinition *opt_defs = GetDefinitions(); @@ -509,203 +511,211 @@ Options::GenerateOptionUsage uint32_t i; - for (uint32_t opt_set = 0; opt_set < num_option_sets; ++opt_set) + if (!only_print_args) { - uint32_t opt_set_mask; - - opt_set_mask = 1 << opt_set; - if (opt_set > 0) - strm.Printf ("\n"); - strm.Indent (name); - - // Different option sets may require different args. - StreamString args_str; - if (cmd) - cmd->GetFormattedCommandArguments(args_str, opt_set_mask); - - // First go through and print all options that take no arguments as - // a single string. If a command has "-a" "-b" and "-c", this will show - // up as [-abc] - - std::set<int> options; - std::set<int>::const_iterator options_pos, options_end; - for (i = 0; i < num_options; ++i) + for (uint32_t opt_set = 0; opt_set < num_option_sets; ++opt_set) { - if (opt_defs[i].usage_mask & opt_set_mask && isprint8(opt_defs[i].short_option)) + uint32_t opt_set_mask; + + opt_set_mask = 1 << opt_set; + if (opt_set > 0) + strm.Printf ("\n"); + strm.Indent (name); + + // Different option sets may require different args. + StreamString args_str; + if (cmd) + cmd->GetFormattedCommandArguments(args_str, opt_set_mask); + + // First go through and print all options that take no arguments as + // a single string. If a command has "-a" "-b" and "-c", this will show + // up as [-abc] + + std::set<int> options; + std::set<int>::const_iterator options_pos, options_end; + for (i = 0; i < num_options; ++i) { - // Add current option to the end of out_stream. - - if (opt_defs[i].required == true && - opt_defs[i].option_has_arg == OptionParser::eNoArgument) + if (opt_defs[i].usage_mask & opt_set_mask && isprint8(opt_defs[i].short_option)) { - options.insert (opt_defs[i].short_option); - } - } - } + // Add current option to the end of out_stream. - if (options.empty() == false) - { - // We have some required options with no arguments - strm.PutCString(" -"); - for (i=0; i<2; ++i) - for (options_pos = options.begin(), options_end = options.end(); - options_pos != options_end; - ++options_pos) - { - if (i==0 && ::islower (*options_pos)) - continue; - if (i==1 && ::isupper (*options_pos)) - continue; - strm << (char)*options_pos; + if (opt_defs[i].required == true && + opt_defs[i].option_has_arg == OptionParser::eNoArgument) + { + options.insert (opt_defs[i].short_option); + } } - } + } - for (i = 0, options.clear(); i < num_options; ++i) - { - if (opt_defs[i].usage_mask & opt_set_mask && isprint8(opt_defs[i].short_option)) + if (options.empty() == false) { - // Add current option to the end of out_stream. + // We have some required options with no arguments + strm.PutCString(" -"); + for (i=0; i<2; ++i) + for (options_pos = options.begin(), options_end = options.end(); + options_pos != options_end; + ++options_pos) + { + if (i==0 && ::islower (*options_pos)) + continue; + if (i==1 && ::isupper (*options_pos)) + continue; + strm << (char)*options_pos; + } + } - if (opt_defs[i].required == false && - opt_defs[i].option_has_arg == OptionParser::eNoArgument) + for (i = 0, options.clear(); i < num_options; ++i) + { + if (opt_defs[i].usage_mask & opt_set_mask && isprint8(opt_defs[i].short_option)) { - options.insert (opt_defs[i].short_option); + // Add current option to the end of out_stream. + + if (opt_defs[i].required == false && + opt_defs[i].option_has_arg == OptionParser::eNoArgument) + { + options.insert (opt_defs[i].short_option); + } } } - } - if (options.empty() == false) - { - // We have some required options with no arguments - strm.PutCString(" [-"); - for (i=0; i<2; ++i) - for (options_pos = options.begin(), options_end = options.end(); - options_pos != options_end; - ++options_pos) - { - if (i==0 && ::islower (*options_pos)) - continue; - if (i==1 && ::isupper (*options_pos)) - continue; - strm << (char)*options_pos; - } - strm.PutChar(']'); - } + if (options.empty() == false) + { + // We have some required options with no arguments + strm.PutCString(" [-"); + for (i=0; i<2; ++i) + for (options_pos = options.begin(), options_end = options.end(); + options_pos != options_end; + ++options_pos) + { + if (i==0 && ::islower (*options_pos)) + continue; + if (i==1 && ::isupper (*options_pos)) + continue; + strm << (char)*options_pos; + } + strm.PutChar(']'); + } - // First go through and print the required options (list them up front). - - for (i = 0; i < num_options; ++i) - { - if (opt_defs[i].usage_mask & opt_set_mask && isprint8(opt_defs[i].short_option)) + // First go through and print the required options (list them up front). + + for (i = 0; i < num_options; ++i) { - if (opt_defs[i].required && opt_defs[i].option_has_arg != OptionParser::eNoArgument) - PrintOption (opt_defs[i], eDisplayBestOption, " ", nullptr, true, strm); + if (opt_defs[i].usage_mask & opt_set_mask && isprint8(opt_defs[i].short_option)) + { + if (opt_defs[i].required && opt_defs[i].option_has_arg != OptionParser::eNoArgument) + PrintOption (opt_defs[i], eDisplayBestOption, " ", nullptr, true, strm); + } } - } - // Now go through again, and this time only print the optional options. + // Now go through again, and this time only print the optional options. - for (i = 0; i < num_options; ++i) - { - if (opt_defs[i].usage_mask & opt_set_mask) + for (i = 0; i < num_options; ++i) { - // Add current option to the end of out_stream. + if (opt_defs[i].usage_mask & opt_set_mask) + { + // Add current option to the end of out_stream. - if (!opt_defs[i].required && opt_defs[i].option_has_arg != OptionParser::eNoArgument) - PrintOption (opt_defs[i], eDisplayBestOption, " ", nullptr, true, strm); + if (!opt_defs[i].required && opt_defs[i].option_has_arg != OptionParser::eNoArgument) + PrintOption (opt_defs[i], eDisplayBestOption, " ", nullptr, true, strm); + } } - } - - if (args_str.GetSize() > 0) - { - if (cmd->WantsRawCommandString()) - strm.Printf(" --"); - strm.Printf (" %s", args_str.GetData()); + if (args_str.GetSize() > 0) + { + if (cmd->WantsRawCommandString() && !only_print_args) + strm.Printf(" --"); + + strm.Printf (" %s", args_str.GetData()); + if (only_print_args) + break; + } } } if (cmd && - cmd->WantsRawCommandString() && + (only_print_args || cmd->WantsRawCommandString()) && arguments_str.GetSize() > 0) { - strm.PutChar('\n'); + if (!only_print_args) strm.PutChar('\n'); strm.Indent(name); strm.Printf(" %s", arguments_str.GetData()); } strm.Printf ("\n\n"); - // Now print out all the detailed information about the various options: long form, short form and help text: - // -short <argument> ( --long_name <argument> ) - // help text + if (!only_print_args) + { + // Now print out all the detailed information about the various options: long form, short form and help text: + // -short <argument> ( --long_name <argument> ) + // help text - // This variable is used to keep track of which options' info we've printed out, because some options can be in - // more than one usage level, but we only want to print the long form of its information once. + // This variable is used to keep track of which options' info we've printed out, because some options can be in + // more than one usage level, but we only want to print the long form of its information once. - std::multimap<int, uint32_t> options_seen; - strm.IndentMore (5); + std::multimap<int, uint32_t> options_seen; + strm.IndentMore (5); - // Put the unique command options in a vector & sort it, so we can output them alphabetically (by short_option) - // when writing out detailed help for each option. + // Put the unique command options in a vector & sort it, so we can output them alphabetically (by short_option) + // when writing out detailed help for each option. - for (i = 0; i < num_options; ++i) - options_seen.insert(std::make_pair(opt_defs[i].short_option, i)); + for (i = 0; i < num_options; ++i) + options_seen.insert(std::make_pair(opt_defs[i].short_option, i)); - // Go through the unique'd and alphabetically sorted vector of options, find the table entry for each option - // and write out the detailed help information for that option. + // Go through the unique'd and alphabetically sorted vector of options, find the table entry for each option + // and write out the detailed help information for that option. - bool first_option_printed = false;; + bool first_option_printed = false;; - for (auto pos : options_seen) - { - i = pos.second; - //Print out the help information for this option. + for (auto pos : options_seen) + { + i = pos.second; + //Print out the help information for this option. - // Put a newline separation between arguments - if (first_option_printed) - strm.EOL(); - else - first_option_printed = true; - - CommandArgumentType arg_type = opt_defs[i].argument_type; - - StreamString arg_name_str; - arg_name_str.Printf ("<%s>", CommandObject::GetArgumentName (arg_type)); + // Put a newline separation between arguments + if (first_option_printed) + strm.EOL(); + else + first_option_printed = true; + + CommandArgumentType arg_type = opt_defs[i].argument_type; + + StreamString arg_name_str; + arg_name_str.Printf ("<%s>", CommandObject::GetArgumentName (arg_type)); - strm.Indent (); - if (opt_defs[i].short_option && isprint8(opt_defs[i].short_option)) - { - PrintOption (opt_defs[i], eDisplayShortOption, nullptr, nullptr, false, strm); - PrintOption (opt_defs[i], eDisplayLongOption, " ( ", " )", false, strm); - } - else - { - // Short option is not printable, just print long option - PrintOption (opt_defs[i], eDisplayLongOption, nullptr, nullptr, false, strm); - } - strm.EOL(); - - strm.IndentMore (5); - - if (opt_defs[i].usage_text) - OutputFormattedUsageText (strm, - opt_defs[i], - screen_width); - if (opt_defs[i].enum_values != nullptr) - { strm.Indent (); - strm.Printf("Values: "); - for (int k = 0; opt_defs[i].enum_values[k].string_value != nullptr; k++) + if (opt_defs[i].short_option && isprint8(opt_defs[i].short_option)) { - if (k == 0) - strm.Printf("%s", opt_defs[i].enum_values[k].string_value); - else - strm.Printf(" | %s", opt_defs[i].enum_values[k].string_value); + PrintOption (opt_defs[i], eDisplayShortOption, nullptr, nullptr, false, strm); + PrintOption (opt_defs[i], eDisplayLongOption, " ( ", " )", false, strm); + } + else + { + // Short option is not printable, just print long option + PrintOption (opt_defs[i], eDisplayLongOption, nullptr, nullptr, false, strm); } strm.EOL(); + + strm.IndentMore (5); + + if (opt_defs[i].usage_text) + OutputFormattedUsageText (strm, + opt_defs[i], + screen_width); + if (opt_defs[i].enum_values != nullptr) + { + strm.Indent (); + strm.Printf("Values: "); + for (int k = 0; opt_defs[i].enum_values[k].string_value != nullptr; k++) + { + if (k == 0) + strm.Printf("%s", opt_defs[i].enum_values[k].string_value); + else + strm.Printf(" | %s", opt_defs[i].enum_values[k].string_value); + } + strm.EOL(); + } + strm.IndentLess (5); } - strm.IndentLess (5); } // Restore the indent level @@ -954,6 +964,13 @@ Options::HandleOptionArgumentCompletion for (size_t i = 0; i < opt_element_vector.size(); i++) { int cur_defs_index = opt_element_vector[i].opt_defs_index; + + // trying to use <0 indices will definitely cause problems + if (cur_defs_index == OptionArgElement::eUnrecognizedArg || + cur_defs_index == OptionArgElement::eBareDash || + cur_defs_index == OptionArgElement::eBareDoubleDash) + continue; + int cur_arg_pos = opt_element_vector[i].opt_arg_pos; const char *cur_opt_name = opt_defs[cur_defs_index].long_option; |