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

          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 "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        3297 : pct_string_view::
      23             : decode_impl(
      24             :     string_token::arg& dest,
      25             :     encoding_opts opt) const
      26             : {
      27        3297 :     auto p = dest.prepare(dn_);
      28        3297 :     if(dn_ > 0)
      29        2521 :         detail::decode_unsafe(
      30        2521 :             p, p + dn_, s_, opt);
      31        3297 : }
      32             : 
      33             : //------------------------------------------------
      34             : 
      35        5678 : pct_string_view::
      36             : pct_string_view(
      37        5678 :     core::string_view s)
      38             :     : pct_string_view(
      39        5678 :         make_pct_string_view(s
      40        5678 :             ).value(BOOST_URL_POS))
      41             : {
      42        5600 : }
      43             : 
      44             : //------------------------------------------------
      45             : 
      46             : system::result<pct_string_view>
      47        5693 : make_pct_string_view(
      48             :     core::string_view s) noexcept
      49             : {
      50        5693 :     auto p = s.begin();
      51        5693 :     auto const end = s.end();
      52        5693 :     std::size_t dn = 0;
      53        5693 :     if(s.size() >= 3)
      54             :     {
      55        2904 :         auto const safe_end = end - 2;
      56       21954 :         while(p < safe_end)
      57             :         {
      58       19066 :             if(*p != '%')
      59             :             {
      60       18314 :                 ++p;
      61             :             }
      62         752 :             else if(
      63        1499 :                 grammar::hexdig_value(p[1]) >= 0 &&
      64         747 :                 grammar::hexdig_value(p[2]) >= 0)
      65             :             {
      66             :                 // percent-escape
      67         736 :                 p += 3;
      68             :             }
      69             :             else
      70             :             {
      71             :                 // invalid encoding
      72          16 :                 BOOST_URL_RETURN_EC(
      73             :                     error::bad_pct_hexdig);
      74             :             }
      75       19050 :             ++dn;
      76             :         }
      77             :     }
      78        5677 :     auto const n = end - p;
      79        5677 :     if( (n >= 1 && p[0] == '%') ||
      80        3264 :         (n >= 2 && p[1] == '%'))
      81             :     {
      82             :         // invalid encoding
      83          62 :         BOOST_URL_RETURN_EC(
      84             :             error::incomplete_encoding);
      85             :     }
      86        5615 :     dn += n;
      87        5615 :     return make_pct_string_view_unsafe(
      88        5615 :         s.data(), s.size(), dn);
      89             : }
      90             : 
      91             : } // urls
      92             : } // boost
      93             : 
      94             : 

Generated by: LCOV version 1.15