LCOV - code coverage report
Current view: top level - libs/url/src/rfc/query_rule.cpp (source / functions) Coverage Total Hit
Test: coverage_filtered.info Lines: 100.0 % 30 30
Test Date: 2025-11-10 19:06:20 Functions: 100.0 % 1 1

            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              : #include <boost/url/detail/config.hpp>
      11              : #include <boost/url/rfc/query_rule.hpp>
      12              : #include "detail/charsets.hpp"
      13              : #include <boost/url/error.hpp>
      14              : #include <boost/url/grammar/hexdig_chars.hpp>
      15              : 
      16              : namespace boost {
      17              : namespace urls {
      18              : 
      19              : auto
      20          576 : implementation_defined::query_rule_t::
      21              : parse(
      22              :     char const*& it,
      23              :     char const* end
      24              :         ) const noexcept ->
      25              :     system::result<value_type>
      26              : {
      27          576 :     if(it == end)
      28              :     {
      29              :         // empty string = 1 param
      30           33 :         core::string_view str(it, 0);
      31           33 :         return params_encoded_view(
      32           66 :             detail::query_ref(str, 0, 1));
      33              :     }
      34          543 :     auto const it0 = it;
      35          543 :     std::size_t dn = 0;
      36          543 :     std::size_t nparam = 1;
      37         7114 :     while(it != end)
      38              :     {
      39         6750 :         if(*it == '&')
      40              :         {
      41          463 :             ++nparam;
      42          463 :             ++it;
      43          463 :             continue;
      44              :         }
      45         6287 :         if(detail::query_chars(*it))
      46              :         {
      47         5973 :             ++it;
      48         5973 :             continue;
      49              :         }
      50          314 :         if(*it == '%')
      51              :         {
      52          285 :             if(end - it < 3 ||
      53          138 :                 (!grammar::hexdig_chars(it[1]) ||
      54          137 :                  !grammar::hexdig_chars(it[2])))
      55              :             {
      56              :                 // missing valid HEXDIG
      57           12 :                 break;
      58              :             }
      59          135 :             it += 3;
      60          135 :             dn += 2;
      61          135 :             continue;
      62              :         }
      63              :         // got reserved character
      64          167 :         break;
      65              :     }
      66          543 :     std::size_t const n(it - it0);
      67          543 :     core::string_view str(it0, n);
      68          543 :     return params_encoded_view(
      69         1086 :         detail::query_ref(
      70          543 :             str, n - dn, nparam));
      71              : }
      72              : 
      73              : } // urls
      74              : } // boost
      75              : 
        

Generated by: LCOV version 2.1