diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2018-01-05 15:06:24 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2018-01-05 15:10:01 +0200 |
commit | d6427addaf7de41d401dd2a871b4789022e5f7cf (patch) | |
tree | 49d98807682116c04fc11842f2fb53745434820a | |
parent | 1eff61b00307b9f0081dbf062f6f55e5d4771e52 (diff) |
Extend find_option_prefix() to return option
-rw-r--r-- | build2/utility.cxx | 40 | ||||
-rw-r--r-- | build2/utility.hxx | 25 | ||||
-rw-r--r-- | build2/utility.ixx | 8 |
3 files changed, 38 insertions, 35 deletions
diff --git a/build2/utility.cxx b/build2/utility.cxx index 8d63059..280edd3 100644 --- a/build2/utility.cxx +++ b/build2/utility.cxx @@ -397,73 +397,73 @@ namespace build2 return false; } - bool + const string* find_option_prefix (const char* p, const lookup& l, bool ic) { - return l && find_option_prefix (p, cast<strings> (l), ic); + return l ? find_option_prefix (p, cast<strings> (l), ic) : nullptr; } - bool + const string* find_option_prefix (const char* p, const strings& strs, bool ic) { size_t n (strlen (p)); - for (const string& s: strs) + for (const string& s: reverse_iterate (strs)) if ((ic ? casecmp (s, p, n) : s.compare (0, n, p)) == 0) - return true; + return &s; - return false; + return nullptr; } - bool + const char* find_option_prefix (const char* p, const cstrings& cstrs, bool ic) { size_t n (strlen (p)); - for (const char* s: cstrs) + for (const char* s: reverse_iterate (cstrs)) if (s != nullptr && (ic ? casecmp (s, p, n) : strncmp (s, p, n)) == 0) - return true; + return s; - return false; + return nullptr; } - bool + const string* find_option_prefixes (initializer_list<const char*> ps, const lookup& l, bool ic) { - return l && find_option_prefixes (ps, cast<strings> (l), ic); + return l ? find_option_prefixes (ps, cast<strings> (l), ic) : nullptr; } - bool + const string* find_option_prefixes (initializer_list<const char*> ps, const strings& strs, bool ic) { - for (const string& s: strs) + for (const string& s: reverse_iterate (strs)) for (const char* p: ps) if ((ic ? casecmp (s, p, strlen (p)) : s.compare (0, strlen (p), p)) == 0) - return true; + return &s; - return false; + return nullptr; } - bool + const char* find_option_prefixes (initializer_list<const char*> ps, const cstrings& cstrs, bool ic) { - for (const char* s: cstrs) + for (const char* s: reverse_iterate (cstrs)) if (s != nullptr) for (const char* p: ps) if ((ic ? casecmp (s, p, strlen (p)) : strncmp (s, p, strlen (p))) == 0) - return true; + return s; - return false; + return nullptr; } string diff --git a/build2/utility.hxx b/build2/utility.hxx index db6460c..cfdaee0 100644 --- a/build2/utility.hxx +++ b/build2/utility.hxx @@ -511,51 +511,54 @@ namespace build2 bool find_options (initializer_list<const char*>, const cstrings&, bool = false); - // As above but look for an option that has the specified prefix. + // As above but look for an option that has the specified prefix. Return the + // pointer to option or NULL if not found (thus can be used as bool). + // Search backward (which is normall consistent with how options override + // each other). // template <typename T> - bool + const string* find_option_prefix (const char* prefix, T&, const variable&, bool = false); template <typename T> - bool + const string* find_option_prefix (const char* prefix, T&, const char*, bool = false); - bool + const string* find_option_prefix (const char* prefix, const lookup&, bool = false); - bool + const string* find_option_prefix (const char* prefix, const strings&, bool = false); - bool + const char* find_option_prefix (const char* prefix, const cstrings&, bool = false); // As above but look for several option prefixes. // template <typename T> - bool + const string* find_option_prefixes (initializer_list<const char*>, T&, const variable&, bool = false); template <typename T> - bool + const string* find_option_prefixes (initializer_list<const char*>, T&, const char*, bool = false); - bool + const string* find_option_prefixes (initializer_list<const char*>, const lookup&, bool = false); - bool + const string* find_option_prefixes (initializer_list<const char*>, const strings&, bool = false); - bool + const char* find_option_prefixes (initializer_list<const char*>, const cstrings&, bool = false); diff --git a/build2/utility.ixx b/build2/utility.ixx index 0622e99..a726b0c 100644 --- a/build2/utility.ixx +++ b/build2/utility.ixx @@ -131,21 +131,21 @@ namespace build2 } template <typename T> - inline bool + inline const string* find_option_prefix (const char* p, T& s, const variable& var, bool ic) { return find_option_prefix (p, s[var], ic); } template <typename T> - inline bool + inline const string* find_option_prefix (const char* p, T& s, const char* var, bool ic) { return find_option_prefix (p, s[var], ic); } template <typename T> - inline bool + inline const string* find_option_prefixes (initializer_list<const char*> ps, T& s, const variable& var, @@ -155,7 +155,7 @@ namespace build2 } template <typename T> - inline bool + inline const string* find_option_prefixes (initializer_list<const char*> ps, T& s, const char* var, |