/Users/buildslave/jenkins/workspace/coverage/llvm-project/libcxx/include/__std_stream
Line | Count | Source (jump to first uncovered line) |
1 | | // -*- C++ -*- |
2 | | //===----------------------------------------------------------------------===// |
3 | | // |
4 | | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
5 | | // See https://llvm.org/LICENSE.txt for license information. |
6 | | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | |
10 | | #ifndef _LIBCPP___STD_STREAM |
11 | | #define _LIBCPP___STD_STREAM |
12 | | |
13 | | #include <__config> |
14 | | #include <ostream> |
15 | | #include <istream> |
16 | | #include <__locale> |
17 | | #include <cstdio> |
18 | | |
19 | | #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) |
20 | | #pragma GCC system_header |
21 | | #endif |
22 | | |
23 | | _LIBCPP_PUSH_MACROS |
24 | | #include <__undef_macros> |
25 | | |
26 | | |
27 | | _LIBCPP_BEGIN_NAMESPACE_STD |
28 | | |
29 | | static const int __limit = 8; |
30 | | |
31 | | // __stdinbuf |
32 | | |
33 | | template <class _CharT> |
34 | | class _LIBCPP_HIDDEN __stdinbuf |
35 | | : public basic_streambuf<_CharT, char_traits<_CharT> > |
36 | | { |
37 | | public: |
38 | | typedef _CharT char_type; |
39 | | typedef char_traits<char_type> traits_type; |
40 | | typedef typename traits_type::int_type int_type; |
41 | | typedef typename traits_type::pos_type pos_type; |
42 | | typedef typename traits_type::off_type off_type; |
43 | | typedef typename traits_type::state_type state_type; |
44 | | |
45 | | __stdinbuf(FILE* __fp, state_type* __st); |
46 | | |
47 | | protected: |
48 | | virtual int_type underflow(); |
49 | | virtual int_type uflow(); |
50 | | virtual int_type pbackfail(int_type __c = traits_type::eof()); |
51 | | virtual void imbue(const locale& __loc); |
52 | | |
53 | | private: |
54 | | |
55 | | FILE* __file_; |
56 | | const codecvt<char_type, char, state_type>* __cv_; |
57 | | state_type* __st_; |
58 | | int __encoding_; |
59 | | int_type __last_consumed_; |
60 | | bool __last_consumed_is_next_; |
61 | | bool __always_noconv_; |
62 | | |
63 | | __stdinbuf(const __stdinbuf&); |
64 | | __stdinbuf& operator=(const __stdinbuf&); |
65 | | |
66 | | int_type __getchar(bool __consume); |
67 | | }; |
68 | | |
69 | | template <class _CharT> |
70 | | __stdinbuf<_CharT>::__stdinbuf(FILE* __fp, state_type* __st) |
71 | | : __file_(__fp), |
72 | | __st_(__st), |
73 | | __last_consumed_(traits_type::eof()), |
74 | | __last_consumed_is_next_(false) |
75 | 17.0k | { |
76 | 17.0k | imbue(this->getloc()); |
77 | 17.0k | } std::__1::__stdinbuf<char>::__stdinbuf(__sFILE*, __mbstate_t*) Line | Count | Source | 75 | 8.50k | { | 76 | 8.50k | imbue(this->getloc()); | 77 | 8.50k | } |
std::__1::__stdinbuf<wchar_t>::__stdinbuf(__sFILE*, __mbstate_t*) Line | Count | Source | 75 | 8.50k | { | 76 | 8.50k | imbue(this->getloc()); | 77 | 8.50k | } |
|
78 | | |
79 | | template <class _CharT> |
80 | | void |
81 | | __stdinbuf<_CharT>::imbue(const locale& __loc) |
82 | 17.0k | { |
83 | 17.0k | __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); |
84 | 17.0k | __encoding_ = __cv_->encoding(); |
85 | 17.0k | __always_noconv_ = __cv_->always_noconv(); |
86 | 17.0k | if (__encoding_ > __limit) |
87 | 0 | __throw_runtime_error("unsupported locale for standard input"); |
88 | 17.0k | } std::__1::__stdinbuf<char>::imbue(std::__1::locale const&) Line | Count | Source | 82 | 8.50k | { | 83 | 8.50k | __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); | 84 | 8.50k | __encoding_ = __cv_->encoding(); | 85 | 8.50k | __always_noconv_ = __cv_->always_noconv(); | 86 | 8.50k | if (__encoding_ > __limit) | 87 | 0 | __throw_runtime_error("unsupported locale for standard input"); | 88 | 8.50k | } |
std::__1::__stdinbuf<wchar_t>::imbue(std::__1::locale const&) Line | Count | Source | 82 | 8.50k | { | 83 | 8.50k | __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); | 84 | 8.50k | __encoding_ = __cv_->encoding(); | 85 | 8.50k | __always_noconv_ = __cv_->always_noconv(); | 86 | 8.50k | if (__encoding_ > __limit) | 87 | 0 | __throw_runtime_error("unsupported locale for standard input"); | 88 | 8.50k | } |
|
89 | | |
90 | | template <class _CharT> |
91 | | typename __stdinbuf<_CharT>::int_type |
92 | | __stdinbuf<_CharT>::underflow() |
93 | 0 | { |
94 | 0 | return __getchar(false); |
95 | 0 | } Unexecuted instantiation: std::__1::__stdinbuf<char>::underflow() Unexecuted instantiation: std::__1::__stdinbuf<wchar_t>::underflow() |
96 | | |
97 | | template <class _CharT> |
98 | | typename __stdinbuf<_CharT>::int_type |
99 | | __stdinbuf<_CharT>::uflow() |
100 | 0 | { |
101 | 0 | return __getchar(true); |
102 | 0 | } Unexecuted instantiation: std::__1::__stdinbuf<char>::uflow() Unexecuted instantiation: std::__1::__stdinbuf<wchar_t>::uflow() |
103 | | |
104 | | template <class _CharT> |
105 | | typename __stdinbuf<_CharT>::int_type |
106 | | __stdinbuf<_CharT>::__getchar(bool __consume) |
107 | 0 | { |
108 | 0 | if (__last_consumed_is_next_) |
109 | 0 | { |
110 | 0 | int_type __result = __last_consumed_; |
111 | 0 | if (__consume) |
112 | 0 | { |
113 | 0 | __last_consumed_ = traits_type::eof(); |
114 | 0 | __last_consumed_is_next_ = false; |
115 | 0 | } |
116 | 0 | return __result; |
117 | 0 | } |
118 | 0 | char __extbuf[__limit]; |
119 | 0 | int __nread = _VSTD::max(1, __encoding_); |
120 | 0 | for (int __i = 0; __i < __nread; ++__i) |
121 | 0 | { |
122 | 0 | int __c = getc(__file_); |
123 | 0 | if (__c == EOF) |
124 | 0 | return traits_type::eof(); |
125 | 0 | __extbuf[__i] = static_cast<char>(__c); |
126 | 0 | } |
127 | 0 | char_type __1buf; |
128 | 0 | if (__always_noconv_) |
129 | 0 | __1buf = static_cast<char_type>(__extbuf[0]); |
130 | 0 | else |
131 | 0 | { |
132 | 0 | const char* __enxt; |
133 | 0 | char_type* __inxt; |
134 | 0 | codecvt_base::result __r; |
135 | 0 | do |
136 | 0 | { |
137 | 0 | state_type __sv_st = *__st_; |
138 | 0 | __r = __cv_->in(*__st_, __extbuf, __extbuf + __nread, __enxt, |
139 | 0 | &__1buf, &__1buf + 1, __inxt); |
140 | 0 | switch (__r) |
141 | 0 | { |
142 | 0 | case _VSTD::codecvt_base::ok: |
143 | 0 | break; |
144 | 0 | case codecvt_base::partial: |
145 | 0 | *__st_ = __sv_st; |
146 | 0 | if (__nread == sizeof(__extbuf)) |
147 | 0 | return traits_type::eof(); |
148 | 0 | { |
149 | 0 | int __c = getc(__file_); |
150 | 0 | if (__c == EOF) |
151 | 0 | return traits_type::eof(); |
152 | 0 | __extbuf[__nread] = static_cast<char>(__c); |
153 | 0 | } |
154 | 0 | ++__nread; |
155 | 0 | break; |
156 | 0 | case codecvt_base::error: |
157 | 0 | return traits_type::eof(); |
158 | 0 | case _VSTD::codecvt_base::noconv: |
159 | 0 | __1buf = static_cast<char_type>(__extbuf[0]); |
160 | 0 | break; |
161 | 0 | } |
162 | 0 | } while (__r == _VSTD::codecvt_base::partial); |
163 | 0 | } |
164 | 0 | if (!__consume) |
165 | 0 | { |
166 | 0 | for (int __i = __nread; __i > 0;) |
167 | 0 | { |
168 | 0 | if (ungetc(traits_type::to_int_type(__extbuf[--__i]), __file_) == EOF) |
169 | 0 | return traits_type::eof(); |
170 | 0 | } |
171 | 0 | } |
172 | 0 | else |
173 | 0 | __last_consumed_ = traits_type::to_int_type(__1buf); |
174 | 0 | return traits_type::to_int_type(__1buf); |
175 | 0 | } Unexecuted instantiation: std::__1::__stdinbuf<char>::__getchar(bool) Unexecuted instantiation: std::__1::__stdinbuf<wchar_t>::__getchar(bool) |
176 | | |
177 | | template <class _CharT> |
178 | | typename __stdinbuf<_CharT>::int_type |
179 | | __stdinbuf<_CharT>::pbackfail(int_type __c) |
180 | 0 | { |
181 | 0 | if (traits_type::eq_int_type(__c, traits_type::eof())) |
182 | 0 | { |
183 | 0 | if (!__last_consumed_is_next_) |
184 | 0 | { |
185 | 0 | __c = __last_consumed_; |
186 | 0 | __last_consumed_is_next_ = !traits_type::eq_int_type(__last_consumed_, |
187 | 0 | traits_type::eof()); |
188 | 0 | } |
189 | 0 | return __c; |
190 | 0 | } |
191 | 0 | if (__last_consumed_is_next_) |
192 | 0 | { |
193 | 0 | char __extbuf[__limit]; |
194 | 0 | char* __enxt; |
195 | 0 | const char_type __ci = traits_type::to_char_type(__last_consumed_); |
196 | 0 | const char_type* __inxt; |
197 | 0 | switch (__cv_->out(*__st_, &__ci, &__ci + 1, __inxt, |
198 | 0 | __extbuf, __extbuf + sizeof(__extbuf), __enxt)) |
199 | 0 | { |
200 | 0 | case _VSTD::codecvt_base::ok: |
201 | 0 | break; |
202 | 0 | case _VSTD::codecvt_base::noconv: |
203 | 0 | __extbuf[0] = static_cast<char>(__last_consumed_); |
204 | 0 | __enxt = __extbuf + 1; |
205 | 0 | break; |
206 | 0 | case codecvt_base::partial: |
207 | 0 | case codecvt_base::error: |
208 | 0 | return traits_type::eof(); |
209 | 0 | } |
210 | 0 | while (__enxt > __extbuf) |
211 | 0 | if (ungetc(*--__enxt, __file_) == EOF) |
212 | 0 | return traits_type::eof(); |
213 | 0 | } |
214 | 0 | __last_consumed_ = __c; |
215 | 0 | __last_consumed_is_next_ = true; |
216 | 0 | return __c; |
217 | 0 | } Unexecuted instantiation: std::__1::__stdinbuf<char>::pbackfail(int) Unexecuted instantiation: std::__1::__stdinbuf<wchar_t>::pbackfail(int) |
218 | | |
219 | | // __stdoutbuf |
220 | | |
221 | | template <class _CharT> |
222 | | class _LIBCPP_HIDDEN __stdoutbuf |
223 | | : public basic_streambuf<_CharT, char_traits<_CharT> > |
224 | | { |
225 | | public: |
226 | | typedef _CharT char_type; |
227 | | typedef char_traits<char_type> traits_type; |
228 | | typedef typename traits_type::int_type int_type; |
229 | | typedef typename traits_type::pos_type pos_type; |
230 | | typedef typename traits_type::off_type off_type; |
231 | | typedef typename traits_type::state_type state_type; |
232 | | |
233 | | __stdoutbuf(FILE* __fp, state_type* __st); |
234 | | |
235 | | protected: |
236 | | virtual int_type overflow (int_type __c = traits_type::eof()); |
237 | | virtual streamsize xsputn(const char_type* __s, streamsize __n); |
238 | | virtual int sync(); |
239 | | virtual void imbue(const locale& __loc); |
240 | | |
241 | | private: |
242 | | FILE* __file_; |
243 | | const codecvt<char_type, char, state_type>* __cv_; |
244 | | state_type* __st_; |
245 | | bool __always_noconv_; |
246 | | |
247 | | __stdoutbuf(const __stdoutbuf&); |
248 | | __stdoutbuf& operator=(const __stdoutbuf&); |
249 | | }; |
250 | | |
251 | | template <class _CharT> |
252 | | __stdoutbuf<_CharT>::__stdoutbuf(FILE* __fp, state_type* __st) |
253 | | : __file_(__fp), |
254 | | __cv_(&use_facet<codecvt<char_type, char, state_type> >(this->getloc())), |
255 | | __st_(__st), |
256 | | __always_noconv_(__cv_->always_noconv()) |
257 | 34.0k | { |
258 | 34.0k | } std::__1::__stdoutbuf<char>::__stdoutbuf(__sFILE*, __mbstate_t*) Line | Count | Source | 257 | 17.0k | { | 258 | 17.0k | } |
std::__1::__stdoutbuf<wchar_t>::__stdoutbuf(__sFILE*, __mbstate_t*) Line | Count | Source | 257 | 17.0k | { | 258 | 17.0k | } |
|
259 | | |
260 | | template <class _CharT> |
261 | | typename __stdoutbuf<_CharT>::int_type |
262 | | __stdoutbuf<_CharT>::overflow(int_type __c) |
263 | 0 | { |
264 | 0 | char __extbuf[__limit]; |
265 | 0 | char_type __1buf; |
266 | 0 | if (!traits_type::eq_int_type(__c, traits_type::eof())) |
267 | 0 | { |
268 | 0 | __1buf = traits_type::to_char_type(__c); |
269 | 0 | if (__always_noconv_) |
270 | 0 | { |
271 | 0 | if (fwrite(&__1buf, sizeof(char_type), 1, __file_) != 1) |
272 | 0 | return traits_type::eof(); |
273 | 0 | } |
274 | 0 | else |
275 | 0 | { |
276 | 0 | char* __extbe = __extbuf; |
277 | 0 | codecvt_base::result __r; |
278 | 0 | char_type* pbase = &__1buf; |
279 | 0 | char_type* pptr = pbase + 1; |
280 | 0 | do |
281 | 0 | { |
282 | 0 | const char_type* __e; |
283 | 0 | __r = __cv_->out(*__st_, pbase, pptr, __e, |
284 | 0 | __extbuf, |
285 | 0 | __extbuf + sizeof(__extbuf), |
286 | 0 | __extbe); |
287 | 0 | if (__e == pbase) |
288 | 0 | return traits_type::eof(); |
289 | 0 | if (__r == codecvt_base::noconv) |
290 | 0 | { |
291 | 0 | if (fwrite(pbase, 1, 1, __file_) != 1) |
292 | 0 | return traits_type::eof(); |
293 | 0 | } |
294 | 0 | else if (__r == codecvt_base::ok || __r == codecvt_base::partial) |
295 | 0 | { |
296 | 0 | size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); |
297 | 0 | if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) |
298 | 0 | return traits_type::eof(); |
299 | 0 | if (__r == codecvt_base::partial) |
300 | 0 | { |
301 | 0 | pbase = const_cast<char_type*>(__e); |
302 | 0 | } |
303 | 0 | } |
304 | 0 | else |
305 | 0 | return traits_type::eof(); |
306 | 0 | } while (__r == codecvt_base::partial); |
307 | 0 | } |
308 | 0 | } |
309 | 0 | return traits_type::not_eof(__c); |
310 | 0 | } Unexecuted instantiation: std::__1::__stdoutbuf<char>::overflow(int) Unexecuted instantiation: std::__1::__stdoutbuf<wchar_t>::overflow(int) |
311 | | |
312 | | template <class _CharT> |
313 | | streamsize |
314 | | __stdoutbuf<_CharT>::xsputn(const char_type* __s, streamsize __n) |
315 | 6 | { |
316 | 6 | if (__always_noconv_) |
317 | 6 | return fwrite(__s, sizeof(char_type), __n, __file_); |
318 | 0 | streamsize __i = 0; |
319 | 0 | for (; __i < __n; ++__i, ++__s) |
320 | 0 | if (overflow(traits_type::to_int_type(*__s)) == traits_type::eof()) |
321 | 0 | break; |
322 | 0 | return __i; |
323 | 0 | } std::__1::__stdoutbuf<char>::xsputn(char const*, long) Line | Count | Source | 315 | 6 | { | 316 | 6 | if (__always_noconv_) | 317 | 6 | return fwrite(__s, sizeof(char_type), __n, __file_); | 318 | 0 | streamsize __i = 0; | 319 | 0 | for (; __i < __n; ++__i, ++__s) | 320 | 0 | if (overflow(traits_type::to_int_type(*__s)) == traits_type::eof()) | 321 | 0 | break; | 322 | 0 | return __i; | 323 | 0 | } |
Unexecuted instantiation: std::__1::__stdoutbuf<wchar_t>::xsputn(wchar_t const*, long) |
324 | | |
325 | | template <class _CharT> |
326 | | int |
327 | | __stdoutbuf<_CharT>::sync() |
328 | 34.0k | { |
329 | 34.0k | char __extbuf[__limit]; |
330 | 34.0k | codecvt_base::result __r; |
331 | 34.0k | do |
332 | 34.0k | { |
333 | 34.0k | char* __extbe; |
334 | 34.0k | __r = __cv_->unshift(*__st_, __extbuf, |
335 | 34.0k | __extbuf + sizeof(__extbuf), |
336 | 34.0k | __extbe); |
337 | 34.0k | size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); |
338 | 34.0k | if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) |
339 | 0 | return -1; |
340 | 34.0k | } while (__r == codecvt_base::partial); |
341 | 34.0k | if (__r == codecvt_base::error) |
342 | 0 | return -1; |
343 | 34.0k | if (fflush(__file_)) |
344 | 0 | return -1; |
345 | 34.0k | return 0; |
346 | 34.0k | } std::__1::__stdoutbuf<char>::sync() Line | Count | Source | 328 | 17.0k | { | 329 | 17.0k | char __extbuf[__limit]; | 330 | 17.0k | codecvt_base::result __r; | 331 | 17.0k | do | 332 | 17.0k | { | 333 | 17.0k | char* __extbe; | 334 | 17.0k | __r = __cv_->unshift(*__st_, __extbuf, | 335 | 17.0k | __extbuf + sizeof(__extbuf), | 336 | 17.0k | __extbe); | 337 | 17.0k | size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); | 338 | 17.0k | if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) | 339 | 0 | return -1; | 340 | 17.0k | } while (__r == codecvt_base::partial); | 341 | 17.0k | if (__r == codecvt_base::error) | 342 | 0 | return -1; | 343 | 17.0k | if (fflush(__file_)) | 344 | 0 | return -1; | 345 | 17.0k | return 0; | 346 | 17.0k | } |
std::__1::__stdoutbuf<wchar_t>::sync() Line | Count | Source | 328 | 17.0k | { | 329 | 17.0k | char __extbuf[__limit]; | 330 | 17.0k | codecvt_base::result __r; | 331 | 17.0k | do | 332 | 17.0k | { | 333 | 17.0k | char* __extbe; | 334 | 17.0k | __r = __cv_->unshift(*__st_, __extbuf, | 335 | 17.0k | __extbuf + sizeof(__extbuf), | 336 | 17.0k | __extbe); | 337 | 17.0k | size_t __nmemb = static_cast<size_t>(__extbe - __extbuf); | 338 | 17.0k | if (fwrite(__extbuf, 1, __nmemb, __file_) != __nmemb) | 339 | 0 | return -1; | 340 | 17.0k | } while (__r == codecvt_base::partial); | 341 | 17.0k | if (__r == codecvt_base::error) | 342 | 0 | return -1; | 343 | 17.0k | if (fflush(__file_)) | 344 | 0 | return -1; | 345 | 17.0k | return 0; | 346 | 17.0k | } |
|
347 | | |
348 | | template <class _CharT> |
349 | | void |
350 | | __stdoutbuf<_CharT>::imbue(const locale& __loc) |
351 | 0 | { |
352 | 0 | sync(); |
353 | 0 | __cv_ = &use_facet<codecvt<char_type, char, state_type> >(__loc); |
354 | 0 | __always_noconv_ = __cv_->always_noconv(); |
355 | 0 | } Unexecuted instantiation: std::__1::__stdoutbuf<char>::imbue(std::__1::locale const&) Unexecuted instantiation: std::__1::__stdoutbuf<wchar_t>::imbue(std::__1::locale const&) |
356 | | |
357 | | _LIBCPP_END_NAMESPACE_STD |
358 | | |
359 | | _LIBCPP_POP_MACROS |
360 | | |
361 | | #endif // _LIBCPP___STD_STREAM |