diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2018-03-03 17:44:29 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2018-03-03 17:44:29 +0200 |
commit | b726efcfd9462255d1ff2eedb9e9cdcb9f85b8b2 (patch) | |
tree | 80c9b19eb9d8102809fecc48b8fd5afd1db3aadd /libbutl/url.txx | |
parent | f46f33a29f55ed70ec4e5f45bafeca8e1b51dc76 (diff) |
Add url::traits::find(), checks whether string looks like URL
Diffstat (limited to 'libbutl/url.txx')
-rw-r--r-- | libbutl/url.txx | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/libbutl/url.txx b/libbutl/url.txx index e511bed..3a2c387 100644 --- a/libbutl/url.txx +++ b/libbutl/url.txx @@ -182,6 +182,40 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. return r; } + // url_traits + // + template <typename H, typename S, typename P> + std::size_t url_traits<H, S, P>:: + find (const string_type& s, std::size_t p) + { + if (p == string_type::npos) + p = s.find (':'); + + if (p == string_type::npos || + p < 2 || + p + 1 == s.size () || s[p + 1] != '/') + return string_type::npos; + + // Scan backwards for as long as it is a valid scheme. + // + std::size_t i (p); + + for (; i != 0; --i) + { + auto c (s[i - 1]); + if (!(alnum (c) || c == '+' || c == '-' || c == '.')) + break; + } + + if (i != p && !alpha (s[i])) // First must be alpha. + ++i; + + if (p - i < 2) + return string_type::npos; + + return i; + } + // basic_url // template <typename S, typename T> @@ -209,7 +243,7 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. // Extract scheme. // - for(char_type c; i != e && (c = *i) != ':'; ++i) + for (char_type c; i != e && (c = *i) != ':'; ++i) { if (!(i == b ? alpha (c) |