From 871273b374f75306a6c79c4ec067f2e4ce338172 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Mon, 7 Dec 2020 22:13:06 +0300 Subject: Add proper support for option files option to load_default_options() --- libbutl/default-options.mxx | 11 +++++++---- libbutl/default-options.txx | 18 +++++++++++++----- 2 files changed, 20 insertions(+), 9 deletions(-) (limited to 'libbutl') diff --git a/libbutl/default-options.mxx b/libbutl/default-options.mxx index aeb246d..11f7bb2 100644 --- a/libbutl/default-options.mxx +++ b/libbutl/default-options.mxx @@ -61,10 +61,12 @@ LIBBUTL_MODEXPORT namespace butl using default_options = small_vector, 4>; // Search for and load the specified list of options files in the specified - // directories returning a vector of option class instances (O). If args is - // false, only options are allowed and are parsed using scanner S in the - // U::fail mode. If args is true, then both options and arguments are - // allowed in any order with options parsed in the U::stop mode. + // directories returning a vector of option class instances (O). Read + // additional options from files referenced by the specified option + // (normally --options-file). If args is false, only options are allowed and + // are parsed using scanner S in the U::fail mode. If args is true, then + // both options and arguments are allowed in any order with options parsed + // in the U::stop mode. // // Pass each default options file path to the specified function prior to // load (can be used for tracing, etc). The function signature is: @@ -112,6 +114,7 @@ LIBBUTL_MODEXPORT namespace butl const optional& extra_dir, const default_options_files&, F&&, + const std::string& option, bool args = false); // Merge the default options/arguments and the command line diff --git a/libbutl/default-options.txx b/libbutl/default-options.txx index 5245bd6..eaf4235 100644 --- a/libbutl/default-options.txx +++ b/libbutl/default-options.txx @@ -31,6 +31,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. template bool load_default_options_files (const dir_path& d, + const std::string& opt, bool args, bool remote, const small_vector& fs, @@ -43,7 +44,8 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. bool r (true); - auto load = [args, &fs, &fn, &def_ops, &r] (const dir_path& d, bool rem) + auto load = [&opt, args, &fs, &fn, &def_ops, &r] + (const dir_path& d, bool rem) { using namespace std; @@ -57,7 +59,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. { fn (p, rem, false /* overwrite */); - S s (p.string ()); + S s (p.string (), opt); // @@ Note that the potentially thrown exceptions (unknown option, // unexpected argument, etc) will not contain any location @@ -66,7 +68,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. // this in CLI. // O o; - small_vector as; + small_vector as; if (args) { @@ -88,9 +90,9 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. rem}); } } - catch (std::system_error& e) + catch (system_error& e) { - throw std::make_pair (move (p), std::move (e)); + throw make_pair (move (p), move (e)); } } }; @@ -116,6 +118,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. const optional& extra_dir, const default_options_files& ofs, F&& fn, + const std::string& opt, bool args) { if (sys_dir) @@ -206,6 +209,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. if (load_extra && extra_dir->sub (d)) { load = load_default_options_files (*extra_dir, + opt, args, false /* remote */, ofs.files, @@ -219,6 +223,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. if (load && options_dir_exists (od)) load = load_default_options_files (od, + opt, args, remote, ofs.files, @@ -235,6 +240,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. if (load && load_extra) load = load_default_options_files (*extra_dir, + opt, args, false /* remote */, ofs.files, @@ -247,6 +253,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. if (options_dir_exists (d)) load = load_default_options_files (d, + opt, args, false /* remote */, ofs.files, @@ -256,6 +263,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. if (load && sys_dir && options_dir_exists (*sys_dir)) load_default_options_files (*sys_dir, + opt, args, false /* remote */, ofs.files, -- cgit v1.1