Line data Source code
1 : //
2 : // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
3 : // Copyright (c) 2022 Alan de Freitas (alandefreitas@gmail.com)
4 : //
5 : // Distributed under the Boost Software License, Version 1.0. (See accompanying
6 : // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 : //
8 : // Official repository: https://github.com/boostorg/url
9 : //
10 :
11 : #ifndef BOOST_URL_DETAIL_NORMALIZED_HPP
12 : #define BOOST_URL_DETAIL_NORMALIZED_HPP
13 :
14 : #include <boost/core/detail/string_view.hpp>
15 : #include "boost/url/segments_encoded_view.hpp"
16 :
17 : namespace boost {
18 : namespace urls {
19 : namespace detail {
20 :
21 : class fnv_1a
22 : {
23 : public:
24 : using digest_type = std::size_t;
25 :
26 : #if BOOST_URL_ARCH == 64
27 : static constexpr std::size_t const prime =
28 : static_cast<std::size_t>(0x100000001B3ULL);
29 : static constexpr std::size_t init_hash =
30 : static_cast<std::size_t>(0xcbf29ce484222325ULL);
31 : #else
32 : static constexpr std::size_t const prime =
33 : static_cast<std::size_t>(0x01000193UL);
34 : static constexpr std::size_t init_hash =
35 : static_cast<std::size_t>(0x811C9DC5UL);
36 : #endif
37 :
38 : explicit
39 304 : fnv_1a(std::size_t salt) noexcept
40 304 : : h_(init_hash + salt)
41 : {
42 304 : }
43 :
44 : void
45 4550 : put(char c) noexcept
46 : {
47 4550 : h_ ^= c;
48 4550 : h_ *= prime;
49 4550 : }
50 :
51 : void
52 304 : put(core::string_view s) noexcept
53 : {
54 400 : for (char c: s)
55 : {
56 96 : put(c);
57 : }
58 304 : }
59 :
60 : digest_type
61 304 : digest() const noexcept
62 : {
63 304 : return h_;
64 : }
65 :
66 : private:
67 : std::size_t h_;
68 : };
69 :
70 : void
71 : pop_encoded_front(
72 : core::string_view& s,
73 : char& c,
74 : std::size_t& n) noexcept;
75 :
76 : // compare two core::string_views as if they are both
77 : // percent-decoded
78 : int
79 : compare_encoded(
80 : core::string_view lhs,
81 : core::string_view rhs) noexcept;
82 :
83 : // digest a core::string_view as if it were
84 : // percent-decoded
85 : void
86 : digest_encoded(
87 : core::string_view s,
88 : fnv_1a& hasher) noexcept;
89 :
90 : void
91 : digest(
92 : core::string_view s,
93 : fnv_1a& hasher) noexcept;
94 :
95 : // check if core::string_view lhs starts with core::string_view
96 : // rhs as if they are both percent-decoded. If
97 : // lhs starts with rhs, return number of chars
98 : // matched in the encoded core::string_view
99 : std::size_t
100 : path_starts_with(
101 : core::string_view lhs,
102 : core::string_view rhs) noexcept;
103 :
104 : // check if core::string_view lhs ends with core::string_view
105 : // rhs as if they are both percent-decoded. If
106 : // lhs ends with rhs, return number of chars
107 : // matched in the encoded core::string_view
108 : std::size_t
109 : path_ends_with(
110 : core::string_view lhs,
111 : core::string_view rhs) noexcept;
112 :
113 : // compare two core::string_views as if they are both
114 : // percent-decoded and lowercase
115 : int
116 : ci_compare_encoded(
117 : core::string_view lhs,
118 : core::string_view rhs) noexcept;
119 :
120 : // digest a core::string_view as if it were decoded
121 : // and lowercase
122 : void
123 : ci_digest_encoded(
124 : core::string_view s,
125 : fnv_1a& hasher) noexcept;
126 :
127 : // compare two ascii core::string_views
128 : int
129 : compare(
130 : core::string_view lhs,
131 : core::string_view rhs) noexcept;
132 :
133 : // compare two core::string_views as if they are both
134 : // lowercase
135 : int
136 : ci_compare(
137 : core::string_view lhs,
138 : core::string_view rhs) noexcept;
139 :
140 : // digest a core::string_view as if it were lowercase
141 : void
142 : ci_digest(
143 : core::string_view s,
144 : fnv_1a& hasher) noexcept;
145 :
146 : BOOST_URL_DECL
147 : std::size_t
148 : remove_dot_segments(
149 : char* dest,
150 : char const* end,
151 : core::string_view input) noexcept;
152 :
153 : void
154 : pop_last_segment(
155 : core::string_view& str,
156 : core::string_view& seg,
157 : std::size_t& level,
158 : bool remove_unmatched) noexcept;
159 :
160 : char
161 : path_pop_back( core::string_view& s );
162 :
163 : void
164 : normalized_path_digest(
165 : core::string_view str,
166 : bool remove_unmatched,
167 : fnv_1a& hasher) noexcept;
168 :
169 : int
170 : segments_compare(
171 : segments_encoded_view seg0,
172 : segments_encoded_view seg1) noexcept;
173 :
174 : } // detail
175 : } // urls
176 : } // boost
177 :
178 : #endif
|