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 2297 : 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 2297 : if(it == end)
30 : {
31 : // end
32 14 : BOOST_URL_RETURN_EC(
33 : error::mismatch);
34 : }
35 2283 : if(! digit_chars(*it))
36 : {
37 : // expected DIGIT
38 1653 : 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 :
|