LCOV - code coverage report
Current view: top level - boost/url/rfc/impl - pct_encoded_rule.hpp (source / functions) Hit Total Coverage
Test: coverage_filtered.info Lines: 36 36 100.0 %
Date: 2024-02-29 20:02:55 Functions: 6 6 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             : #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        9079 : parse_encoded(
      25             :     char const*& it,
      26             :     char const* end,
      27             :     CharSet const& cs) noexcept ->
      28             :         system::result<pct_string_view>
      29             : {
      30        9079 :     auto const start = it;
      31        9079 :     std::size_t n = 0;
      32             :     char const* it0;
      33        9383 : skip:
      34        9383 :     it0 = it;
      35        9383 :     it = grammar::find_if_not(
      36             :         it0, end, cs);
      37        9383 :     n += it - it0;
      38        9383 :     if(it == end)
      39        2751 :         goto finish;
      40        6632 :     if(*it != '%')
      41        6231 :         goto finish;
      42         212 :     for(;;)
      43             :     {
      44         613 :         ++it;
      45         613 :         if(it == end)
      46             :         {
      47             :             // expected HEXDIG
      48          14 :             BOOST_URL_RETURN_EC(
      49             :                 grammar::error::invalid);
      50             :         }
      51         599 :         auto r = grammar::hexdig_value(*it);
      52         599 :         if(r < 0)
      53             :         {
      54             :             // expected HEXDIG
      55          12 :             BOOST_URL_RETURN_EC(
      56             :                 grammar::error::invalid);
      57             :         }
      58         587 :         ++it;
      59         587 :         if(it == end)
      60             :         {
      61             :             // expected HEXDIG
      62           5 :             BOOST_URL_RETURN_EC(
      63             :                 grammar::error::invalid);
      64             :         }
      65         582 :         r = grammar::hexdig_value(*it);
      66         582 :         if(r < 0)
      67             :         {
      68             :             // expected HEXDIG
      69           8 :             BOOST_URL_RETURN_EC(
      70             :                 grammar::error::invalid);
      71             :         }
      72         574 :         ++n;
      73         574 :         ++it;
      74         574 :         if(it == end)
      75          58 :             break;
      76         516 :         if(*it != '%')
      77         304 :             goto skip;
      78             :     }
      79        9040 : finish:
      80        9040 :     return make_pct_string_view_unsafe(
      81        9040 :         start, it - start, n);
      82             : }
      83             : 
      84             : } // detail
      85             : 
      86             : //------------------------------------------------
      87             : 
      88             : template<class CharSet>
      89             : auto
      90        9079 : pct_encoded_rule_t<CharSet>::
      91             : parse(
      92             :     char const*& it,
      93             :     char const* end) const noexcept ->
      94             :         system::result<value_type>
      95             : {
      96        9079 :     return detail::parse_encoded(
      97        9079 :         it, end, cs_);
      98             : }
      99             : 
     100             : } // urls
     101             : } // boost
     102             : 
     103             : #endif

Generated by: LCOV version 1.15