LCOV - code coverage report
Current view: top level - libs/url/src/grammar - dec_octet_rule.cpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 30 30 100.0 %
Date: 2024-03-12 19:37:18 Functions: 1 1 100.0 %

          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             : 

Generated by: LCOV version 1.15