LCOV - code coverage report
Current view: top level - boost/url/rfc/impl/pct_encoded_rule.hpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 36 36
Test Date: 2024-08-19 20:08:54 Functions: 100.0 % 6 6

            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              : #ifndef BOOST_URL_RFC_IMPL_PCT_ENCODED_RULE_HPP
      11              : #define BOOST_URL_RFC_IMPL_PCT_ENCODED_RULE_HPP
      12              : 
      13              : #include <boost/url/grammar/charset.hpp>
      14              : #include <boost/url/grammar/error.hpp>
      15              : #include <boost/url/grammar/hexdig_chars.hpp>
      16              : 
      17              : namespace boost {
      18              : namespace urls {
      19              : 
      20              : namespace detail {
      21              : 
      22              : template<class CharSet>
      23              : auto
      24         9143 : parse_encoded(
      25              :     char const*& it,
      26              :     char const* end,
      27              :     CharSet const& cs) noexcept ->
      28              :         system::result<pct_string_view>
      29              : {
      30         9143 :     auto const start = it;
      31         9143 :     std::size_t n = 0;
      32              :     char const* it0;
      33         9451 : skip:
      34         9451 :     it0 = it;
      35         9451 :     it = grammar::find_if_not(
      36              :         it0, end, cs);
      37         9451 :     n += it - it0;
      38         9451 :     if(it == end)
      39         2772 :         goto finish;
      40         6679 :     if(*it != '%')
      41         6272 :         goto finish;
      42          212 :     for(;;)
      43              :     {
      44          619 :         ++it;
      45          619 :         if(it == end)
      46              :         {
      47              :             // expected HEXDIG
      48           14 :             BOOST_URL_RETURN_EC(
      49              :                 grammar::error::invalid);
      50              :         }
      51          605 :         auto r = grammar::hexdig_value(*it);
      52          605 :         if(r < 0)
      53              :         {
      54              :             // expected HEXDIG
      55           12 :             BOOST_URL_RETURN_EC(
      56              :                 grammar::error::invalid);
      57              :         }
      58          593 :         ++it;
      59          593 :         if(it == end)
      60              :         {
      61              :             // expected HEXDIG
      62            5 :             BOOST_URL_RETURN_EC(
      63              :                 grammar::error::invalid);
      64              :         }
      65          588 :         r = grammar::hexdig_value(*it);
      66          588 :         if(r < 0)
      67              :         {
      68              :             // expected HEXDIG
      69            8 :             BOOST_URL_RETURN_EC(
      70              :                 grammar::error::invalid);
      71              :         }
      72          580 :         ++n;
      73          580 :         ++it;
      74          580 :         if(it == end)
      75           60 :             break;
      76          520 :         if(*it != '%')
      77          308 :             goto skip;
      78              :     }
      79         9104 : finish:
      80         9104 :     return make_pct_string_view_unsafe(
      81         9104 :         start, it - start, n);
      82              : }
      83              : 
      84              : } // detail
      85              : 
      86              : //------------------------------------------------
      87              : 
      88              : template<class CharSet>
      89              : auto
      90         9143 : implementation_defined::pct_encoded_rule_t<CharSet>::
      91              : parse(
      92              :     char const*& it,
      93              :     char const* end) const noexcept ->
      94              :         system::result<value_type>
      95              : {
      96         9143 :     return detail::parse_encoded(
      97         9143 :         it, end, cs_);
      98              : }
      99              : 
     100              : } // urls
     101              : } // boost
     102              : 
     103              : #endif
        

Generated by: LCOV version 2.1