annotate libcxx/src/strstream.cpp @ 236:c4bab56944e8 llvm-original

LLVM 16
author kono
date Wed, 09 Nov 2022 17:45:10 +0900
parents 1d019706d866
children 1f2b6ac9f198
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
1 //===----------------------------------------------------------------------===//
150
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
9 #include <__assert>
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
10 #include <__utility/unreachable.h>
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
11 #include <algorithm>
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
12 #include <climits>
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
13 #include <cstdlib>
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
14 #include <cstring>
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
15 #include <strstream>
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
16
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
17 _LIBCPP_PUSH_MACROS
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
18 #include <__undef_macros>
150
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 _LIBCPP_BEGIN_NAMESPACE_STD
anatofuz
parents:
diff changeset
21
anatofuz
parents:
diff changeset
22 strstreambuf::strstreambuf(streamsize __alsize)
anatofuz
parents:
diff changeset
23 : __strmode_(__dynamic),
anatofuz
parents:
diff changeset
24 __alsize_(__alsize),
anatofuz
parents:
diff changeset
25 __palloc_(nullptr),
anatofuz
parents:
diff changeset
26 __pfree_(nullptr)
anatofuz
parents:
diff changeset
27 {
anatofuz
parents:
diff changeset
28 }
anatofuz
parents:
diff changeset
29
anatofuz
parents:
diff changeset
30 strstreambuf::strstreambuf(void* (*__palloc)(size_t), void (*__pfree)(void*))
anatofuz
parents:
diff changeset
31 : __strmode_(__dynamic),
anatofuz
parents:
diff changeset
32 __alsize_(__default_alsize),
anatofuz
parents:
diff changeset
33 __palloc_(__palloc),
anatofuz
parents:
diff changeset
34 __pfree_(__pfree)
anatofuz
parents:
diff changeset
35 {
anatofuz
parents:
diff changeset
36 }
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 void
anatofuz
parents:
diff changeset
39 strstreambuf::__init(char* __gnext, streamsize __n, char* __pbeg)
anatofuz
parents:
diff changeset
40 {
anatofuz
parents:
diff changeset
41 if (__n == 0)
anatofuz
parents:
diff changeset
42 __n = static_cast<streamsize>(strlen(__gnext));
anatofuz
parents:
diff changeset
43 else if (__n < 0)
anatofuz
parents:
diff changeset
44 __n = INT_MAX;
anatofuz
parents:
diff changeset
45 if (__pbeg == nullptr)
anatofuz
parents:
diff changeset
46 setg(__gnext, __gnext, __gnext + __n);
anatofuz
parents:
diff changeset
47 else
anatofuz
parents:
diff changeset
48 {
anatofuz
parents:
diff changeset
49 setg(__gnext, __gnext, __pbeg);
anatofuz
parents:
diff changeset
50 setp(__pbeg, __pbeg + __n);
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52 }
anatofuz
parents:
diff changeset
53
anatofuz
parents:
diff changeset
54 strstreambuf::strstreambuf(char* __gnext, streamsize __n, char* __pbeg)
anatofuz
parents:
diff changeset
55 : __strmode_(),
anatofuz
parents:
diff changeset
56 __alsize_(__default_alsize),
anatofuz
parents:
diff changeset
57 __palloc_(nullptr),
anatofuz
parents:
diff changeset
58 __pfree_(nullptr)
anatofuz
parents:
diff changeset
59 {
anatofuz
parents:
diff changeset
60 __init(__gnext, __n, __pbeg);
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 strstreambuf::strstreambuf(const char* __gnext, streamsize __n)
anatofuz
parents:
diff changeset
64 : __strmode_(__constant),
anatofuz
parents:
diff changeset
65 __alsize_(__default_alsize),
anatofuz
parents:
diff changeset
66 __palloc_(nullptr),
anatofuz
parents:
diff changeset
67 __pfree_(nullptr)
anatofuz
parents:
diff changeset
68 {
anatofuz
parents:
diff changeset
69 __init(const_cast<char *>(__gnext), __n, nullptr);
anatofuz
parents:
diff changeset
70 }
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 strstreambuf::strstreambuf(signed char* __gnext, streamsize __n, signed char* __pbeg)
anatofuz
parents:
diff changeset
73 : __strmode_(),
anatofuz
parents:
diff changeset
74 __alsize_(__default_alsize),
anatofuz
parents:
diff changeset
75 __palloc_(nullptr),
anatofuz
parents:
diff changeset
76 __pfree_(nullptr)
anatofuz
parents:
diff changeset
77 {
anatofuz
parents:
diff changeset
78 __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, reinterpret_cast<char*>(__pbeg));
anatofuz
parents:
diff changeset
79 }
anatofuz
parents:
diff changeset
80
anatofuz
parents:
diff changeset
81 strstreambuf::strstreambuf(const signed char* __gnext, streamsize __n)
anatofuz
parents:
diff changeset
82 : __strmode_(__constant),
anatofuz
parents:
diff changeset
83 __alsize_(__default_alsize),
anatofuz
parents:
diff changeset
84 __palloc_(nullptr),
anatofuz
parents:
diff changeset
85 __pfree_(nullptr)
anatofuz
parents:
diff changeset
86 {
anatofuz
parents:
diff changeset
87 __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, nullptr);
anatofuz
parents:
diff changeset
88 }
anatofuz
parents:
diff changeset
89
anatofuz
parents:
diff changeset
90 strstreambuf::strstreambuf(unsigned char* __gnext, streamsize __n, unsigned char* __pbeg)
anatofuz
parents:
diff changeset
91 : __strmode_(),
anatofuz
parents:
diff changeset
92 __alsize_(__default_alsize),
anatofuz
parents:
diff changeset
93 __palloc_(nullptr),
anatofuz
parents:
diff changeset
94 __pfree_(nullptr)
anatofuz
parents:
diff changeset
95 {
anatofuz
parents:
diff changeset
96 __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, reinterpret_cast<char*>(__pbeg));
anatofuz
parents:
diff changeset
97 }
anatofuz
parents:
diff changeset
98
anatofuz
parents:
diff changeset
99 strstreambuf::strstreambuf(const unsigned char* __gnext, streamsize __n)
anatofuz
parents:
diff changeset
100 : __strmode_(__constant),
anatofuz
parents:
diff changeset
101 __alsize_(__default_alsize),
anatofuz
parents:
diff changeset
102 __palloc_(nullptr),
anatofuz
parents:
diff changeset
103 __pfree_(nullptr)
anatofuz
parents:
diff changeset
104 {
anatofuz
parents:
diff changeset
105 __init(const_cast<char *>(reinterpret_cast<const char*>(__gnext)), __n, nullptr);
anatofuz
parents:
diff changeset
106 }
anatofuz
parents:
diff changeset
107
anatofuz
parents:
diff changeset
108 strstreambuf::~strstreambuf()
anatofuz
parents:
diff changeset
109 {
anatofuz
parents:
diff changeset
110 if (eback() && (__strmode_ & __allocated) != 0 && (__strmode_ & __frozen) == 0)
anatofuz
parents:
diff changeset
111 {
anatofuz
parents:
diff changeset
112 if (__pfree_)
anatofuz
parents:
diff changeset
113 __pfree_(eback());
anatofuz
parents:
diff changeset
114 else
anatofuz
parents:
diff changeset
115 delete [] eback();
anatofuz
parents:
diff changeset
116 }
anatofuz
parents:
diff changeset
117 }
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 void
anatofuz
parents:
diff changeset
120 strstreambuf::swap(strstreambuf& __rhs)
anatofuz
parents:
diff changeset
121 {
anatofuz
parents:
diff changeset
122 streambuf::swap(__rhs);
anatofuz
parents:
diff changeset
123 _VSTD::swap(__strmode_, __rhs.__strmode_);
anatofuz
parents:
diff changeset
124 _VSTD::swap(__alsize_, __rhs.__alsize_);
anatofuz
parents:
diff changeset
125 _VSTD::swap(__palloc_, __rhs.__palloc_);
anatofuz
parents:
diff changeset
126 _VSTD::swap(__pfree_, __rhs.__pfree_);
anatofuz
parents:
diff changeset
127 }
anatofuz
parents:
diff changeset
128
anatofuz
parents:
diff changeset
129 void
anatofuz
parents:
diff changeset
130 strstreambuf::freeze(bool __freezefl)
anatofuz
parents:
diff changeset
131 {
anatofuz
parents:
diff changeset
132 if (__strmode_ & __dynamic)
anatofuz
parents:
diff changeset
133 {
anatofuz
parents:
diff changeset
134 if (__freezefl)
anatofuz
parents:
diff changeset
135 __strmode_ |= __frozen;
anatofuz
parents:
diff changeset
136 else
anatofuz
parents:
diff changeset
137 __strmode_ &= ~__frozen;
anatofuz
parents:
diff changeset
138 }
anatofuz
parents:
diff changeset
139 }
anatofuz
parents:
diff changeset
140
anatofuz
parents:
diff changeset
141 char*
anatofuz
parents:
diff changeset
142 strstreambuf::str()
anatofuz
parents:
diff changeset
143 {
anatofuz
parents:
diff changeset
144 if (__strmode_ & __dynamic)
anatofuz
parents:
diff changeset
145 __strmode_ |= __frozen;
anatofuz
parents:
diff changeset
146 return eback();
anatofuz
parents:
diff changeset
147 }
anatofuz
parents:
diff changeset
148
anatofuz
parents:
diff changeset
149 int
anatofuz
parents:
diff changeset
150 strstreambuf::pcount() const
anatofuz
parents:
diff changeset
151 {
anatofuz
parents:
diff changeset
152 return static_cast<int>(pptr() - pbase());
anatofuz
parents:
diff changeset
153 }
anatofuz
parents:
diff changeset
154
anatofuz
parents:
diff changeset
155 strstreambuf::int_type
anatofuz
parents:
diff changeset
156 strstreambuf::overflow(int_type __c)
anatofuz
parents:
diff changeset
157 {
anatofuz
parents:
diff changeset
158 if (__c == EOF)
anatofuz
parents:
diff changeset
159 return int_type(0);
anatofuz
parents:
diff changeset
160 if (pptr() == epptr())
anatofuz
parents:
diff changeset
161 {
anatofuz
parents:
diff changeset
162 if ((__strmode_ & __dynamic) == 0 || (__strmode_ & __frozen) != 0)
anatofuz
parents:
diff changeset
163 return int_type(EOF);
anatofuz
parents:
diff changeset
164 size_t old_size = static_cast<size_t> ((epptr() ? epptr() : egptr()) - eback());
anatofuz
parents:
diff changeset
165 size_t new_size = max<size_t>(static_cast<size_t>(__alsize_), 2*old_size);
anatofuz
parents:
diff changeset
166 if (new_size == 0)
anatofuz
parents:
diff changeset
167 new_size = __default_alsize;
anatofuz
parents:
diff changeset
168 char* buf = nullptr;
anatofuz
parents:
diff changeset
169 if (__palloc_)
anatofuz
parents:
diff changeset
170 buf = static_cast<char*>(__palloc_(new_size));
anatofuz
parents:
diff changeset
171 else
anatofuz
parents:
diff changeset
172 buf = new char[new_size];
anatofuz
parents:
diff changeset
173 if (buf == nullptr)
anatofuz
parents:
diff changeset
174 return int_type(EOF);
anatofuz
parents:
diff changeset
175 if (old_size != 0) {
anatofuz
parents:
diff changeset
176 _LIBCPP_ASSERT(eback(), "overflow copying from NULL");
anatofuz
parents:
diff changeset
177 memcpy(buf, eback(), static_cast<size_t>(old_size));
anatofuz
parents:
diff changeset
178 }
anatofuz
parents:
diff changeset
179 ptrdiff_t ninp = gptr() - eback();
anatofuz
parents:
diff changeset
180 ptrdiff_t einp = egptr() - eback();
anatofuz
parents:
diff changeset
181 ptrdiff_t nout = pptr() - pbase();
anatofuz
parents:
diff changeset
182 if (__strmode_ & __allocated)
anatofuz
parents:
diff changeset
183 {
anatofuz
parents:
diff changeset
184 if (__pfree_)
anatofuz
parents:
diff changeset
185 __pfree_(eback());
anatofuz
parents:
diff changeset
186 else
anatofuz
parents:
diff changeset
187 delete [] eback();
anatofuz
parents:
diff changeset
188 }
anatofuz
parents:
diff changeset
189 setg(buf, buf + ninp, buf + einp);
anatofuz
parents:
diff changeset
190 setp(buf + einp, buf + new_size);
anatofuz
parents:
diff changeset
191 __pbump(nout);
anatofuz
parents:
diff changeset
192 __strmode_ |= __allocated;
anatofuz
parents:
diff changeset
193 }
anatofuz
parents:
diff changeset
194 *pptr() = static_cast<char>(__c);
anatofuz
parents:
diff changeset
195 pbump(1);
anatofuz
parents:
diff changeset
196 return int_type(static_cast<unsigned char>(__c));
anatofuz
parents:
diff changeset
197 }
anatofuz
parents:
diff changeset
198
anatofuz
parents:
diff changeset
199 strstreambuf::int_type
anatofuz
parents:
diff changeset
200 strstreambuf::pbackfail(int_type __c)
anatofuz
parents:
diff changeset
201 {
anatofuz
parents:
diff changeset
202 if (eback() == gptr())
anatofuz
parents:
diff changeset
203 return EOF;
anatofuz
parents:
diff changeset
204 if (__c == EOF)
anatofuz
parents:
diff changeset
205 {
anatofuz
parents:
diff changeset
206 gbump(-1);
anatofuz
parents:
diff changeset
207 return int_type(0);
anatofuz
parents:
diff changeset
208 }
anatofuz
parents:
diff changeset
209 if (__strmode_ & __constant)
anatofuz
parents:
diff changeset
210 {
anatofuz
parents:
diff changeset
211 if (gptr()[-1] == static_cast<char>(__c))
anatofuz
parents:
diff changeset
212 {
anatofuz
parents:
diff changeset
213 gbump(-1);
anatofuz
parents:
diff changeset
214 return __c;
anatofuz
parents:
diff changeset
215 }
anatofuz
parents:
diff changeset
216 return EOF;
anatofuz
parents:
diff changeset
217 }
anatofuz
parents:
diff changeset
218 gbump(-1);
anatofuz
parents:
diff changeset
219 *gptr() = static_cast<char>(__c);
anatofuz
parents:
diff changeset
220 return __c;
anatofuz
parents:
diff changeset
221 }
anatofuz
parents:
diff changeset
222
anatofuz
parents:
diff changeset
223 strstreambuf::int_type
anatofuz
parents:
diff changeset
224 strstreambuf::underflow()
anatofuz
parents:
diff changeset
225 {
anatofuz
parents:
diff changeset
226 if (gptr() == egptr())
anatofuz
parents:
diff changeset
227 {
anatofuz
parents:
diff changeset
228 if (egptr() >= pptr())
anatofuz
parents:
diff changeset
229 return EOF;
anatofuz
parents:
diff changeset
230 setg(eback(), gptr(), pptr());
anatofuz
parents:
diff changeset
231 }
anatofuz
parents:
diff changeset
232 return int_type(static_cast<unsigned char>(*gptr()));
anatofuz
parents:
diff changeset
233 }
anatofuz
parents:
diff changeset
234
anatofuz
parents:
diff changeset
235 strstreambuf::pos_type
anatofuz
parents:
diff changeset
236 strstreambuf::seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __which)
anatofuz
parents:
diff changeset
237 {
anatofuz
parents:
diff changeset
238 off_type __p(-1);
anatofuz
parents:
diff changeset
239 bool pos_in = (__which & ios::in) != 0;
anatofuz
parents:
diff changeset
240 bool pos_out = (__which & ios::out) != 0;
anatofuz
parents:
diff changeset
241 bool legal = false;
anatofuz
parents:
diff changeset
242 switch (__way)
anatofuz
parents:
diff changeset
243 {
anatofuz
parents:
diff changeset
244 case ios::beg:
anatofuz
parents:
diff changeset
245 case ios::end:
anatofuz
parents:
diff changeset
246 if (pos_in || pos_out)
anatofuz
parents:
diff changeset
247 legal = true;
anatofuz
parents:
diff changeset
248 break;
anatofuz
parents:
diff changeset
249 case ios::cur:
anatofuz
parents:
diff changeset
250 if (pos_in != pos_out)
anatofuz
parents:
diff changeset
251 legal = true;
anatofuz
parents:
diff changeset
252 break;
anatofuz
parents:
diff changeset
253 }
anatofuz
parents:
diff changeset
254 if (pos_in && gptr() == nullptr)
anatofuz
parents:
diff changeset
255 legal = false;
anatofuz
parents:
diff changeset
256 if (pos_out && pptr() == nullptr)
anatofuz
parents:
diff changeset
257 legal = false;
anatofuz
parents:
diff changeset
258 if (legal)
anatofuz
parents:
diff changeset
259 {
anatofuz
parents:
diff changeset
260 off_type newoff;
anatofuz
parents:
diff changeset
261 char* seekhigh = epptr() ? epptr() : egptr();
anatofuz
parents:
diff changeset
262 switch (__way)
anatofuz
parents:
diff changeset
263 {
anatofuz
parents:
diff changeset
264 case ios::beg:
anatofuz
parents:
diff changeset
265 newoff = 0;
anatofuz
parents:
diff changeset
266 break;
anatofuz
parents:
diff changeset
267 case ios::cur:
anatofuz
parents:
diff changeset
268 newoff = (pos_in ? gptr() : pptr()) - eback();
anatofuz
parents:
diff changeset
269 break;
anatofuz
parents:
diff changeset
270 case ios::end:
anatofuz
parents:
diff changeset
271 newoff = seekhigh - eback();
anatofuz
parents:
diff changeset
272 break;
anatofuz
parents:
diff changeset
273 default:
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
274 __libcpp_unreachable();
150
anatofuz
parents:
diff changeset
275 }
anatofuz
parents:
diff changeset
276 newoff += __off;
anatofuz
parents:
diff changeset
277 if (0 <= newoff && newoff <= seekhigh - eback())
anatofuz
parents:
diff changeset
278 {
anatofuz
parents:
diff changeset
279 char* newpos = eback() + newoff;
anatofuz
parents:
diff changeset
280 if (pos_in)
anatofuz
parents:
diff changeset
281 setg(eback(), newpos, _VSTD::max(newpos, egptr()));
anatofuz
parents:
diff changeset
282 if (pos_out)
anatofuz
parents:
diff changeset
283 {
anatofuz
parents:
diff changeset
284 // min(pbase, newpos), newpos, epptr()
anatofuz
parents:
diff changeset
285 __off = epptr() - newpos;
anatofuz
parents:
diff changeset
286 setp(min(pbase(), newpos), epptr());
anatofuz
parents:
diff changeset
287 __pbump((epptr() - pbase()) - __off);
anatofuz
parents:
diff changeset
288 }
anatofuz
parents:
diff changeset
289 __p = newoff;
anatofuz
parents:
diff changeset
290 }
anatofuz
parents:
diff changeset
291 }
anatofuz
parents:
diff changeset
292 return pos_type(__p);
anatofuz
parents:
diff changeset
293 }
anatofuz
parents:
diff changeset
294
anatofuz
parents:
diff changeset
295 strstreambuf::pos_type
anatofuz
parents:
diff changeset
296 strstreambuf::seekpos(pos_type __sp, ios_base::openmode __which)
anatofuz
parents:
diff changeset
297 {
anatofuz
parents:
diff changeset
298 off_type __p(-1);
anatofuz
parents:
diff changeset
299 bool pos_in = (__which & ios::in) != 0;
anatofuz
parents:
diff changeset
300 bool pos_out = (__which & ios::out) != 0;
anatofuz
parents:
diff changeset
301 if (pos_in || pos_out)
anatofuz
parents:
diff changeset
302 {
anatofuz
parents:
diff changeset
303 if (!((pos_in && gptr() == nullptr) || (pos_out && pptr() == nullptr)))
anatofuz
parents:
diff changeset
304 {
anatofuz
parents:
diff changeset
305 off_type newoff = __sp;
anatofuz
parents:
diff changeset
306 char* seekhigh = epptr() ? epptr() : egptr();
anatofuz
parents:
diff changeset
307 if (0 <= newoff && newoff <= seekhigh - eback())
anatofuz
parents:
diff changeset
308 {
anatofuz
parents:
diff changeset
309 char* newpos = eback() + newoff;
anatofuz
parents:
diff changeset
310 if (pos_in)
anatofuz
parents:
diff changeset
311 setg(eback(), newpos, _VSTD::max(newpos, egptr()));
anatofuz
parents:
diff changeset
312 if (pos_out)
anatofuz
parents:
diff changeset
313 {
anatofuz
parents:
diff changeset
314 // min(pbase, newpos), newpos, epptr()
anatofuz
parents:
diff changeset
315 off_type temp = epptr() - newpos;
anatofuz
parents:
diff changeset
316 setp(min(pbase(), newpos), epptr());
anatofuz
parents:
diff changeset
317 __pbump((epptr() - pbase()) - temp);
anatofuz
parents:
diff changeset
318 }
anatofuz
parents:
diff changeset
319 __p = newoff;
anatofuz
parents:
diff changeset
320 }
anatofuz
parents:
diff changeset
321 }
anatofuz
parents:
diff changeset
322 }
anatofuz
parents:
diff changeset
323 return pos_type(__p);
anatofuz
parents:
diff changeset
324 }
anatofuz
parents:
diff changeset
325
anatofuz
parents:
diff changeset
326 istrstream::~istrstream()
anatofuz
parents:
diff changeset
327 {
anatofuz
parents:
diff changeset
328 }
anatofuz
parents:
diff changeset
329
anatofuz
parents:
diff changeset
330 ostrstream::~ostrstream()
anatofuz
parents:
diff changeset
331 {
anatofuz
parents:
diff changeset
332 }
anatofuz
parents:
diff changeset
333
anatofuz
parents:
diff changeset
334 strstream::~strstream()
anatofuz
parents:
diff changeset
335 {
anatofuz
parents:
diff changeset
336 }
anatofuz
parents:
diff changeset
337
anatofuz
parents:
diff changeset
338 _LIBCPP_END_NAMESPACE_STD
236
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
339
c4bab56944e8 LLVM 16
kono
parents: 150
diff changeset
340 _LIBCPP_POP_MACROS