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 : namespace implementation_defined {
21 : auto
22 2303 : 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 2303 : if(it == end)
30 : {
31 : // end
32 14 : BOOST_URL_RETURN_EC(
33 : error::mismatch);
34 : }
35 2289 : if(! digit_chars(*it))
36 : {
37 : // expected DIGIT
38 1655 : BOOST_URL_RETURN_EC(
39 : error::mismatch);
40 : }
41 634 : unsigned v = *it - '0';
42 634 : ++it;
43 1201 : if( it == end ||
44 567 : ! digit_chars(*it))
45 : {
46 427 : return static_cast<
47 427 : value_type>(v);
48 : }
49 207 : if(v == 0)
50 : {
51 : // leading '0'
52 11 : BOOST_URL_RETURN_EC(
53 : error::invalid);
54 : }
55 196 : v = (10 * v) + *it - '0';
56 196 : ++it;
57 388 : if( it == end ||
58 192 : ! digit_chars(*it))
59 : {
60 23 : return static_cast<
61 23 : value_type>(v);
62 : }
63 173 : if(v > 25)
64 : {
65 : // integer overflow
66 13 : BOOST_URL_RETURN_EC(
67 : error::invalid);
68 : }
69 160 : v = (10 * v) + *it - '0';
70 160 : if(v > 255)
71 : {
72 : // integer overflow
73 17 : BOOST_URL_RETURN_EC(
74 : error::invalid);
75 : }
76 143 : ++it;
77 274 : if( it != end &&
78 131 : digit_chars(*it))
79 : {
80 : // integer overflow
81 7 : BOOST_URL_RETURN_EC(
82 : error::invalid);
83 : }
84 136 : return static_cast<
85 136 : value_type>(v);
86 : }
87 : } // implementation_defined
88 : } // grammar
89 : } // urls
90 : } // boost
91 :
|