GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 100.0% 33 / 0 / 33
Functions: 100.0% 3 / 0 / 3
Branches: 100.0% 23 / 0 / 23

libs/url/src/pct_string_view.cpp
Line Branch Exec Source
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 3561 pct_string_view::
23 decode_impl(
24 string_token::arg& dest,
25 encoding_opts opt) const
26 {
27 3561 auto p = dest.prepare(dn_);
28
2/2
✓ Branch 0 taken 2727 times.
✓ Branch 1 taken 834 times.
3561 if(dn_ > 0)
29 2727 detail::decode_unsafe(
30 2727 p, p + dn_, s_, opt);
31 3561 }
32
33 //------------------------------------------------
34
35 6000 pct_string_view::
36 pct_string_view(
37 6000 core::string_view s)
38 : pct_string_view(
39 6000 make_pct_string_view(s
40
1/1
✓ Branch 2 taken 5922 times.
6000 ).value(BOOST_URL_POS))
41 {
42 5922 }
43
44 //------------------------------------------------
45
46 system::result<pct_string_view>
47 6044 make_pct_string_view(
48 core::string_view s) noexcept
49 {
50 6044 auto p = s.begin();
51 6044 auto const end = s.end();
52 6044 std::size_t dn = 0;
53
2/2
✓ Branch 1 taken 3169 times.
✓ Branch 2 taken 2875 times.
6044 if(s.size() >= 3)
54 {
55 3169 auto const safe_end = end - 2;
56
2/2
✓ Branch 0 taken 22045 times.
✓ Branch 1 taken 3153 times.
25198 while(p < safe_end)
57 {
58
2/2
✓ Branch 0 taken 21169 times.
✓ Branch 1 taken 876 times.
22045 if(*p != '%')
59 {
60 21169 ++p;
61 }
62 876 else if(
63
6/6
✓ Branch 1 taken 871 times.
✓ Branch 2 taken 5 times.
✓ Branch 3 taken 860 times.
✓ Branch 4 taken 11 times.
✓ Branch 5 taken 860 times.
✓ Branch 6 taken 16 times.
1747 grammar::hexdig_value(p[1]) >= 0 &&
64 871 grammar::hexdig_value(p[2]) >= 0)
65 {
66 // percent-escape
67 860 p += 3;
68 }
69 else
70 {
71 // invalid encoding
72 16 BOOST_URL_RETURN_EC(
73 error::bad_pct_hexdig);
74 }
75 22029 ++dn;
76 }
77 }
78 6028 auto const n = end - p;
79
6/6
✓ Branch 0 taken 4522 times.
✓ Branch 1 taken 1506 times.
✓ Branch 2 taken 4462 times.
✓ Branch 3 taken 60 times.
✓ Branch 4 taken 3518 times.
✓ Branch 5 taken 2450 times.
6028 if( (n >= 1 && p[0] == '%') ||
80
2/2
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 3513 times.
3518 (n >= 2 && p[1] == '%'))
81 {
82 // invalid encoding
83 65 BOOST_URL_RETURN_EC(
84 error::incomplete_encoding);
85 }
86 5963 dn += n;
87 11926 return make_pct_string_view_unsafe(
88 5963 s.data(), s.size(), dn);
89 }
90
91 } // urls
92 } // boost
93
94