Line data Source code
1 : //
2 : // Copyright (c) 2019 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 : #ifndef BOOST_URL_DETAIL_PATH_HPP
11 : #define BOOST_URL_DETAIL_PATH_HPP
12 :
13 : #include <boost/core/detail/string_view.hpp>
14 :
15 : namespace boost {
16 : namespace urls {
17 : namespace detail {
18 :
19 : // Return the number of characters at
20 : // the front of the path that are reserved
21 : inline
22 : std::size_t
23 4245 : path_prefix(
24 : char const* p,
25 : std::size_t n) noexcept
26 : {
27 4245 : switch(n)
28 : {
29 328 : case 0:
30 328 : return 0;
31 :
32 247 : case 1:
33 247 : if(p[0] == '/')
34 162 : return 1;
35 85 : return 0;
36 :
37 184 : case 2:
38 184 : if(p[0] == '/')
39 83 : return 1;
40 101 : if( p[0] == '.' &&
41 86 : p[1] == '/')
42 57 : return 2;
43 44 : return 0;
44 :
45 3486 : default:
46 3486 : if(p[0] == '/')
47 : {
48 1851 : if( p[1] == '.' &&
49 433 : p[2] == '/')
50 234 : return 3;
51 1617 : return 1;
52 : }
53 1635 : if( p[0] == '.' &&
54 638 : p[1] == '/')
55 351 : return 2;
56 1284 : break;
57 : }
58 1284 : return 0;
59 : }
60 :
61 : // VFALCO DEPRECATED
62 : inline
63 : std::size_t
64 4245 : path_prefix(
65 : core::string_view s) noexcept
66 : {
67 4245 : return path_prefix(
68 4245 : s.data(), s.size());
69 : }
70 :
71 : // returns the number of adjusted
72 : // segments based on the malleable prefix.
73 : inline
74 : std::size_t
75 3685 : path_segments(
76 : core::string_view s,
77 : std::size_t nseg) noexcept
78 : {
79 3685 : switch(s.size())
80 : {
81 1123 : case 0:
82 1123 : BOOST_ASSERT(nseg == 0);
83 1123 : return 0;
84 :
85 552 : case 1:
86 552 : BOOST_ASSERT(nseg == 1);
87 552 : if(s[0] == '/')
88 492 : return 0;
89 60 : return 1;
90 :
91 166 : case 2:
92 166 : if(s[0] == '/')
93 124 : return nseg;
94 66 : if( s[0] == '.' &&
95 24 : s[1] == '/')
96 : {
97 14 : BOOST_ASSERT(nseg > 1);
98 14 : return nseg - 1;
99 : }
100 28 : return nseg;
101 :
102 1844 : default:
103 1844 : if(s[0] == '/')
104 : {
105 983 : if( s[1] == '.' &&
106 66 : s[2] == '/')
107 : {
108 44 : BOOST_ASSERT(nseg > 1);
109 44 : return nseg - 1;
110 : }
111 873 : return nseg;
112 : }
113 1003 : if( s[0] == '.' &&
114 76 : s[1] == '/')
115 : {
116 39 : BOOST_ASSERT(nseg > 1);
117 39 : return nseg - 1;
118 : }
119 888 : break;
120 : }
121 888 : return nseg;
122 : }
123 :
124 : // Trim reserved characters from
125 : // the front of the path.
126 : inline
127 : core::string_view
128 : clean_path(
129 : core::string_view s) noexcept
130 : {
131 : s.remove_prefix(
132 : path_prefix(s));
133 : return s;
134 : }
135 :
136 : } // detail
137 : } // urls
138 : } // boost
139 :
140 : #endif
|