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 : 11 : #include <boost/url/detail/config.hpp> 12 : #include <boost/url/grammar/charset.hpp> 13 : #include <boost/url/grammar/dec_octet_rule.hpp> 14 : #include <boost/url/grammar/digit_chars.hpp> 15 : #include <boost/url/grammar/error.hpp> 16 : 17 : namespace boost { 18 : namespace urls { 19 : namespace grammar { 20 : 21 : auto 22 2290 : dec_octet_rule_t:: 23 : parse( 24 : char const*& it, 25 : char const* const end 26 : ) const noexcept -> 27 : system::result<value_type> 28 : { 29 2290 : if(it == end) 30 : { 31 : // end 32 14 : BOOST_URL_RETURN_EC( 33 : error::mismatch); 34 : } 35 2276 : if(! digit_chars(*it)) 36 : { 37 : // expected DIGIT 38 1646 : BOOST_URL_RETURN_EC( 39 : error::mismatch); 40 : } 41 630 : unsigned v = *it - '0'; 42 630 : ++it; 43 1194 : if( it == end || 44 564 : ! digit_chars(*it)) 45 : { 46 424 : return static_cast< 47 424 : value_type>(v); 48 : } 49 206 : if(v == 0) 50 : { 51 : // leading '0' 52 11 : BOOST_URL_RETURN_EC( 53 : error::invalid); 54 : } 55 195 : v = (10 * v) + *it - '0'; 56 195 : ++it; 57 386 : if( it == end || 58 191 : ! digit_chars(*it)) 59 : { 60 23 : return static_cast< 61 23 : value_type>(v); 62 : } 63 172 : if(v > 25) 64 : { 65 : // integer overflow 66 13 : BOOST_URL_RETURN_EC( 67 : error::invalid); 68 : } 69 159 : v = (10 * v) + *it - '0'; 70 159 : if(v > 255) 71 : { 72 : // integer overflow 73 17 : BOOST_URL_RETURN_EC( 74 : error::invalid); 75 : } 76 142 : ++it; 77 272 : if( it != end && 78 130 : digit_chars(*it)) 79 : { 80 : // integer overflow 81 7 : BOOST_URL_RETURN_EC( 82 : error::invalid); 83 : } 84 135 : return static_cast< 85 135 : value_type>(v); 86 : } 87 : 88 : } // grammar 89 : } // urls 90 : } // boost 91 :