LCOV - code coverage report
Current view: top level - /jenkins/workspace/boost-root/libs/url/src - pct_string_view.cpp (source / functions) Coverage Total Hit
Test: coverage_remapped.info Lines: 100.0 % 33 33
Test Date: 2026-02-25 21:00:01 Functions: 100.0 % 3 3

           TLA  Line data    Source code
       1                 : //
       2                 : // Copyright (c) 2022 Vinnie Falco (vinnie.falco@gmail.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/error.hpp>
      13                 : #include <boost/url/pct_string_view.hpp>
      14                 : #include <boost/url/detail/decode.hpp>
      15                 : #include <boost/url/grammar/hexdig_chars.hpp>
      16                 : #include <boost/url/detail/except.hpp>
      17                 : 
      18                 : namespace boost {
      19                 : namespace urls {
      20                 : 
      21                 : void
      22 HIT        3607 : pct_string_view::
      23                 : decode_impl(
      24                 :     string_token::arg& dest,
      25                 :     encoding_opts opt) const
      26                 : {
      27            3607 :     auto p = dest.prepare(dn_);
      28            3607 :     if(dn_ > 0)
      29            2771 :         detail::decode_unsafe(
      30            2771 :             p, p + dn_, s_, opt);
      31            3607 : }
      32                 : 
      33                 : //------------------------------------------------
      34                 : 
      35            4038 : pct_string_view::
      36                 : pct_string_view(
      37            4038 :     core::string_view s)
      38                 :     : pct_string_view(
      39            4038 :         make_pct_string_view(s
      40            4038 :             ).value(BOOST_URL_POS))
      41                 : {
      42            3960 : }
      43                 : 
      44                 : //------------------------------------------------
      45                 : 
      46                 : system::result<pct_string_view>
      47            4082 : make_pct_string_view(
      48                 :     core::string_view s) noexcept
      49                 : {
      50            4082 :     auto p = s.begin();
      51            4082 :     auto const end = s.end();
      52            4082 :     std::size_t dn = 0;
      53            4082 :     if(s.size() >= 3)
      54                 :     {
      55            1981 :         auto const safe_end = end - 2;
      56           14523 :         while(p < safe_end)
      57                 :         {
      58           12558 :             if(*p != '%')
      59                 :             {
      60           11864 :                 ++p;
      61                 :             }
      62             694 :             else if(
      63            1383 :                 grammar::hexdig_value(p[1]) >= 0 &&
      64             689 :                 grammar::hexdig_value(p[2]) >= 0)
      65                 :             {
      66                 :                 // percent-escape
      67             678 :                 p += 3;
      68                 :             }
      69                 :             else
      70                 :             {
      71                 :                 // invalid encoding
      72              16 :                 BOOST_URL_RETURN_EC(
      73                 :                     error::bad_pct_hexdig);
      74                 :             }
      75           12542 :             ++dn;
      76                 :         }
      77                 :     }
      78            4066 :     auto const n = end - p;
      79            4066 :     if( (n >= 1 && p[0] == '%') ||
      80            2353 :         (n >= 2 && p[1] == '%'))
      81                 :     {
      82                 :         // invalid encoding
      83              65 :         BOOST_URL_RETURN_EC(
      84                 :             error::incomplete_encoding);
      85                 :     }
      86            4001 :     dn += n;
      87            8002 :     return make_pct_string_view_unsafe(
      88            4001 :         s.data(), s.size(), dn);
      89                 : }
      90                 : 
      91                 : } // urls
      92                 : } // boost
      93                 : 
        

Generated by: LCOV version 2.3