aboutsummaryrefslogtreecommitdiff
path: root/libbutl/url.txx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2018-03-03 17:44:29 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2018-03-03 17:44:29 +0200
commitb726efcfd9462255d1ff2eedb9e9cdcb9f85b8b2 (patch)
tree80c9b19eb9d8102809fecc48b8fd5afd1db3aadd /libbutl/url.txx
parentf46f33a29f55ed70ec4e5f45bafeca8e1b51dc76 (diff)
Add url::traits::find(), checks whether string looks like URL
Diffstat (limited to 'libbutl/url.txx')
-rw-r--r--libbutl/url.txx36
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)