Line data Source code
1 : //
2 : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 : //
4 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 : //
7 : // Official repository: https://github.com/boostorg/url
8 : //
9 :
10 : #ifndef BOOST_URL_RFC_IMPL_PCT_ENCODED_RULE_HPP
11 : #define BOOST_URL_RFC_IMPL_PCT_ENCODED_RULE_HPP
12 :
13 : #include <boost/url/grammar/charset.hpp>
14 : #include <boost/url/grammar/error.hpp>
15 : #include <boost/url/grammar/hexdig_chars.hpp>
16 :
17 : namespace boost {
18 : namespace urls {
19 :
20 : namespace detail {
21 :
22 : template<class CharSet>
23 : auto
24 9143 : parse_encoded(
25 : char const*& it,
26 : char const* end,
27 : CharSet const& cs) noexcept ->
28 : system::result<pct_string_view>
29 : {
30 9143 : auto const start = it;
31 9143 : std::size_t n = 0;
32 : char const* it0;
33 9451 : skip:
34 9451 : it0 = it;
35 9451 : it = grammar::find_if_not(
36 : it0, end, cs);
37 9451 : n += it - it0;
38 9451 : if(it == end)
39 2772 : goto finish;
40 6679 : if(*it != '%')
41 6272 : goto finish;
42 212 : for(;;)
43 : {
44 619 : ++it;
45 619 : if(it == end)
46 : {
47 : // expected HEXDIG
48 14 : BOOST_URL_RETURN_EC(
49 : grammar::error::invalid);
50 : }
51 605 : auto r = grammar::hexdig_value(*it);
52 605 : if(r < 0)
53 : {
54 : // expected HEXDIG
55 12 : BOOST_URL_RETURN_EC(
56 : grammar::error::invalid);
57 : }
58 593 : ++it;
59 593 : if(it == end)
60 : {
61 : // expected HEXDIG
62 5 : BOOST_URL_RETURN_EC(
63 : grammar::error::invalid);
64 : }
65 588 : r = grammar::hexdig_value(*it);
66 588 : if(r < 0)
67 : {
68 : // expected HEXDIG
69 8 : BOOST_URL_RETURN_EC(
70 : grammar::error::invalid);
71 : }
72 580 : ++n;
73 580 : ++it;
74 580 : if(it == end)
75 60 : break;
76 520 : if(*it != '%')
77 308 : goto skip;
78 : }
79 9104 : finish:
80 9104 : return make_pct_string_view_unsafe(
81 9104 : start, it - start, n);
82 : }
83 :
84 : } // detail
85 :
86 : //------------------------------------------------
87 :
88 : template<class CharSet>
89 : auto
90 9143 : implementation_defined::pct_encoded_rule_t<CharSet>::
91 : parse(
92 : char const*& it,
93 : char const* end) const noexcept ->
94 : system::result<value_type>
95 : {
96 9143 : return detail::parse_encoded(
97 9143 : it, end, cs_);
98 : }
99 :
100 : } // urls
101 : } // boost
102 :
103 : #endif
|