diff options
Diffstat (limited to 'libqpdf/QPDFArgParser.cc')
-rw-r--r-- | libqpdf/QPDFArgParser.cc | 84 |
1 files changed, 48 insertions, 36 deletions
diff --git a/libqpdf/QPDFArgParser.cc b/libqpdf/QPDFArgParser.cc index a24b00eb..f32b8759 100644 --- a/libqpdf/QPDFArgParser.cc +++ b/libqpdf/QPDFArgParser.cc @@ -35,6 +35,9 @@ QPDFArgParser::QPDFArgParser(int argc, char* argv[], char const* progname_env) : m(new Members(argc, argv, progname_env)) { selectHelpOptionTable(); + char const* help_choices[] = {"all", 0}; + addChoices( + "help", bindParam(&QPDFArgParser::argHelp, this), false, help_choices); addBare("completion-bash", std::bind(std::mem_fn(&QPDFArgParser::argCompletionBash), this)); addBare("completion-zsh", @@ -139,13 +142,14 @@ QPDFArgParser::addOptionalParameter( } void -QPDFArgParser::addRequiredChoices( +QPDFArgParser::addChoices( std::string const& arg, param_arg_handler_t handler, + bool required, char const** choices) { OptionEntry& oe = registerArg(arg); - oe.parameter_needed = true; + oe.parameter_needed = required; oe.param_arg_handler = handler; for (char const** i = choices; *i; ++i) { @@ -254,6 +258,12 @@ QPDFArgParser::argCompletionZsh() } void +QPDFArgParser::argHelp(char*) +{ + // QXXXQ +} + +void QPDFArgParser::handleArgFileArguments() { // Support reading arguments from files. Create a new argv. Ensure @@ -624,10 +634,9 @@ QPDFArgParser::parseArgs() } OptionEntry& oe = oep->second; - if ((oe.parameter_needed && (0 == parameter)) || - ((! oe.choices.empty() && - ((0 == parameter) || - (0 == oe.choices.count(parameter)))))) + if ((oe.parameter_needed && (nullptr == parameter)) || + ((! oe.choices.empty() && (nullptr != parameter) && + (0 == oe.choices.count(parameter))))) { std::string message = "--" + arg_s + " must be given as --" + arg_s + "="; @@ -708,12 +717,13 @@ QPDFArgParser::doFinalChecks() } void -QPDFArgParser::addChoicesToCompletions(std::string const& option, +QPDFArgParser::addChoicesToCompletions(option_table_t& option_table, + std::string const& option, std::string const& extra_prefix) { - if (this->m->option_table->count(option) != 0) + if (option_table.count(option) != 0) { - OptionEntry& oe = (*this->m->option_table)[option]; + OptionEntry& oe = option_table[option]; for (std::set<std::string>::iterator iter = oe.choices.begin(); iter != oe.choices.end(); ++iter) { @@ -724,18 +734,16 @@ QPDFArgParser::addChoicesToCompletions(std::string const& option, } void -QPDFArgParser::addOptionsToCompletions() +QPDFArgParser::addOptionsToCompletions(option_table_t& option_table) { - for (std::map<std::string, OptionEntry>::iterator iter = - this->m->option_table->begin(); - iter != this->m->option_table->end(); ++iter) + for (auto& iter: option_table) { - std::string const& arg = (*iter).first; + std::string const& arg = iter.first; if (arg == "--") { continue; } - OptionEntry& oe = (*iter).second; + OptionEntry& oe = iter.second; std::string base = "--" + arg; if (oe.param_arg_handler) { @@ -743,7 +751,7 @@ QPDFArgParser::addOptionsToCompletions() { // zsh doesn't treat = as a word separator, so add all // the options so we don't get a space after the =. - addChoicesToCompletions(arg, base + "="); + addChoicesToCompletions(option_table, arg, base + "="); } this->m->completions.insert(base + "="); } @@ -755,6 +763,22 @@ QPDFArgParser::addOptionsToCompletions() } void +QPDFArgParser::insertCompletions(option_table_t& option_table, + std::string const& choice_option, + std::string const& extra_prefix) +{ + if (! choice_option.empty()) + { + addChoicesToCompletions(option_table, choice_option, extra_prefix); + } + else if ((! this->m->bash_cur.empty()) && + (this->m->bash_cur.at(0) == '-')) + { + addOptionsToCompletions(option_table); + } +} + +void QPDFArgParser::handleCompletion() { std::string extra_prefix; @@ -795,29 +819,17 @@ QPDFArgParser::handleCompletion() } } } - if (! choice_option.empty()) + if (this->m->zsh_completion && (! choice_option.empty())) { - if (this->m->zsh_completion) - { - // zsh wants --option=choice rather than just choice - extra_prefix = "--" + choice_option + "="; - } - addChoicesToCompletions(choice_option, extra_prefix); + // zsh wants --option=choice rather than just choice + extra_prefix = "--" + choice_option + "="; } - else if ((! this->m->bash_cur.empty()) && - (this->m->bash_cur.at(0) == '-')) + insertCompletions(*this->m->option_table, choice_option, extra_prefix); + if (this->m->argc == 1) { - addOptionsToCompletions(); - if (this->m->argc == 1) - { - // Help options are valid only by themselves. - for (std::map<std::string, OptionEntry>::iterator iter = - this->m->help_option_table.begin(); - iter != this->m->help_option_table.end(); ++iter) - { - this->m->completions.insert("--" + (*iter).first); - } - } + // Help options are valid only by themselves. + insertCompletions( + this->m->help_option_table, choice_option, extra_prefix); } } std::string prefix = extra_prefix + this->m->bash_cur; |