GCC Code Coverage Report


Directory: ./
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 98.2% 56 / 0 / 57
Functions: 100.0% 1 / 0 / 1
Branches: 97.4% 37 / 0 / 38

libs/url/src/rfc/detail/hier_part_rule.cpp
Line Branch Exec Source
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
11 #include <boost/url/detail/config.hpp>
12 #include "hier_part_rule.hpp"
13 #include "boost/url/rfc/detail/path_rules.hpp"
14 #include <boost/url/grammar/parse.hpp>
15 #include <boost/url/grammar/parse.hpp>
16
17 namespace boost {
18 namespace urls {
19 namespace detail {
20
21 auto
22 2304 hier_part_rule_t::
23 parse(
24 char const*& it,
25 char const* const end
26 ) const noexcept ->
27 system::result<value_type>
28 {
29 2304 value_type t;
30
2/2
✓ Branch 0 taken 44 times.
✓ Branch 1 taken 2260 times.
2304 if(it == end)
31 {
32 // path-empty
33 44 return t;
34 }
35
2/2
✓ Branch 0 taken 36 times.
✓ Branch 1 taken 2224 times.
2260 if(end - it == 1)
36 {
37
2/2
✓ Branch 0 taken 26 times.
✓ Branch 1 taken 10 times.
36 if(*it == '/')
38 {
39 // path-absolute
40 26 t.path = make_pct_string_view_unsafe(
41 it, 1, 1);
42 26 t.segment_count = 1;
43 26 ++it;
44 26 return t;
45 }
46 // path-rootless
47 10 auto rv = grammar::parse(
48 it, end, segment_rule);
49
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 10 times.
10 if(! rv)
50 return rv.error();
51 10 t.path = *rv;
52 10 t.segment_count = !t.path.empty();
53 10 return t;
54 }
55
2/2
✓ Branch 0 taken 1623 times.
✓ Branch 1 taken 601 times.
2224 if( it[0] == '/' &&
56
2/2
✓ Branch 0 taken 1527 times.
✓ Branch 1 taken 96 times.
1623 it[1] == '/')
57 {
58 // "//" authority
59 1527 it += 2;
60 auto rv = grammar::parse(
61 1527 it, end, authority_rule);
62
2/2
✓ Branch 1 taken 30 times.
✓ Branch 2 taken 1497 times.
1527 if(! rv)
63 30 return rv.error();
64 1497 t.authority = *rv;
65 1497 t.has_authority = true;
66 1527 }
67 // the authority requires an absolute path
68 // or an empty path
69
2/2
✓ Branch 0 taken 1767 times.
✓ Branch 1 taken 427 times.
2194 if(it == end || (
70
2/2
✓ Branch 0 taken 1070 times.
✓ Branch 1 taken 697 times.
1767 t.has_authority && (
71
2/2
✓ Branch 0 taken 150 times.
✓ Branch 1 taken 920 times.
1070 *it != '/' &&
72
2/2
✓ Branch 0 taken 105 times.
✓ Branch 1 taken 45 times.
150 *it != '?' &&
73
2/2
✓ Branch 0 taken 89 times.
✓ Branch 1 taken 16 times.
105 *it != '#')))
74 {
75 // path-empty
76 516 return t;
77 }
78 1678 auto const it0 = it;
79 1678 std::size_t dn = 0;
80
2/2
✓ Branch 0 taken 662 times.
✓ Branch 1 taken 1016 times.
1678 if(*it != '/')
81 {
82 662 auto rv = grammar::parse(
83 it, end, segment_rule);
84
2/2
✓ Branch 1 taken 2 times.
✓ Branch 2 taken 660 times.
662 if(! rv)
85 2 return rv.error();
86
2/2
✓ Branch 2 taken 79 times.
✓ Branch 3 taken 581 times.
660 if(rv->empty())
87 79 return t;
88 581 dn += rv->decoded_size();
89 581 ++t.segment_count;
90 }
91
2/2
✓ Branch 0 taken 3077 times.
✓ Branch 1 taken 1396 times.
4473 while(it != end)
92 {
93
2/2
✓ Branch 0 taken 1711 times.
✓ Branch 1 taken 1366 times.
3077 if(*it == '/')
94 {
95 1711 ++dn;
96 1711 ++it;
97 1711 ++t.segment_count;
98 1711 continue;
99 }
100 1366 auto rv = grammar::parse(
101 it, end, segment_rule);
102
2/2
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 1362 times.
1366 if(! rv)
103 4 return rv.error();
104
2/2
✓ Branch 2 taken 197 times.
✓ Branch 3 taken 1165 times.
1362 if(rv->empty())
105 197 break;
106 1165 dn += rv->decoded_size();
107 }
108 1593 t.path = make_pct_string_view_unsafe(
109 1593 it0, it - it0, dn);
110 1593 return t;
111 2304 }
112
113 } // detail
114 } // urls
115 } // boost
116
117