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 :
11 : #include <boost/url/detail/config.hpp>
12 : #include "../rfc/detail/charsets.hpp"
13 : #include <boost/url/detail/any_segments_iter.hpp>
14 : #include <boost/core/detail/string_view.hpp>
15 : #include <boost/url/encode.hpp>
16 : #include <boost/url/rfc/pchars.hpp>
17 :
18 : namespace boost {
19 : namespace urls {
20 : namespace detail {
21 :
22 : //------------------------------------------------
23 : //
24 : // segment_iter
25 : //
26 : //------------------------------------------------
27 :
28 74 : segment_iter::
29 : segment_iter(
30 74 : core::string_view s_) noexcept
31 74 : : any_segments_iter(s_)
32 : {
33 74 : front = s;
34 74 : fast_nseg = 1;
35 74 : }
36 :
37 : void
38 74 : segment_iter::
39 : rewind() noexcept
40 : {
41 74 : at_end_ = false;
42 74 : }
43 :
44 : bool
45 148 : segment_iter::
46 : measure(
47 : std::size_t& n) noexcept
48 : {
49 148 : if(at_end_)
50 74 : return false;
51 74 : encoding_opts opt;
52 74 : opt.space_as_plus = false;
53 74 : n += encoded_size(
54 : s,
55 74 : encode_colons ?
56 : nocolon_pchars :
57 : pchars,
58 : opt);
59 74 : at_end_ = true;
60 74 : return true;
61 : }
62 :
63 : void
64 74 : segment_iter::
65 : copy(
66 : char*& dest,
67 : char const* end) noexcept
68 : {
69 74 : encoding_opts opt;
70 74 : opt.space_as_plus = false;
71 74 : dest += encode(
72 : dest,
73 74 : end - dest,
74 : s,
75 74 : encode_colons ?
76 : nocolon_pchars :
77 : pchars,
78 : opt);
79 74 : }
80 :
81 : //------------------------------------------------
82 : //
83 : // segments_iter_base
84 : //
85 : //------------------------------------------------
86 :
87 : void
88 188 : segments_iter_base::
89 : measure_impl(
90 : std::size_t& n,
91 : core::string_view s,
92 : bool encode_colons) noexcept
93 : {
94 188 : encoding_opts opt;
95 188 : opt.space_as_plus = false;
96 188 : n += encoded_size(
97 : s,
98 : encode_colons ?
99 : nocolon_pchars :
100 : pchars,
101 : opt);
102 188 : }
103 :
104 : void
105 188 : segments_iter_base::
106 : copy_impl(
107 : char*& dest,
108 : char const* end,
109 : core::string_view s,
110 : bool encode_colons) noexcept
111 : {
112 188 : encoding_opts opt;
113 188 : opt.space_as_plus = false;
114 188 : dest += encode(
115 : dest,
116 188 : end - dest,
117 : s,
118 : encode_colons ?
119 : nocolon_pchars :
120 : pchars,
121 : opt);
122 188 : }
123 :
124 : //------------------------------------------------
125 : //
126 : // segment_encoded_iter
127 : //
128 : //------------------------------------------------
129 :
130 72 : segment_encoded_iter::
131 : segment_encoded_iter(
132 72 : pct_string_view const& s_) noexcept
133 72 : : any_segments_iter(s_)
134 : {
135 72 : front = s;
136 72 : fast_nseg = 1;
137 72 : }
138 :
139 : void
140 72 : segment_encoded_iter::
141 : rewind() noexcept
142 : {
143 72 : at_end_ = false;
144 72 : }
145 :
146 : bool
147 144 : segment_encoded_iter::
148 : measure(
149 : std::size_t& n) noexcept
150 : {
151 144 : if(at_end_)
152 72 : return false;
153 72 : encoding_opts opt;
154 72 : opt.space_as_plus = false;
155 72 : n += detail::re_encoded_size_unsafe(
156 : s,
157 72 : encode_colons ?
158 : nocolon_pchars :
159 : pchars,
160 : opt);
161 72 : at_end_ = true;
162 72 : return true;
163 : }
164 :
165 : void
166 72 : segment_encoded_iter::
167 : copy(
168 : char*& dest,
169 : char const* end) noexcept
170 : {
171 72 : encoding_opts opt;
172 72 : opt.space_as_plus = false;
173 72 : detail::re_encode_unsafe(
174 : dest,
175 : end,
176 : s,
177 72 : encode_colons ?
178 : nocolon_pchars :
179 : pchars,
180 : opt);
181 72 : }
182 :
183 : //------------------------------------------------
184 : //
185 : // segments_encoded_iter_base
186 : //
187 : //------------------------------------------------
188 :
189 : void
190 399 : segments_encoded_iter_base::
191 : measure_impl(
192 : std::size_t& n,
193 : core::string_view s,
194 : bool encode_colons) noexcept
195 : {
196 399 : encoding_opts opt;
197 399 : opt.space_as_plus = false;
198 399 : n += detail::re_encoded_size_unsafe(
199 : s,
200 : encode_colons ?
201 : nocolon_pchars :
202 : pchars,
203 : opt);
204 399 : }
205 :
206 : void
207 397 : segments_encoded_iter_base::
208 : copy_impl(
209 : char*& dest,
210 : char const* end,
211 : core::string_view s,
212 : bool encode_colons) noexcept
213 : {
214 397 : encoding_opts opt;
215 397 : opt.space_as_plus = false;
216 397 : detail::re_encode_unsafe(
217 : dest,
218 : end,
219 : s,
220 : encode_colons ?
221 : nocolon_pchars :
222 : pchars,
223 : opt);
224 397 : }
225 :
226 : } // detail
227 : } // urls
228 : } // boost
229 :
|