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 : #include <boost/url/detail/config.hpp> 11 : #include "h16_rule.hpp" 12 : #include <boost/url/grammar/charset.hpp> 13 : #include <boost/url/grammar/error.hpp> 14 : #include <boost/url/grammar/hexdig_chars.hpp> 15 : #include <boost/assert.hpp> 16 : 17 : namespace boost { 18 : namespace urls { 19 : namespace detail { 20 : 21 : auto 22 932 : h16_rule_t:: 23 : parse( 24 : char const*& it, 25 : char const* end 26 : ) const noexcept -> 27 : system::result<value_type> 28 : { 29 : // VFALCO it might be impossible for 30 : // this condition to be true (coverage) 31 932 : if(it == end) 32 : { 33 : // end 34 0 : BOOST_URL_RETURN_EC( 35 : grammar::error::invalid); 36 : } 37 : 38 : std::uint16_t v; 39 : for(;;) 40 : { 41 932 : auto d = grammar::hexdig_value(*it); 42 932 : if(d < 0) 43 : { 44 : // expected HEXDIG 45 25 : BOOST_URL_RETURN_EC( 46 : grammar::error::invalid); 47 : } 48 907 : v = d; 49 907 : ++it; 50 907 : if(it == end) 51 75 : break; 52 832 : d = grammar::hexdig_value(*it); 53 832 : if(d < 0) 54 556 : break; 55 276 : v = (16 * v) + d; 56 276 : ++it; 57 276 : if(it == end) 58 4 : break; 59 272 : d = grammar::hexdig_value(*it); 60 272 : if(d < 0) 61 4 : break; 62 268 : v = (16 * v) + d; 63 268 : ++it; 64 268 : if(it == end) 65 4 : break; 66 264 : d = grammar::hexdig_value(*it); 67 264 : if(d < 0) 68 51 : break; 69 213 : v = (16 * v) + d; 70 213 : ++it; 71 213 : break; 72 : } 73 907 : return value_type{ 74 : static_cast< 75 907 : unsigned char>(v / 256), 76 : static_cast< 77 907 : unsigned char>(v % 256)}; 78 : } 79 : 80 : } // detail 81 : } // urls 82 : } // boost 83 :