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 9079 : parse_encoded( 25 : char const*& it, 26 : char const* end, 27 : CharSet const& cs) noexcept -> 28 : system::result<pct_string_view> 29 : { 30 9079 : auto const start = it; 31 9079 : std::size_t n = 0; 32 : char const* it0; 33 9383 : skip: 34 9383 : it0 = it; 35 9383 : it = grammar::find_if_not( 36 : it0, end, cs); 37 9383 : n += it - it0; 38 9383 : if(it == end) 39 2751 : goto finish; 40 6632 : if(*it != '%') 41 6231 : goto finish; 42 212 : for(;;) 43 : { 44 613 : ++it; 45 613 : if(it == end) 46 : { 47 : // expected HEXDIG 48 14 : BOOST_URL_RETURN_EC( 49 : grammar::error::invalid); 50 : } 51 599 : auto r = grammar::hexdig_value(*it); 52 599 : if(r < 0) 53 : { 54 : // expected HEXDIG 55 12 : BOOST_URL_RETURN_EC( 56 : grammar::error::invalid); 57 : } 58 587 : ++it; 59 587 : if(it == end) 60 : { 61 : // expected HEXDIG 62 5 : BOOST_URL_RETURN_EC( 63 : grammar::error::invalid); 64 : } 65 582 : r = grammar::hexdig_value(*it); 66 582 : if(r < 0) 67 : { 68 : // expected HEXDIG 69 8 : BOOST_URL_RETURN_EC( 70 : grammar::error::invalid); 71 : } 72 574 : ++n; 73 574 : ++it; 74 574 : if(it == end) 75 58 : break; 76 516 : if(*it != '%') 77 304 : goto skip; 78 : } 79 9040 : finish: 80 9040 : return make_pct_string_view_unsafe( 81 9040 : start, it - start, n); 82 : } 83 : 84 : } // detail 85 : 86 : //------------------------------------------------ 87 : 88 : template<class CharSet> 89 : auto 90 9079 : pct_encoded_rule_t<CharSet>:: 91 : parse( 92 : char const*& it, 93 : char const* end) const noexcept -> 94 : system::result<value_type> 95 : { 96 9079 : return detail::parse_encoded( 97 9079 : it, end, cs_); 98 : } 99 : 100 : } // urls 101 : } // boost 102 : 103 : #endif