1 //===-------------------------- ios.cpp -----------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
18 #include "include/config_elast.h"
26 _LIBCPP_BEGIN_NAMESPACE_STD
28 template class basic_ios
<char>;
29 template class basic_ios
<wchar_t>;
31 template class basic_streambuf
<char>;
32 template class basic_streambuf
<wchar_t>;
34 template class basic_istream
<char>;
35 template class basic_istream
<wchar_t>;
37 template class basic_ostream
<char>;
38 template class basic_ostream
<wchar_t>;
40 template class basic_iostream
<char>;
42 class _LIBCPP_HIDDEN __iostream_category
46 virtual const char* name() const _NOEXCEPT
;
47 virtual string
message(int ev
) const;
51 __iostream_category::name() const _NOEXCEPT
57 __iostream_category::message(int ev
) const
59 if (ev
!= static_cast<int>(io_errc::stream
)
61 && ev
<= _LIBCPP_ELAST
62 #endif // _LIBCPP_ELAST
64 return __do_message::message(ev
);
65 return string("unspecified iostream_category error");
69 iostream_category() _NOEXCEPT
71 static __iostream_category s
;
77 ios_base::failure::failure(const string
& msg
, const error_code
& ec
)
78 : system_error(ec
, msg
)
82 ios_base::failure::failure(const char* msg
, const error_code
& ec
)
83 : system_error(ec
, msg
)
87 ios_base::failure::~failure() throw()
93 const ios_base::fmtflags
ios_base::boolalpha
;
94 const ios_base::fmtflags
ios_base::dec
;
95 const ios_base::fmtflags
ios_base::fixed
;
96 const ios_base::fmtflags
ios_base::hex
;
97 const ios_base::fmtflags
ios_base::internal
;
98 const ios_base::fmtflags
ios_base::left
;
99 const ios_base::fmtflags
ios_base::oct
;
100 const ios_base::fmtflags
ios_base::right
;
101 const ios_base::fmtflags
ios_base::scientific
;
102 const ios_base::fmtflags
ios_base::showbase
;
103 const ios_base::fmtflags
ios_base::showpoint
;
104 const ios_base::fmtflags
ios_base::showpos
;
105 const ios_base::fmtflags
ios_base::skipws
;
106 const ios_base::fmtflags
ios_base::unitbuf
;
107 const ios_base::fmtflags
ios_base::uppercase
;
108 const ios_base::fmtflags
ios_base::adjustfield
;
109 const ios_base::fmtflags
ios_base::basefield
;
110 const ios_base::fmtflags
ios_base::floatfield
;
112 const ios_base::iostate
ios_base::badbit
;
113 const ios_base::iostate
ios_base::eofbit
;
114 const ios_base::iostate
ios_base::failbit
;
115 const ios_base::iostate
ios_base::goodbit
;
117 const ios_base::openmode
ios_base::app
;
118 const ios_base::openmode
ios_base::ate
;
119 const ios_base::openmode
ios_base::binary
;
120 const ios_base::openmode
ios_base::in
;
121 const ios_base::openmode
ios_base::out
;
122 const ios_base::openmode
ios_base::trunc
;
125 ios_base::__call_callbacks(event ev
)
127 for (size_t i
= __event_size_
; i
;)
130 __fn_
[i
](ev
, *this, __index_
[i
]);
137 ios_base::imbue(const locale
& newloc
)
139 static_assert(sizeof(locale
) == sizeof(__loc_
), "");
140 locale
& loc_storage
= *reinterpret_cast<locale
*>(&__loc_
);
141 locale oldloc
= loc_storage
;
142 loc_storage
= newloc
;
143 __call_callbacks(imbue_event
);
148 ios_base::getloc() const
150 const locale
& loc_storage
= *reinterpret_cast<const locale
*>(&__loc_
);
155 #if defined(_LIBCPP_HAS_C_ATOMIC_IMP) && !defined(_LIBCPP_HAS_NO_THREADS)
156 atomic
<int> ios_base::__xindex_
= ATOMIC_VAR_INIT(0);
158 int ios_base::__xindex_
= 0;
161 template <typename _Tp
>
162 static size_t __ios_new_cap(size_t __req_size
, size_t __current_cap
)
163 { // Precondition: __req_size > __current_cap
164 const size_t mx
= std::numeric_limits
<size_t>::max() / sizeof(_Tp
);
165 if (__req_size
< mx
/2)
166 return _VSTD::max(2 * __current_cap
, __req_size
);
178 ios_base::iword(int index
)
180 size_t req_size
= static_cast<size_t>(index
)+1;
181 if (req_size
> __iarray_cap_
)
183 size_t newcap
= __ios_new_cap
<long>(req_size
, __iarray_cap_
);
184 long* iarray
= static_cast<long*>(realloc(__iarray_
, newcap
* sizeof(long)));
193 for (long* p
= __iarray_
+ __iarray_size_
; p
< __iarray_
+ newcap
; ++p
)
195 __iarray_cap_
= newcap
;
197 __iarray_size_
= max
<size_t>(__iarray_size_
, req_size
);
198 return __iarray_
[index
];
202 ios_base::pword(int index
)
204 size_t req_size
= static_cast<size_t>(index
)+1;
205 if (req_size
> __parray_cap_
)
207 size_t newcap
= __ios_new_cap
<void *>(req_size
, __iarray_cap_
);
208 void** parray
= static_cast<void**>(realloc(__parray_
, newcap
* sizeof(void *)));
217 for (void** p
= __parray_
+ __parray_size_
; p
< __parray_
+ newcap
; ++p
)
219 __parray_cap_
= newcap
;
221 __parray_size_
= max
<size_t>(__parray_size_
, req_size
);
222 return __parray_
[index
];
228 ios_base::register_callback(event_callback fn
, int index
)
230 size_t req_size
= __event_size_
+ 1;
231 if (req_size
> __event_cap_
)
233 size_t newcap
= __ios_new_cap
<event_callback
>(req_size
, __event_cap_
);
234 event_callback
* fns
= static_cast<event_callback
*>(realloc(__fn_
, newcap
* sizeof(event_callback
)));
238 int* indxs
= static_cast<int *>(realloc(__index_
, newcap
* sizeof(int)));
242 __event_cap_
= newcap
;
244 __fn_
[__event_size_
] = fn
;
245 __index_
[__event_size_
] = index
;
249 ios_base::~ios_base()
251 __call_callbacks(erase_event
);
252 locale
& loc_storage
= *reinterpret_cast<locale
*>(&__loc_
);
253 loc_storage
.~locale();
263 ios_base::clear(iostate state
)
268 __rdstate_
= state
| badbit
;
269 #ifndef _LIBCPP_NO_EXCEPTIONS
270 if (((state
| (__rdbuf_
? goodbit
: badbit
)) & __exceptions_
) != 0)
271 throw failure("ios_base::clear");
272 #endif // _LIBCPP_NO_EXCEPTIONS
278 ios_base::init(void* sb
)
281 __rdstate_
= __rdbuf_
? goodbit
: badbit
;
282 __exceptions_
= goodbit
;
283 __fmtflags_
= skipws
| dec
;
296 ::new(&__loc_
) locale
;
300 ios_base::copyfmt(const ios_base
& rhs
)
302 // If we can't acquire the needed resources, throw bad_alloc (can't set badbit)
303 // Don't alter *this until all needed resources are acquired
304 unique_ptr
<event_callback
, void (*)(void*)> new_callbacks(0, free
);
305 unique_ptr
<int, void (*)(void*)> new_ints(0, free
);
306 unique_ptr
<long, void (*)(void*)> new_longs(0, free
);
307 unique_ptr
<void*, void (*)(void*)> new_pointers(0, free
);
308 if (__event_cap_
< rhs
.__event_size_
)
310 size_t newesize
= sizeof(event_callback
) * rhs
.__event_size_
;
311 new_callbacks
.reset(static_cast<event_callback
*>(malloc(newesize
)));
312 #ifndef _LIBCPP_NO_EXCEPTIONS
315 #endif // _LIBCPP_NO_EXCEPTIONS
317 size_t newisize
= sizeof(int) * rhs
.__event_size_
;
318 new_ints
.reset(static_cast<int *>(malloc(newisize
)));
319 #ifndef _LIBCPP_NO_EXCEPTIONS
322 #endif // _LIBCPP_NO_EXCEPTIONS
324 if (__iarray_cap_
< rhs
.__iarray_size_
)
326 size_t newsize
= sizeof(long) * rhs
.__iarray_size_
;
327 new_longs
.reset(static_cast<long*>(malloc(newsize
)));
328 #ifndef _LIBCPP_NO_EXCEPTIONS
331 #endif // _LIBCPP_NO_EXCEPTIONS
333 if (__parray_cap_
< rhs
.__parray_size_
)
335 size_t newsize
= sizeof(void*) * rhs
.__parray_size_
;
336 new_pointers
.reset(static_cast<void**>(malloc(newsize
)));
337 #ifndef _LIBCPP_NO_EXCEPTIONS
340 #endif // _LIBCPP_NO_EXCEPTIONS
342 // Got everything we need. Copy everything but __rdstate_, __rdbuf_ and __exceptions_
343 __fmtflags_
= rhs
.__fmtflags_
;
344 __precision_
= rhs
.__precision_
;
345 __width_
= rhs
.__width_
;
346 locale
& lhs_loc
= *reinterpret_cast<locale
*>(&__loc_
);
347 const locale
& rhs_loc
= *reinterpret_cast<const locale
*>(&rhs
.__loc_
);
349 if (__event_cap_
< rhs
.__event_size_
)
352 __fn_
= new_callbacks
.release();
354 __index_
= new_ints
.release();
355 __event_cap_
= rhs
.__event_size_
;
357 for (__event_size_
= 0; __event_size_
< rhs
.__event_size_
; ++__event_size_
)
359 __fn_
[__event_size_
] = rhs
.__fn_
[__event_size_
];
360 __index_
[__event_size_
] = rhs
.__index_
[__event_size_
];
362 if (__iarray_cap_
< rhs
.__iarray_size_
)
365 __iarray_
= new_longs
.release();
366 __iarray_cap_
= rhs
.__iarray_size_
;
368 for (__iarray_size_
= 0; __iarray_size_
< rhs
.__iarray_size_
; ++__iarray_size_
)
369 __iarray_
[__iarray_size_
] = rhs
.__iarray_
[__iarray_size_
];
370 if (__parray_cap_
< rhs
.__parray_size_
)
373 __parray_
= new_pointers
.release();
374 __parray_cap_
= rhs
.__parray_size_
;
376 for (__parray_size_
= 0; __parray_size_
< rhs
.__parray_size_
; ++__parray_size_
)
377 __parray_
[__parray_size_
] = rhs
.__parray_
[__parray_size_
];
381 ios_base::move(ios_base
& rhs
)
383 // *this is uninitialized
384 __fmtflags_
= rhs
.__fmtflags_
;
385 __precision_
= rhs
.__precision_
;
386 __width_
= rhs
.__width_
;
387 __rdstate_
= rhs
.__rdstate_
;
388 __exceptions_
= rhs
.__exceptions_
;
390 locale
& rhs_loc
= *reinterpret_cast<locale
*>(&rhs
.__loc_
);
391 ::new(&__loc_
) locale(rhs_loc
);
394 __index_
= rhs
.__index_
;
396 __event_size_
= rhs
.__event_size_
;
397 rhs
.__event_size_
= 0;
398 __event_cap_
= rhs
.__event_cap_
;
399 rhs
.__event_cap_
= 0;
400 __iarray_
= rhs
.__iarray_
;
402 __iarray_size_
= rhs
.__iarray_size_
;
403 rhs
.__iarray_size_
= 0;
404 __iarray_cap_
= rhs
.__iarray_cap_
;
405 rhs
.__iarray_cap_
= 0;
406 __parray_
= rhs
.__parray_
;
408 __parray_size_
= rhs
.__parray_size_
;
409 rhs
.__parray_size_
= 0;
410 __parray_cap_
= rhs
.__parray_cap_
;
411 rhs
.__parray_cap_
= 0;
415 ios_base::swap(ios_base
& rhs
) _NOEXCEPT
417 _VSTD::swap(__fmtflags_
, rhs
.__fmtflags_
);
418 _VSTD::swap(__precision_
, rhs
.__precision_
);
419 _VSTD::swap(__width_
, rhs
.__width_
);
420 _VSTD::swap(__rdstate_
, rhs
.__rdstate_
);
421 _VSTD::swap(__exceptions_
, rhs
.__exceptions_
);
422 locale
& lhs_loc
= *reinterpret_cast<locale
*>(&__loc_
);
423 locale
& rhs_loc
= *reinterpret_cast<locale
*>(&rhs
.__loc_
);
424 _VSTD::swap(lhs_loc
, rhs_loc
);
425 _VSTD::swap(__fn_
, rhs
.__fn_
);
426 _VSTD::swap(__index_
, rhs
.__index_
);
427 _VSTD::swap(__event_size_
, rhs
.__event_size_
);
428 _VSTD::swap(__event_cap_
, rhs
.__event_cap_
);
429 _VSTD::swap(__iarray_
, rhs
.__iarray_
);
430 _VSTD::swap(__iarray_size_
, rhs
.__iarray_size_
);
431 _VSTD::swap(__iarray_cap_
, rhs
.__iarray_cap_
);
432 _VSTD::swap(__parray_
, rhs
.__parray_
);
433 _VSTD::swap(__parray_size_
, rhs
.__parray_size_
);
434 _VSTD::swap(__parray_cap_
, rhs
.__parray_cap_
);
438 ios_base::__set_badbit_and_consider_rethrow()
440 __rdstate_
|= badbit
;
441 #ifndef _LIBCPP_NO_EXCEPTIONS
442 if (__exceptions_
& badbit
)
444 #endif // _LIBCPP_NO_EXCEPTIONS
448 ios_base::__set_failbit_and_consider_rethrow()
450 __rdstate_
|= failbit
;
451 #ifndef _LIBCPP_NO_EXCEPTIONS
452 if (__exceptions_
& failbit
)
454 #endif // _LIBCPP_NO_EXCEPTIONS
458 ios_base::sync_with_stdio(bool sync
)
460 static bool previous_state
= true;
461 bool r
= previous_state
;
462 previous_state
= sync
;
466 _LIBCPP_END_NAMESPACE_STD