diff options
Diffstat (limited to 'cpp/src/qpid/Options.cpp')
-rw-r--r-- | cpp/src/qpid/Options.cpp | 53 |
1 files changed, 41 insertions, 12 deletions
diff --git a/cpp/src/qpid/Options.cpp b/cpp/src/qpid/Options.cpp index b96fc59dda..c0e955e2b3 100644 --- a/cpp/src/qpid/Options.cpp +++ b/cpp/src/qpid/Options.cpp @@ -74,14 +74,28 @@ struct EnvOptMapper { } - string configFileLine (string& line) { + void badArg ( string& line ) { + ostringstream msg; + msg << "Bad argument: |" << line << "|\n"; + throw Exception(msg.str()); + } - if ( isComment ( line ) ) - return string(); - size_t pos = line.find ('='); - if (pos == string::npos) + string configFileLine (string& line, bool allowUnknowns=true) { + + if ( isComment ( line ) ) { return string(); + } + + size_t pos = line.find ('='); + if (pos == string::npos) { + if ( allowUnknowns ) { + return string(); + } + else { + badArg ( line ); + } + } string key = line.substr (0, pos); #if (BOOST_VERSION >= 103300) typedef const std::vector< boost::shared_ptr<po::option_description> > OptDescs; @@ -89,16 +103,31 @@ struct EnvOptMapper { find_if(opts.options().begin(), opts.options().end(), boost::bind(matchCase, key, _1)); if (i != opts.options().end()) return string (line) + "\n"; - else - return string(); + else { + if ( allowUnknowns ) { + return string(); + } + else { + badArg ( line ); + } + } #else - // Use 'count' to see if this option exists. Using 'find' will SEGV or hang - // if the option has not been defined yet. + // Use 'count' to see if this option exists. Using 'find' will + // SEGV or hang if the option has not been defined yet. if ( opts.count(key.c_str()) > 0 ) return string ( line ) + "\n"; - else - return string ( ); + else { + if ( allowUnknowns ) { + return string ( ); + } + else { + badArg ( line ); + } + } #endif + // Control will not arrive here, but the compiler things it could. + // Calls to badArg(), that I used above, throw. + return string(); } const Options& opts; @@ -160,7 +189,7 @@ void Options::parse(int argc, char const* const* argv, const std::string& config while (!conf.eof()) { string line; getline (conf, line); - filtered << mapper.configFileLine (line); + filtered << mapper.configFileLine (line, allowUnknown); } po::store(po::parse_config_file(filtered, *this), vm); |