X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2FConsole%2FProgramOptions.cc;h=951c5f0410f2a9188b86ff18dec3877d042fb4e7;hb=da4da33fc6ce9f6140d4bfb2ff8266f676e7683b;hp=0efbd7e36b00ee07600ab5adfb759a802fddac10;hpb=958bdb52c39fa39f4ef91cafd9628bcb4f85a03c;p=senf.git diff --git a/Utils/Console/ProgramOptions.cc b/Utils/Console/ProgramOptions.cc index 0efbd7e..951c5f0 100644 --- a/Utils/Console/ProgramOptions.cc +++ b/Utils/Console/ProgramOptions.cc @@ -30,6 +30,7 @@ #include #include #include "../../Utils/range.hh" +#include "OverloadedCommand.hh" //#include "ProgramOptions.mpp" #define prefix_ @@ -151,8 +152,35 @@ senf::console::detail::ProgramOptionsSource::parseLongOption(std::string const & } cmd.command(path); - parser_.parseArguments(value, cmd); - executor(std::cerr, cmd); + // Here we check, whether the command + // - is an overloaded/parsed command + // - with a single overload + // - taking only a single argument + // - which consists of a single token + // If all these conditions are met, we pass the parameter value as a single WordToken + // otherwise we parse it using the config parser + try { + GenericNode const & node (executor.getNode(cmd)); + OverloadedCommandNode const * cmdnode (dynamic_cast(&node)); + if (cmdnode && cmdnode->overloads().size() == 1) { + CommandOverload const & overload (**cmdnode->overloads().begin()); + if (overload.numArguments() == 1) { + ArgumentDoc argdoc; + argdoc.singleToken = false; + overload.argumentDoc(0, argdoc); + if (argdoc.singleToken) { + cmd.addToken(WordToken(value)); + goto execute; + } + } + } /* else */ { + parser_.parseArguments(value, cmd); + } + execute: + executor(executor.stream(), cmd); + } + catch (Executor::IgnoreCommandException &) + {} } prefix_ void