1 : // Helpers for ostream inserters -*- C++ -*-
2 :
3 : // Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
4 : //
5 : // This file is part of the GNU ISO C++ Library. This library is free
6 : // software; you can redistribute it and/or modify it under the
7 : // terms of the GNU General Public License as published by the
8 : // Free Software Foundation; either version 3, or (at your option)
9 : // any later version.
10 :
11 : // This library is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 :
16 : // Under Section 7 of GPL version 3, you are granted additional
17 : // permissions described in the GCC Runtime Library Exception, version
18 : // 3.1, as published by the Free Software Foundation.
19 :
20 : // You should have received a copy of the GNU General Public License and
21 : // a copy of the GCC Runtime Library Exception along with this program;
22 : // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 : // <http://www.gnu.org/licenses/>.
24 :
25 : /** @file ostream_insert.h
26 : * This is an internal header file, included by other library headers.
27 : * You should not attempt to use it directly.
28 : */
29 :
30 : #ifndef _OSTREAM_INSERT_H
31 : #define _OSTREAM_INSERT_H 1
32 :
33 : #pragma GCC system_header
34 :
35 : #include <iosfwd>
36 : #include <cxxabi-forced.h>
37 :
38 : _GLIBCXX_BEGIN_NAMESPACE(std)
39 :
40 : template<typename _CharT, typename _Traits>
41 : inline void
42 0 : __ostream_write(basic_ostream<_CharT, _Traits>& __out,
43 : const _CharT* __s, streamsize __n)
44 : {
45 : typedef basic_ostream<_CharT, _Traits> __ostream_type;
46 : typedef typename __ostream_type::ios_base __ios_base;
47 :
48 0 : const streamsize __put = __out.rdbuf()->sputn(__s, __n);
49 0 : if (__put != __n)
50 0 : __out.setstate(__ios_base::badbit);
51 0 : }
52 :
53 : template<typename _CharT, typename _Traits>
54 : inline void
55 0 : __ostream_fill(basic_ostream<_CharT, _Traits>& __out, streamsize __n)
56 : {
57 : typedef basic_ostream<_CharT, _Traits> __ostream_type;
58 : typedef typename __ostream_type::ios_base __ios_base;
59 :
60 0 : const _CharT __c = __out.fill();
61 0 : for (; __n > 0; --__n)
62 : {
63 0 : const typename _Traits::int_type __put = __out.rdbuf()->sputc(__c);
64 0 : if (_Traits::eq_int_type(__put, _Traits::eof()))
65 : {
66 0 : __out.setstate(__ios_base::badbit);
67 0 : break;
68 : }
69 : }
70 0 : }
71 :
72 : template<typename _CharT, typename _Traits>
73 : basic_ostream<_CharT, _Traits>&
74 0 : __ostream_insert(basic_ostream<_CharT, _Traits>& __out,
75 : const _CharT* __s, streamsize __n)
76 : {
77 : typedef basic_ostream<_CharT, _Traits> __ostream_type;
78 : typedef typename __ostream_type::ios_base __ios_base;
79 :
80 0 : typename __ostream_type::sentry __cerb(__out);
81 0 : if (__cerb)
82 : {
83 : __try
84 : {
85 0 : const streamsize __w = __out.width();
86 0 : if (__w > __n)
87 : {
88 : const bool __left = ((__out.flags()
89 : & __ios_base::adjustfield)
90 0 : == __ios_base::left);
91 0 : if (!__left)
92 0 : __ostream_fill(__out, __w - __n);
93 0 : if (__out.good())
94 0 : __ostream_write(__out, __s, __n);
95 0 : if (__left && __out.good())
96 0 : __ostream_fill(__out, __w - __n);
97 : }
98 : else
99 0 : __ostream_write(__out, __s, __n);
100 0 : __out.width(0);
101 : }
102 0 : __catch(__cxxabiv1::__forced_unwind&)
103 : {
104 0 : __out._M_setstate(__ios_base::badbit);
105 0 : __throw_exception_again;
106 : }
107 0 : __catch(...)
108 0 : { __out._M_setstate(__ios_base::badbit); }
109 : }
110 0 : return __out;
111 : }
112 :
113 : // Inhibit implicit instantiations for required instantiations,
114 : // which are defined via explicit instantiations elsewhere.
115 : // NB: This syntax is a GNU extension.
116 : #if _GLIBCXX_EXTERN_TEMPLATE
117 : extern template ostream& __ostream_insert(ostream&, const char*, streamsize);
118 :
119 : #ifdef _GLIBCXX_USE_WCHAR_T
120 : extern template wostream& __ostream_insert(wostream&, const wchar_t*,
121 : streamsize);
122 : #endif
123 : #endif
124 :
125 : _GLIBCXX_END_NAMESPACE
126 :
127 : #endif /* _OSTREAM_INSERT_H */
|