gccxml_gem 0.9-x86-darwin-9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Rakefile +75 -0
- data/bin/gccxml +0 -0
- data/bin/gccxml_cc1plus +0 -0
- data/gccxml.rb +44 -0
- data/share/doc/gccxml-0.9/Copyright.txt +55 -0
- data/share/doc/gccxml-0.9/gccxml.html +168 -0
- data/share/doc/gccxml-0.9/gccxml.txt +293 -0
- data/share/gccxml-0.9/GCC/2.95/algorithm +76 -0
- data/share/gccxml-0.9/GCC/2.95/bitset +17 -0
- data/share/gccxml-0.9/GCC/2.95/cctype +24 -0
- data/share/gccxml-0.9/GCC/2.95/clocale +14 -0
- data/share/gccxml-0.9/GCC/2.95/cmath +33 -0
- data/share/gccxml-0.9/GCC/2.95/complex +38 -0
- data/share/gccxml-0.9/GCC/2.95/csetjmp +13 -0
- data/share/gccxml-0.9/GCC/2.95/csignal +14 -0
- data/share/gccxml-0.9/GCC/2.95/cstdarg +12 -0
- data/share/gccxml-0.9/GCC/2.95/cstddef +13 -0
- data/share/gccxml-0.9/GCC/2.95/cstdio +55 -0
- data/share/gccxml-0.9/GCC/2.95/cstdlib +66 -0
- data/share/gccxml-0.9/GCC/2.95/cstring +34 -0
- data/share/gccxml-0.9/GCC/2.95/ctime +24 -0
- data/share/gccxml-0.9/GCC/2.95/cwchar +65 -0
- data/share/gccxml-0.9/GCC/2.95/cwctype +31 -0
- data/share/gccxml-0.9/GCC/2.95/deque +19 -0
- data/share/gccxml-0.9/GCC/2.95/exception +20 -0
- data/share/gccxml-0.9/GCC/2.95/fstream +23 -0
- data/share/gccxml-0.9/GCC/2.95/functional +64 -0
- data/share/gccxml-0.9/GCC/2.95/gccxml_bitset +1066 -0
- data/share/gccxml-0.9/GCC/2.95/iomanip +20 -0
- data/share/gccxml-0.9/GCC/2.95/iosfwd +20 -0
- data/share/gccxml-0.9/GCC/2.95/iostream +27 -0
- data/share/gccxml-0.9/GCC/2.95/iterator +39 -0
- data/share/gccxml-0.9/GCC/2.95/list +19 -0
- data/share/gccxml-0.9/GCC/2.95/map +20 -0
- data/share/gccxml-0.9/GCC/2.95/memory +21 -0
- data/share/gccxml-0.9/GCC/2.95/new +13 -0
- data/share/gccxml-0.9/GCC/2.95/numeric +15 -0
- data/share/gccxml-0.9/GCC/2.95/pthread.h +16 -0
- data/share/gccxml-0.9/GCC/2.95/queue +20 -0
- data/share/gccxml-0.9/GCC/2.95/set +20 -0
- data/share/gccxml-0.9/GCC/2.95/sstream +24 -0
- data/share/gccxml-0.9/GCC/2.95/stack +19 -0
- data/share/gccxml-0.9/GCC/2.95/std/bastring.cc +524 -0
- data/share/gccxml-0.9/GCC/2.95/std/complext.h +397 -0
- data/share/gccxml-0.9/GCC/2.95/std/dcomplex.h +92 -0
- data/share/gccxml-0.9/GCC/2.95/std/fcomplex.h +88 -0
- data/share/gccxml-0.9/GCC/2.95/std/gslice_array.h +170 -0
- data/share/gccxml-0.9/GCC/2.95/std/indirect_array.h +157 -0
- data/share/gccxml-0.9/GCC/2.95/std/ldcomplex.h +96 -0
- data/share/gccxml-0.9/GCC/2.95/std/mask_array.h +154 -0
- data/share/gccxml-0.9/GCC/2.95/std/slice_array.h +156 -0
- data/share/gccxml-0.9/GCC/2.95/std/std_valarray.h +728 -0
- data/share/gccxml-0.9/GCC/2.95/std/straits.h +162 -0
- data/share/gccxml-0.9/GCC/2.95/std/valarray_meta.h +1035 -0
- data/share/gccxml-0.9/GCC/2.95/stdexcept +17 -0
- data/share/gccxml-0.9/GCC/2.95/stl_alloc.h +1057 -0
- data/share/gccxml-0.9/GCC/2.95/stl_bvector.h +836 -0
- data/share/gccxml-0.9/GCC/2.95/stl_deque.h +1699 -0
- data/share/gccxml-0.9/GCC/2.95/stl_list.h +843 -0
- data/share/gccxml-0.9/GCC/2.95/stl_tree.h +1331 -0
- data/share/gccxml-0.9/GCC/2.95/stl_vector.h +828 -0
- data/share/gccxml-0.9/GCC/2.95/string +26 -0
- data/share/gccxml-0.9/GCC/2.95/strstream +23 -0
- data/share/gccxml-0.9/GCC/2.95/typeinfo +11 -0
- data/share/gccxml-0.9/GCC/2.95/utility +25 -0
- data/share/gccxml-0.9/GCC/2.95/valarray +52 -0
- data/share/gccxml-0.9/GCC/2.95/vector +19 -0
- data/share/gccxml-0.9/GCC/2.96/sstream +305 -0
- data/share/gccxml-0.9/GCC/3.0/pthread.h +16 -0
- data/share/gccxml-0.9/GCC/3.1/pthread.h +16 -0
- data/share/gccxml-0.9/GCC/3.2/bits/fstream.tcc +500 -0
- data/share/gccxml-0.9/GCC/3.2/bits/istream.tcc +1207 -0
- data/share/gccxml-0.9/GCC/3.2/bits/locale_facets.h +1810 -0
- data/share/gccxml-0.9/GCC/3.2/bits/locale_facets.tcc +2397 -0
- data/share/gccxml-0.9/GCC/3.2/bits/messages_members.h +108 -0
- data/share/gccxml-0.9/GCC/3.2/bits/ostream.tcc +713 -0
- data/share/gccxml-0.9/GCC/3.2/bits/sstream.tcc +241 -0
- data/share/gccxml-0.9/GCC/3.2/bits/stl_deque.h +1682 -0
- data/share/gccxml-0.9/GCC/3.2/bits/stl_list.h +989 -0
- data/share/gccxml-0.9/GCC/3.2/bits/stl_tree.h +1462 -0
- data/share/gccxml-0.9/GCC/3.2/bits/stl_vector.h +1085 -0
- data/share/gccxml-0.9/GCC/3.2/bits/valarray_meta.h +1063 -0
- data/share/gccxml-0.9/GCC/3.2/fstream +579 -0
- data/share/gccxml-0.9/GCC/3.2/pthread.h +16 -0
- data/share/gccxml-0.9/GCC/3.2/sstream +384 -0
- data/share/gccxml-0.9/GCC/3.3/bits/fstream.tcc +530 -0
- data/share/gccxml-0.9/GCC/3.3/bits/list.tcc +378 -0
- data/share/gccxml-0.9/GCC/3.3/bits/locale_facets.h +2050 -0
- data/share/gccxml-0.9/GCC/3.3/bits/messages_members.h +108 -0
- data/share/gccxml-0.9/GCC/3.3/bits/sstream.tcc +243 -0
- data/share/gccxml-0.9/GCC/3.3/bits/stl_deque.h +1603 -0
- data/share/gccxml-0.9/GCC/3.3/bits/stl_list.h +1167 -0
- data/share/gccxml-0.9/GCC/3.3/bits/stl_tree.h +1462 -0
- data/share/gccxml-0.9/GCC/3.3/bits/stl_vector.h +992 -0
- data/share/gccxml-0.9/GCC/3.3/bits/valarray_meta.h +1135 -0
- data/share/gccxml-0.9/GCC/3.3/fstream +842 -0
- data/share/gccxml-0.9/GCC/3.3/gccxml_builtins.h +22 -0
- data/share/gccxml-0.9/GCC/3.3/sstream +638 -0
- data/share/gccxml-0.9/GCC/3.4/gccxml_builtins.h +91 -0
- data/share/gccxml-0.9/GCC/4.0/gccxml_builtins.h +128 -0
- data/share/gccxml-0.9/GCC/4.1/bits/gthr-default.h +618 -0
- data/share/gccxml-0.9/GCC/4.1/gccxml_builtins.h +131 -0
- data/share/gccxml-0.9/GCC/4.2/gccxml_builtins.h +131 -0
- data/share/gccxml-0.9/GCC/find_flags +105 -0
- data/share/gccxml-0.9/Intel/find_flags +56 -0
- data/share/gccxml-0.9/Intel/pthread.h +16 -0
- data/share/gccxml-0.9/MIPSpro/7.3/exception +9 -0
- data/share/gccxml-0.9/MIPSpro/7.3/gccxml_mpro_internals.h +21 -0
- data/share/gccxml-0.9/MIPSpro/7.3/iomanip +161 -0
- data/share/gccxml-0.9/MIPSpro/7.3/ostream +9 -0
- data/share/gccxml-0.9/MIPSpro/7.3/stddef.h +9 -0
- data/share/gccxml-0.9/MIPSpro/7.3/stl_config.h +9 -0
- data/share/gccxml-0.9/MIPSpro/7.3/stl_locale.h +17 -0
- data/share/gccxml-0.9/MIPSpro/7.3/stl_monetary.h +14 -0
- data/share/gccxml-0.9/MIPSpro/7.3/stl_numeric_facets.h +13 -0
- data/share/gccxml-0.9/MIPSpro/7.3/stl_threads.h +11 -0
- data/share/gccxml-0.9/MIPSpro/7.3/string +18 -0
- data/share/gccxml-0.9/MIPSpro/find_flags +137 -0
- data/share/gccxml-0.9/Sun/5.8/adaptation.patch +168 -0
- data/share/gccxml-0.9/Sun/README +8 -0
- data/share/gccxml-0.9/Sun/adapt_headers.sh +24 -0
- data/share/gccxml-0.9/Sun/find_flags +69 -0
- data/share/gccxml-0.9/gccxml_config +2 -0
- data/share/gccxml-0.9/gccxml_find_flags +93 -0
- data/share/man/man1/gccxml.1 +246 -0
- metadata +204 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
#ifndef GCCXML_PTHREAD_H
|
2
|
+
#define GCCXML_PTHREAD_H
|
3
|
+
|
4
|
+
/* Some pthread.h files use __thread, which is a keyword for GCC 3.3.
|
5
|
+
Change the name for the duration of including pthread.h. */
|
6
|
+
#ifndef __thread
|
7
|
+
# define __thread gccxml__thread
|
8
|
+
# define gccxml__thread gccxml__thread
|
9
|
+
#endif
|
10
|
+
#include_next <pthread.h>
|
11
|
+
#ifdef gccxml__thread
|
12
|
+
# undef gccxml__thread
|
13
|
+
# undef __thread
|
14
|
+
#endif
|
15
|
+
|
16
|
+
#endif
|
@@ -0,0 +1,384 @@
|
|
1
|
+
// String based streams -*- C++ -*-
|
2
|
+
|
3
|
+
// Copyright (C) 1997, 1998, 1999, 2002 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 2, 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
|
+
// You should have received a copy of the GNU General Public License along
|
17
|
+
// with this library; see the file COPYING. If not, write to the Free
|
18
|
+
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
19
|
+
// USA.
|
20
|
+
|
21
|
+
// As a special exception, you may use this file as part of a free software
|
22
|
+
// library without restriction. Specifically, if other files instantiate
|
23
|
+
// templates or use macros or inline functions from this file, or you compile
|
24
|
+
// this file and link it with other files to produce an executable, this
|
25
|
+
// file does not by itself cause the resulting executable to be covered by
|
26
|
+
// the GNU General Public License. This exception does not however
|
27
|
+
// invalidate any other reasons why the executable file might be covered by
|
28
|
+
// the GNU General Public License.
|
29
|
+
|
30
|
+
//
|
31
|
+
// ISO C++ 14882: 27.7 String-based streams
|
32
|
+
//
|
33
|
+
|
34
|
+
/** @file sstream
|
35
|
+
* This is a Standard C++ Library header. You should @c #include this header
|
36
|
+
* in your programs, rather than any of the "st[dl]_*.h" implementation files.
|
37
|
+
*/
|
38
|
+
|
39
|
+
#ifndef _CPP_SSTREAM
|
40
|
+
#define _CPP_SSTREAM 1
|
41
|
+
|
42
|
+
#pragma GCC system_header
|
43
|
+
|
44
|
+
#include <istream>
|
45
|
+
#include <ostream>
|
46
|
+
|
47
|
+
namespace std
|
48
|
+
{
|
49
|
+
template<typename _CharT, typename _Traits, typename _Alloc>
|
50
|
+
class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
|
51
|
+
{
|
52
|
+
public:
|
53
|
+
// Types:
|
54
|
+
typedef _CharT char_type;
|
55
|
+
typedef _Traits traits_type;
|
56
|
+
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
|
57
|
+
// 251. basic_stringbuf missing allocator_type
|
58
|
+
typedef _Alloc allocator_type;
|
59
|
+
#endif
|
60
|
+
typedef typename traits_type::int_type int_type;
|
61
|
+
typedef typename traits_type::pos_type pos_type;
|
62
|
+
typedef typename traits_type::off_type off_type;
|
63
|
+
|
64
|
+
// Non-standard Types:
|
65
|
+
typedef basic_streambuf<char_type, traits_type> __streambuf_type;
|
66
|
+
typedef basic_string<char_type, _Traits, _Alloc> __string_type;
|
67
|
+
typedef typename __string_type::size_type __size_type;
|
68
|
+
|
69
|
+
protected:
|
70
|
+
// Data Members:
|
71
|
+
__string_type _M_string;
|
72
|
+
|
73
|
+
using __streambuf_type::_M_mode;
|
74
|
+
using __streambuf_type::_M_out_cur_move;
|
75
|
+
using __streambuf_type::_M_out_cur;
|
76
|
+
using __streambuf_type::_M_out_beg;
|
77
|
+
using __streambuf_type::_M_out_end;
|
78
|
+
using __streambuf_type::_M_buf_size;
|
79
|
+
using __streambuf_type::_M_buf_size_opt;
|
80
|
+
using __streambuf_type::_M_in_cur;
|
81
|
+
using __streambuf_type::_M_in_beg;
|
82
|
+
using __streambuf_type::_M_in_end;
|
83
|
+
using __streambuf_type::_M_buf;
|
84
|
+
using __streambuf_type::gptr;
|
85
|
+
|
86
|
+
public:
|
87
|
+
// Constructors:
|
88
|
+
explicit
|
89
|
+
basic_stringbuf(ios_base::openmode __mode = ios_base::in | ios_base::out)
|
90
|
+
: __streambuf_type(), _M_string()
|
91
|
+
{ _M_stringbuf_init(__mode); }
|
92
|
+
|
93
|
+
explicit
|
94
|
+
basic_stringbuf(const __string_type& __str,
|
95
|
+
ios_base::openmode __mode = ios_base::in | ios_base::out)
|
96
|
+
: __streambuf_type(), _M_string(__str.data(), __str.size())
|
97
|
+
{ _M_stringbuf_init(__mode); }
|
98
|
+
|
99
|
+
// Get and set:
|
100
|
+
__string_type
|
101
|
+
str() const
|
102
|
+
{
|
103
|
+
if (_M_mode & ios_base::out)
|
104
|
+
{
|
105
|
+
// This is the deal: _M_string.size() is a value that
|
106
|
+
// represents the size of the initial string that makes
|
107
|
+
// _M_string, and may not be the correct size of the
|
108
|
+
// current stringbuf internal buffer.
|
109
|
+
__size_type __len = _M_string.size();
|
110
|
+
if (_M_out_cur > _M_out_beg)
|
111
|
+
__len = max(__size_type(_M_out_end - _M_out_beg), __len);
|
112
|
+
return __string_type(_M_out_beg, _M_out_beg + __len);
|
113
|
+
}
|
114
|
+
else
|
115
|
+
return _M_string;
|
116
|
+
}
|
117
|
+
|
118
|
+
void
|
119
|
+
str(const __string_type& __s)
|
120
|
+
{
|
121
|
+
// Cannot use _M_string = __s, since v3 strings are COW.
|
122
|
+
_M_string.assign(__s.data(), __s.size());
|
123
|
+
_M_stringbuf_init(_M_mode);
|
124
|
+
}
|
125
|
+
|
126
|
+
protected:
|
127
|
+
// Common initialization code for both ctors goes here.
|
128
|
+
void
|
129
|
+
_M_stringbuf_init(ios_base::openmode __mode)
|
130
|
+
{
|
131
|
+
// _M_buf_size is a convenient alias for "what the streambuf
|
132
|
+
// thinks the allocated size of the string really is." This is
|
133
|
+
// necessary as ostringstreams are implemented with the
|
134
|
+
// streambufs having control of the allocation and
|
135
|
+
// re-allocation of the internal string object, _M_string.
|
136
|
+
_M_buf_size = _M_string.size();
|
137
|
+
|
138
|
+
// NB: Start ostringstream buffers at 512 bytes. This is an
|
139
|
+
// experimental value (pronounced "arbitrary" in some of the
|
140
|
+
// hipper english-speaking countries), and can be changed to
|
141
|
+
// suit particular needs.
|
142
|
+
_M_buf_size_opt = 512;
|
143
|
+
_M_mode = __mode;
|
144
|
+
if (_M_mode & (ios_base::ate | ios_base::app))
|
145
|
+
_M_really_sync(0, _M_buf_size);
|
146
|
+
else
|
147
|
+
_M_really_sync(0, 0);
|
148
|
+
}
|
149
|
+
|
150
|
+
// Overridden virtual functions:
|
151
|
+
virtual int_type
|
152
|
+
underflow()
|
153
|
+
{
|
154
|
+
if (_M_in_cur && _M_in_cur < _M_in_end)
|
155
|
+
return traits_type::to_int_type(*gptr());
|
156
|
+
else
|
157
|
+
return traits_type::eof();
|
158
|
+
}
|
159
|
+
|
160
|
+
virtual int_type
|
161
|
+
pbackfail(int_type __c = traits_type::eof());
|
162
|
+
|
163
|
+
virtual int_type
|
164
|
+
overflow(int_type __c = traits_type::eof());
|
165
|
+
|
166
|
+
virtual __streambuf_type*
|
167
|
+
setbuf(char_type* __s, streamsize __n)
|
168
|
+
{
|
169
|
+
if (__s && __n)
|
170
|
+
{
|
171
|
+
_M_string = __string_type(__s, __n);
|
172
|
+
_M_really_sync(0, 0);
|
173
|
+
}
|
174
|
+
return this;
|
175
|
+
}
|
176
|
+
|
177
|
+
virtual pos_type
|
178
|
+
seekoff(off_type __off, ios_base::seekdir __way,
|
179
|
+
ios_base::openmode __mode = ios_base::in | ios_base::out);
|
180
|
+
|
181
|
+
virtual pos_type
|
182
|
+
seekpos(pos_type __sp,
|
183
|
+
ios_base::openmode __mode = ios_base::in | ios_base::out);
|
184
|
+
|
185
|
+
// Internal function for correctly updating the internal buffer
|
186
|
+
// for a particular _M_string, due to initialization or
|
187
|
+
// re-sizing of an existing _M_string.
|
188
|
+
// Assumes: contents of _M_string and internal buffer match exactly.
|
189
|
+
// __i == _M_in_cur - _M_in_beg
|
190
|
+
// __o == _M_out_cur - _M_out_beg
|
191
|
+
virtual int
|
192
|
+
_M_really_sync(__size_type __i, __size_type __o)
|
193
|
+
{
|
194
|
+
char_type* __base = const_cast<char_type*>(_M_string.data());
|
195
|
+
bool __testin = _M_mode & ios_base::in;
|
196
|
+
bool __testout = _M_mode & ios_base::out;
|
197
|
+
__size_type __len = _M_string.size();
|
198
|
+
|
199
|
+
_M_buf = __base;
|
200
|
+
if (__testin)
|
201
|
+
this->setg(__base, __base + __i, __base + __len);
|
202
|
+
if (__testout)
|
203
|
+
{
|
204
|
+
this->setp(__base, __base + __len);
|
205
|
+
_M_out_cur += __o;
|
206
|
+
}
|
207
|
+
return 0;
|
208
|
+
}
|
209
|
+
};
|
210
|
+
|
211
|
+
|
212
|
+
// 27.7.2 Template class basic_istringstream
|
213
|
+
template<typename _CharT, typename _Traits, typename _Alloc>
|
214
|
+
class basic_istringstream : public basic_istream<_CharT, _Traits>
|
215
|
+
{
|
216
|
+
public:
|
217
|
+
// Types:
|
218
|
+
typedef _CharT char_type;
|
219
|
+
typedef _Traits traits_type;
|
220
|
+
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
|
221
|
+
// 251. basic_stringbuf missing allocator_type
|
222
|
+
typedef _Alloc allocator_type;
|
223
|
+
#endif
|
224
|
+
typedef typename traits_type::int_type int_type;
|
225
|
+
typedef typename traits_type::pos_type pos_type;
|
226
|
+
typedef typename traits_type::off_type off_type;
|
227
|
+
|
228
|
+
// Non-standard types:
|
229
|
+
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
230
|
+
typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
|
231
|
+
typedef basic_istream<char_type, traits_type> __istream_type;
|
232
|
+
|
233
|
+
private:
|
234
|
+
__stringbuf_type _M_stringbuf;
|
235
|
+
|
236
|
+
public:
|
237
|
+
// Constructors:
|
238
|
+
explicit
|
239
|
+
basic_istringstream(ios_base::openmode __mode = ios_base::in)
|
240
|
+
: __istream_type(NULL), _M_stringbuf(__mode | ios_base::in)
|
241
|
+
{ this->init(&_M_stringbuf); }
|
242
|
+
|
243
|
+
explicit
|
244
|
+
basic_istringstream(const __string_type& __str,
|
245
|
+
ios_base::openmode __mode = ios_base::in)
|
246
|
+
: __istream_type(NULL), _M_stringbuf(__str, __mode | ios_base::in)
|
247
|
+
{ this->init(&_M_stringbuf); }
|
248
|
+
|
249
|
+
~basic_istringstream()
|
250
|
+
{ }
|
251
|
+
|
252
|
+
// Members:
|
253
|
+
__stringbuf_type*
|
254
|
+
rdbuf() const
|
255
|
+
{ return const_cast<__stringbuf_type*>(&_M_stringbuf); }
|
256
|
+
|
257
|
+
__string_type
|
258
|
+
str() const
|
259
|
+
{ return _M_stringbuf.str(); }
|
260
|
+
|
261
|
+
void
|
262
|
+
str(const __string_type& __s)
|
263
|
+
{ _M_stringbuf.str(__s); }
|
264
|
+
};
|
265
|
+
|
266
|
+
|
267
|
+
// 27.7.3 Template class basic_ostringstream
|
268
|
+
template <typename _CharT, typename _Traits, typename _Alloc>
|
269
|
+
class basic_ostringstream : public basic_ostream<_CharT, _Traits>
|
270
|
+
{
|
271
|
+
public:
|
272
|
+
// Types:
|
273
|
+
typedef _CharT char_type;
|
274
|
+
typedef _Traits traits_type;
|
275
|
+
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
|
276
|
+
// 251. basic_stringbuf missing allocator_type
|
277
|
+
typedef _Alloc allocator_type;
|
278
|
+
#endif
|
279
|
+
typedef typename traits_type::int_type int_type;
|
280
|
+
typedef typename traits_type::pos_type pos_type;
|
281
|
+
typedef typename traits_type::off_type off_type;
|
282
|
+
|
283
|
+
// Non-standard types:
|
284
|
+
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
285
|
+
typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
|
286
|
+
typedef basic_ostream<char_type, traits_type> __ostream_type;
|
287
|
+
|
288
|
+
private:
|
289
|
+
__stringbuf_type _M_stringbuf;
|
290
|
+
|
291
|
+
public:
|
292
|
+
// Constructors/destructor:
|
293
|
+
explicit
|
294
|
+
basic_ostringstream(ios_base::openmode __mode = ios_base::out)
|
295
|
+
: __ostream_type(NULL), _M_stringbuf(__mode | ios_base::out)
|
296
|
+
{ this->init(&_M_stringbuf); }
|
297
|
+
|
298
|
+
explicit
|
299
|
+
basic_ostringstream(const __string_type& __str,
|
300
|
+
ios_base::openmode __mode = ios_base::out)
|
301
|
+
: __ostream_type(NULL), _M_stringbuf(__str, __mode | ios_base::out)
|
302
|
+
{ this->init(&_M_stringbuf); }
|
303
|
+
|
304
|
+
~basic_ostringstream()
|
305
|
+
{ }
|
306
|
+
|
307
|
+
// Members:
|
308
|
+
__stringbuf_type*
|
309
|
+
rdbuf() const
|
310
|
+
{ return const_cast<__stringbuf_type*>(&_M_stringbuf); }
|
311
|
+
|
312
|
+
__string_type
|
313
|
+
str() const
|
314
|
+
{ return _M_stringbuf.str(); }
|
315
|
+
|
316
|
+
void
|
317
|
+
str(const __string_type& __s)
|
318
|
+
{ _M_stringbuf.str(__s); }
|
319
|
+
};
|
320
|
+
|
321
|
+
|
322
|
+
// 27.7.4 Template class basic_stringstream
|
323
|
+
template <typename _CharT, typename _Traits, typename _Alloc>
|
324
|
+
class basic_stringstream : public basic_iostream<_CharT, _Traits>
|
325
|
+
{
|
326
|
+
public:
|
327
|
+
// Types:
|
328
|
+
typedef _CharT char_type;
|
329
|
+
typedef _Traits traits_type;
|
330
|
+
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
|
331
|
+
// 251. basic_stringbuf missing allocator_type
|
332
|
+
typedef _Alloc allocator_type;
|
333
|
+
#endif
|
334
|
+
typedef typename traits_type::int_type int_type;
|
335
|
+
typedef typename traits_type::pos_type pos_type;
|
336
|
+
typedef typename traits_type::off_type off_type;
|
337
|
+
|
338
|
+
// Non-standard Types:
|
339
|
+
typedef basic_string<_CharT, _Traits, _Alloc> __string_type;
|
340
|
+
typedef basic_stringbuf<_CharT, _Traits, _Alloc> __stringbuf_type;
|
341
|
+
typedef basic_iostream<char_type, traits_type> __iostream_type;
|
342
|
+
|
343
|
+
private:
|
344
|
+
__stringbuf_type _M_stringbuf;
|
345
|
+
|
346
|
+
public:
|
347
|
+
// Constructors/destructors
|
348
|
+
explicit
|
349
|
+
basic_stringstream(ios_base::openmode __m = ios_base::out | ios_base::in)
|
350
|
+
: __iostream_type(NULL), _M_stringbuf(__m)
|
351
|
+
{ this->init(&_M_stringbuf); }
|
352
|
+
|
353
|
+
explicit
|
354
|
+
basic_stringstream(const __string_type& __str,
|
355
|
+
ios_base::openmode __m = ios_base::out | ios_base::in)
|
356
|
+
: __iostream_type(NULL), _M_stringbuf(__str, __m)
|
357
|
+
{ this->init(&_M_stringbuf); }
|
358
|
+
|
359
|
+
~basic_stringstream()
|
360
|
+
{ }
|
361
|
+
|
362
|
+
// Members:
|
363
|
+
__stringbuf_type*
|
364
|
+
rdbuf() const
|
365
|
+
{ return const_cast<__stringbuf_type*>(&_M_stringbuf); }
|
366
|
+
|
367
|
+
__string_type
|
368
|
+
str() const
|
369
|
+
{ return _M_stringbuf.str(); }
|
370
|
+
|
371
|
+
void
|
372
|
+
str(const __string_type& __s)
|
373
|
+
{ _M_stringbuf.str(__s); }
|
374
|
+
};
|
375
|
+
} // namespace std
|
376
|
+
|
377
|
+
#ifdef _GLIBCPP_NO_TEMPLATE_EXPORT
|
378
|
+
# define export
|
379
|
+
#endif
|
380
|
+
#ifdef _GLIBCPP_FULLY_COMPLIANT_HEADERS
|
381
|
+
# include <bits/sstream.tcc>
|
382
|
+
#endif
|
383
|
+
|
384
|
+
#endif
|
@@ -0,0 +1,530 @@
|
|
1
|
+
// File based streams -*- C++ -*-
|
2
|
+
|
3
|
+
// Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
|
4
|
+
// Free Software Foundation, Inc.
|
5
|
+
//
|
6
|
+
// This file is part of the GNU ISO C++ Library. This library is free
|
7
|
+
// software; you can redistribute it and/or modify it under the
|
8
|
+
// terms of the GNU General Public License as published by the
|
9
|
+
// Free Software Foundation; either version 2, or (at your option)
|
10
|
+
// any later version.
|
11
|
+
|
12
|
+
// This library is distributed in the hope that it will be useful,
|
13
|
+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
14
|
+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
15
|
+
// GNU General Public License for more details.
|
16
|
+
|
17
|
+
// You should have received a copy of the GNU General Public License along
|
18
|
+
// with this library; see the file COPYING. If not, write to the Free
|
19
|
+
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
20
|
+
// USA.
|
21
|
+
|
22
|
+
// As a special exception, you may use this file as part of a free software
|
23
|
+
// library without restriction. Specifically, if other files instantiate
|
24
|
+
// templates or use macros or inline functions from this file, or you compile
|
25
|
+
// this file and link it with other files to produce an executable, this
|
26
|
+
// file does not by itself cause the resulting executable to be covered by
|
27
|
+
// the GNU General Public License. This exception does not however
|
28
|
+
// invalidate any other reasons why the executable file might be covered by
|
29
|
+
// the GNU General Public License.
|
30
|
+
|
31
|
+
//
|
32
|
+
// ISO C++ 14882: 27.8 File-based streams
|
33
|
+
//
|
34
|
+
|
35
|
+
#ifndef _CPP_BITS_FSTREAM_TCC
|
36
|
+
#define _CPP_BITS_FSTREAM_TCC 1
|
37
|
+
|
38
|
+
#pragma GCC system_header
|
39
|
+
|
40
|
+
namespace std
|
41
|
+
{
|
42
|
+
template<typename _CharT, typename _Traits>
|
43
|
+
void
|
44
|
+
basic_filebuf<_CharT, _Traits>::
|
45
|
+
_M_allocate_internal_buffer()
|
46
|
+
{
|
47
|
+
if (!this->_M_buf && this->_M_buf_size_opt)
|
48
|
+
{
|
49
|
+
this->_M_buf_size = this->_M_buf_size_opt;
|
50
|
+
|
51
|
+
// Allocate internal buffer.
|
52
|
+
this->_M_buf = new char_type[this->_M_buf_size];
|
53
|
+
_M_buf_allocated = true;
|
54
|
+
}
|
55
|
+
}
|
56
|
+
|
57
|
+
// Both close and setbuf need to deallocate internal buffers, if it exists.
|
58
|
+
template<typename _CharT, typename _Traits>
|
59
|
+
void
|
60
|
+
basic_filebuf<_CharT, _Traits>::
|
61
|
+
_M_destroy_internal_buffer() throw()
|
62
|
+
{
|
63
|
+
if (_M_buf_allocated)
|
64
|
+
{
|
65
|
+
delete [] this->_M_buf;
|
66
|
+
this->_M_buf = NULL;
|
67
|
+
_M_buf_allocated = false;
|
68
|
+
this->setg(NULL, NULL, NULL);
|
69
|
+
this->setp(NULL, NULL);
|
70
|
+
}
|
71
|
+
}
|
72
|
+
|
73
|
+
template<typename _CharT, typename _Traits>
|
74
|
+
basic_filebuf<_CharT, _Traits>::
|
75
|
+
basic_filebuf() : __streambuf_type(), _M_file(&_M_lock),
|
76
|
+
_M_state_cur(__state_type()), _M_state_beg(__state_type()),
|
77
|
+
_M_buf_allocated(false), _M_last_overflowed(false)
|
78
|
+
{ this->_M_buf_unified = true; }
|
79
|
+
|
80
|
+
template<typename _CharT, typename _Traits>
|
81
|
+
typename basic_filebuf<_CharT, _Traits>::__filebuf_type*
|
82
|
+
basic_filebuf<_CharT, _Traits>::
|
83
|
+
open(const char* __s, ios_base::openmode __mode)
|
84
|
+
{
|
85
|
+
__filebuf_type *__ret = NULL;
|
86
|
+
if (!this->is_open())
|
87
|
+
{
|
88
|
+
_M_file.open(__s, __mode);
|
89
|
+
if (this->is_open())
|
90
|
+
{
|
91
|
+
_M_allocate_internal_buffer();
|
92
|
+
this->_M_mode = __mode;
|
93
|
+
|
94
|
+
// Setup initial position of buffer.
|
95
|
+
_M_set_indeterminate();
|
96
|
+
|
97
|
+
if ((__mode & ios_base::ate)
|
98
|
+
&& this->seekoff(0, ios_base::end, __mode) < 0)
|
99
|
+
{
|
100
|
+
// 27.8.1.3,4
|
101
|
+
this->close();
|
102
|
+
return __ret;
|
103
|
+
}
|
104
|
+
|
105
|
+
__ret = this;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
return __ret;
|
109
|
+
}
|
110
|
+
|
111
|
+
template<typename _CharT, typename _Traits>
|
112
|
+
typename basic_filebuf<_CharT, _Traits>::__filebuf_type*
|
113
|
+
basic_filebuf<_CharT, _Traits>::
|
114
|
+
close() throw()
|
115
|
+
{
|
116
|
+
__filebuf_type* __ret = NULL;
|
117
|
+
if (this->is_open())
|
118
|
+
{
|
119
|
+
bool __testfail = false;
|
120
|
+
try
|
121
|
+
{
|
122
|
+
const int_type __eof = traits_type::eof();
|
123
|
+
bool __testput = this->_M_out_cur && this->_M_out_beg < this->_M_out_end;
|
124
|
+
if (__testput
|
125
|
+
&& traits_type::eq_int_type(_M_really_overflow(__eof),
|
126
|
+
__eof))
|
127
|
+
__testfail = true;
|
128
|
+
|
129
|
+
#if 0
|
130
|
+
// XXX not done
|
131
|
+
if (_M_last_overflowed)
|
132
|
+
{
|
133
|
+
_M_output_unshift();
|
134
|
+
_M_really_overflow(__eof);
|
135
|
+
}
|
136
|
+
#endif
|
137
|
+
}
|
138
|
+
catch(...)
|
139
|
+
{ __testfail = true; }
|
140
|
+
|
141
|
+
// NB: Do this here so that re-opened filebufs will be cool...
|
142
|
+
this->_M_mode = ios_base::openmode(0);
|
143
|
+
_M_destroy_internal_buffer();
|
144
|
+
this->_M_pback_destroy();
|
145
|
+
|
146
|
+
if (!_M_file.close())
|
147
|
+
__testfail = true;
|
148
|
+
|
149
|
+
if (!__testfail)
|
150
|
+
__ret = this;
|
151
|
+
}
|
152
|
+
_M_last_overflowed = false;
|
153
|
+
return __ret;
|
154
|
+
}
|
155
|
+
|
156
|
+
template<typename _CharT, typename _Traits>
|
157
|
+
streamsize
|
158
|
+
basic_filebuf<_CharT, _Traits>::
|
159
|
+
showmanyc()
|
160
|
+
{
|
161
|
+
streamsize __ret = -1;
|
162
|
+
bool __testin = this->_M_mode & ios_base::in;
|
163
|
+
const locale __loc = this->getloc();
|
164
|
+
const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
|
165
|
+
|
166
|
+
if (__testin && this->is_open())
|
167
|
+
{
|
168
|
+
__ret = this->_M_in_end - this->_M_in_cur;
|
169
|
+
if (__cvt.always_noconv())
|
170
|
+
__ret += _M_file.showmanyc_helper();
|
171
|
+
}
|
172
|
+
|
173
|
+
_M_last_overflowed = false;
|
174
|
+
return __ret;
|
175
|
+
}
|
176
|
+
|
177
|
+
template<typename _CharT, typename _Traits>
|
178
|
+
typename basic_filebuf<_CharT, _Traits>::int_type
|
179
|
+
basic_filebuf<_CharT, _Traits>::
|
180
|
+
pbackfail(int_type __i)
|
181
|
+
{
|
182
|
+
int_type __ret = traits_type::eof();
|
183
|
+
bool __testin = this->_M_mode & ios_base::in;
|
184
|
+
|
185
|
+
if (__testin)
|
186
|
+
{
|
187
|
+
bool __testpb = this->_M_in_beg < this->_M_in_cur;
|
188
|
+
char_type __c = traits_type::to_char_type(__i);
|
189
|
+
bool __testeof = traits_type::eq_int_type(__i, __ret);
|
190
|
+
|
191
|
+
if (__testpb)
|
192
|
+
{
|
193
|
+
bool __testout = this->_M_mode & ios_base::out;
|
194
|
+
bool __testeq = traits_type::eq(__c, this->gptr()[-1]);
|
195
|
+
|
196
|
+
// Try to put back __c into input sequence in one of three ways.
|
197
|
+
// Order these tests done in is unspecified by the standard.
|
198
|
+
if (!__testeof && __testeq)
|
199
|
+
{
|
200
|
+
--this->_M_in_cur;
|
201
|
+
if (__testout)
|
202
|
+
--this->_M_out_cur;
|
203
|
+
__ret = __i;
|
204
|
+
}
|
205
|
+
else if (__testeof)
|
206
|
+
{
|
207
|
+
--this->_M_in_cur;
|
208
|
+
if (__testout)
|
209
|
+
--this->_M_out_cur;
|
210
|
+
__ret = traits_type::not_eof(__i);
|
211
|
+
}
|
212
|
+
else if (!__testeof)
|
213
|
+
{
|
214
|
+
--this->_M_in_cur;
|
215
|
+
if (__testout)
|
216
|
+
--this->_M_out_cur;
|
217
|
+
this->_M_pback_create();
|
218
|
+
*this->_M_in_cur = __c;
|
219
|
+
__ret = __i;
|
220
|
+
}
|
221
|
+
}
|
222
|
+
else
|
223
|
+
{
|
224
|
+
// At the beginning of the buffer, need to make a
|
225
|
+
// putback position available.
|
226
|
+
// But the seek may fail (f.i., at the beginning of
|
227
|
+
// a file, see libstdc++/9439) and in that case
|
228
|
+
// we return traits_type::eof()
|
229
|
+
if (this->seekoff(-1, ios_base::cur) >= 0)
|
230
|
+
{
|
231
|
+
this->underflow();
|
232
|
+
if (!__testeof)
|
233
|
+
{
|
234
|
+
if (!traits_type::eq(__c, *this->_M_in_cur))
|
235
|
+
{
|
236
|
+
this->_M_pback_create();
|
237
|
+
*this->_M_in_cur = __c;
|
238
|
+
}
|
239
|
+
__ret = __i;
|
240
|
+
}
|
241
|
+
else
|
242
|
+
__ret = traits_type::not_eof(__i);
|
243
|
+
}
|
244
|
+
}
|
245
|
+
}
|
246
|
+
_M_last_overflowed = false;
|
247
|
+
return __ret;
|
248
|
+
}
|
249
|
+
|
250
|
+
template<typename _CharT, typename _Traits>
|
251
|
+
typename basic_filebuf<_CharT, _Traits>::int_type
|
252
|
+
basic_filebuf<_CharT, _Traits>::
|
253
|
+
overflow(int_type __c)
|
254
|
+
{
|
255
|
+
int_type __ret = traits_type::eof();
|
256
|
+
bool __testput = this->_M_out_cur && this->_M_out_cur < this->_M_buf + this->_M_buf_size;
|
257
|
+
bool __testout = this->_M_mode & ios_base::out;
|
258
|
+
|
259
|
+
if (__testout)
|
260
|
+
{
|
261
|
+
if (traits_type::eq_int_type(__c, traits_type::eof()))
|
262
|
+
__ret = traits_type::not_eof(__c);
|
263
|
+
else if (__testput)
|
264
|
+
{
|
265
|
+
*this->_M_out_cur = traits_type::to_char_type(__c);
|
266
|
+
this->_M_out_cur_move(1);
|
267
|
+
__ret = traits_type::not_eof(__c);
|
268
|
+
}
|
269
|
+
else
|
270
|
+
__ret = this->_M_really_overflow(__c);
|
271
|
+
}
|
272
|
+
|
273
|
+
_M_last_overflowed = false; // Set in _M_really_overflow, below.
|
274
|
+
return __ret;
|
275
|
+
}
|
276
|
+
|
277
|
+
template<typename _CharT, typename _Traits>
|
278
|
+
void
|
279
|
+
basic_filebuf<_CharT, _Traits>::
|
280
|
+
_M_convert_to_external(_CharT* __ibuf, streamsize __ilen,
|
281
|
+
streamsize& __elen, streamsize& __plen)
|
282
|
+
{
|
283
|
+
const locale __loc = this->getloc();
|
284
|
+
const __codecvt_type& __cvt = use_facet<__codecvt_type>(__loc);
|
285
|
+
|
286
|
+
if (__cvt.always_noconv() && __ilen)
|
287
|
+
{
|
288
|
+
__elen += _M_file.xsputn(reinterpret_cast<char*>(__ibuf), __ilen);
|
289
|
+
__plen += __ilen;
|
290
|
+
}
|
291
|
+
else
|
292
|
+
{
|
293
|
+
// Worst-case number of external bytes needed.
|
294
|
+
int __ext_multiplier = __cvt.encoding();
|
295
|
+
if (__ext_multiplier == -1 || __ext_multiplier == 0)
|
296
|
+
__ext_multiplier = sizeof(char_type);
|
297
|
+
streamsize __blen = __ilen * __ext_multiplier;
|
298
|
+
char* __buf = static_cast<char*>(__builtin_alloca(__blen));
|
299
|
+
char* __bend;
|
300
|
+
const char_type* __iend;
|
301
|
+
codecvt_base::result __r;
|
302
|
+
__r = __cvt.out(_M_state_cur, __ibuf, __ibuf + __ilen,
|
303
|
+
__iend, __buf, __buf + __blen, __bend);
|
304
|
+
|
305
|
+
if (__r == codecvt_base::ok || __r == codecvt_base::partial)
|
306
|
+
__blen = __bend - __buf;
|
307
|
+
else if (__r == codecvt_base::noconv)
|
308
|
+
{
|
309
|
+
// Same as the always_noconv case above.
|
310
|
+
__buf = reinterpret_cast<char*>(__ibuf);
|
311
|
+
__blen = __ilen;
|
312
|
+
}
|
313
|
+
else
|
314
|
+
{
|
315
|
+
// Result == error
|
316
|
+
__blen = 0;
|
317
|
+
}
|
318
|
+
|
319
|
+
if (__blen)
|
320
|
+
{
|
321
|
+
__elen += _M_file.xsputn(__buf, __blen);
|
322
|
+
__plen += __blen;
|
323
|
+
}
|
324
|
+
|
325
|
+
// Try once more for partial conversions.
|
326
|
+
if (__r == codecvt_base::partial)
|
327
|
+
{
|
328
|
+
const char_type* __iresume = __iend;
|
329
|
+
streamsize __rlen = this->_M_out_end - __iend;
|
330
|
+
__r = __cvt.out(_M_state_cur, __iresume, __iresume + __rlen,
|
331
|
+
__iend, __buf, __buf + __blen, __bend);
|
332
|
+
if (__r != codecvt_base::error)
|
333
|
+
{
|
334
|
+
__rlen = __bend - __buf;
|
335
|
+
__elen += _M_file.xsputn(__buf, __rlen);
|
336
|
+
__plen += __rlen;
|
337
|
+
}
|
338
|
+
}
|
339
|
+
}
|
340
|
+
}
|
341
|
+
|
342
|
+
template<typename _CharT, typename _Traits>
|
343
|
+
typename basic_filebuf<_CharT, _Traits>::int_type
|
344
|
+
basic_filebuf<_CharT, _Traits>::
|
345
|
+
_M_really_overflow(int_type __c)
|
346
|
+
{
|
347
|
+
int_type __ret = traits_type::eof();
|
348
|
+
bool __testput = this->_M_out_cur && this->_M_out_beg < this->_M_out_end;
|
349
|
+
bool __testunbuffered = _M_file.is_open() && !this->_M_buf_size;
|
350
|
+
|
351
|
+
if (__testput || __testunbuffered)
|
352
|
+
{
|
353
|
+
// Sizes of external and pending output.
|
354
|
+
streamsize __elen = 0;
|
355
|
+
streamsize __plen = 0;
|
356
|
+
|
357
|
+
// Need to restore current position. The position of the external
|
358
|
+
// byte sequence (_M_file) corresponds to _M_filepos, and we need
|
359
|
+
// to move it to _M_out_beg for the write.
|
360
|
+
if (_M_filepos && _M_filepos != this->_M_out_beg)
|
361
|
+
{
|
362
|
+
off_type __off = this->_M_out_beg - _M_filepos;
|
363
|
+
_M_file.seekoff(__off, ios_base::cur);
|
364
|
+
}
|
365
|
+
|
366
|
+
// Convert internal buffer to external representation, output.
|
367
|
+
// NB: In the unbuffered case, no internal buffer exists.
|
368
|
+
if (!__testunbuffered)
|
369
|
+
_M_convert_to_external(this->_M_out_beg, this->_M_out_end - this->_M_out_beg,
|
370
|
+
__elen, __plen);
|
371
|
+
|
372
|
+
// Checks for codecvt.out failures and _M_file.xsputn failures,
|
373
|
+
// respectively, inside _M_convert_to_external.
|
374
|
+
if (__testunbuffered || (__elen && __elen == __plen))
|
375
|
+
{
|
376
|
+
// Convert pending sequence to external representation, output.
|
377
|
+
// If eof, then just attempt sync.
|
378
|
+
if (!traits_type::eq_int_type(__c, traits_type::eof()))
|
379
|
+
{
|
380
|
+
char_type __pending = traits_type::to_char_type(__c);
|
381
|
+
_M_convert_to_external(&__pending, 1, __elen, __plen);
|
382
|
+
|
383
|
+
// User code must flush when switching modes (thus
|
384
|
+
// don't sync).
|
385
|
+
if (__elen == __plen && __elen)
|
386
|
+
{
|
387
|
+
_M_set_indeterminate();
|
388
|
+
__ret = traits_type::not_eof(__c);
|
389
|
+
}
|
390
|
+
}
|
391
|
+
else if (!_M_file.sync())
|
392
|
+
{
|
393
|
+
_M_set_indeterminate();
|
394
|
+
__ret = traits_type::not_eof(__c);
|
395
|
+
}
|
396
|
+
}
|
397
|
+
}
|
398
|
+
_M_last_overflowed = true;
|
399
|
+
return __ret;
|
400
|
+
}
|
401
|
+
|
402
|
+
template<typename _CharT, typename _Traits>
|
403
|
+
typename basic_filebuf<_CharT, _Traits>::__streambuf_type*
|
404
|
+
basic_filebuf<_CharT, _Traits>::
|
405
|
+
setbuf(char_type* __s, streamsize __n)
|
406
|
+
{
|
407
|
+
if (!this->is_open() && __s == 0 && __n == 0)
|
408
|
+
this->_M_buf_size_opt = 0;
|
409
|
+
else if (__s && __n)
|
410
|
+
{
|
411
|
+
// This is implementation-defined behavior, and assumes
|
412
|
+
// that an external char_type array of length (__s + __n)
|
413
|
+
// exists and has been pre-allocated. If this is not the
|
414
|
+
// case, things will quickly blow up.
|
415
|
+
// Step 1: Destroy the current internal array.
|
416
|
+
_M_destroy_internal_buffer();
|
417
|
+
|
418
|
+
// Step 2: Use the external array.
|
419
|
+
this->_M_buf = __s;
|
420
|
+
this->_M_buf_size_opt = this->_M_buf_size = __n;
|
421
|
+
_M_set_indeterminate();
|
422
|
+
}
|
423
|
+
_M_last_overflowed = false;
|
424
|
+
return this;
|
425
|
+
}
|
426
|
+
|
427
|
+
template<typename _CharT, typename _Traits>
|
428
|
+
typename basic_filebuf<_CharT, _Traits>::pos_type
|
429
|
+
basic_filebuf<_CharT, _Traits>::
|
430
|
+
seekoff(off_type __off, ios_base::seekdir __way, ios_base::openmode __mode)
|
431
|
+
{
|
432
|
+
pos_type __ret = pos_type(off_type(-1));
|
433
|
+
bool __testin = (ios_base::in & this->_M_mode & __mode) != 0;
|
434
|
+
bool __testout = (ios_base::out & this->_M_mode & __mode) != 0;
|
435
|
+
|
436
|
+
int __width = 0;
|
437
|
+
if (has_facet<__codecvt_type>(this->_M_buf_locale))
|
438
|
+
__width = use_facet<__codecvt_type>(this->_M_buf_locale).encoding();
|
439
|
+
if (__width < 0)
|
440
|
+
__width = 0;
|
441
|
+
|
442
|
+
bool __testfail = __off != 0 && __width <= 0;
|
443
|
+
if (this->is_open() && !__testfail && (__testin || __testout))
|
444
|
+
{
|
445
|
+
// Ditch any pback buffers to avoid confusion.
|
446
|
+
this->_M_pback_destroy();
|
447
|
+
|
448
|
+
if (__way != ios_base::cur || __off != 0)
|
449
|
+
{
|
450
|
+
off_type __computed_off = __width * __off;
|
451
|
+
|
452
|
+
bool __testget = this->_M_in_cur && this->_M_in_beg < this->_M_in_end;
|
453
|
+
bool __testput = this->_M_out_cur && this->_M_out_beg < this->_M_out_end;
|
454
|
+
// Sync the internal and external streams.
|
455
|
+
// out
|
456
|
+
if (__testput || _M_last_overflowed)
|
457
|
+
{
|
458
|
+
// Part one: update the output sequence.
|
459
|
+
this->sync();
|
460
|
+
// Part two: output unshift sequence.
|
461
|
+
_M_output_unshift();
|
462
|
+
}
|
463
|
+
//in
|
464
|
+
else if (__testget && __way == ios_base::cur)
|
465
|
+
__computed_off += this->_M_in_cur - _M_filepos;
|
466
|
+
|
467
|
+
// Return pos_type(off_type(-1)) in case of failure.
|
468
|
+
__ret = _M_file.seekoff(__computed_off, __way, __mode);
|
469
|
+
_M_set_indeterminate();
|
470
|
+
}
|
471
|
+
// NB: Need to do this in case _M_file in indeterminate
|
472
|
+
// state, ie _M_file._offset == -1
|
473
|
+
else
|
474
|
+
{
|
475
|
+
pos_type __tmp =
|
476
|
+
_M_file.seekoff(__off, ios_base::cur, __mode);
|
477
|
+
if (__tmp >= 0)
|
478
|
+
{
|
479
|
+
// Seek successful.
|
480
|
+
__ret = __tmp;
|
481
|
+
__ret += max(this->_M_out_cur, this->_M_in_cur) - _M_filepos;
|
482
|
+
}
|
483
|
+
}
|
484
|
+
}
|
485
|
+
_M_last_overflowed = false;
|
486
|
+
return __ret;
|
487
|
+
}
|
488
|
+
|
489
|
+
template<typename _CharT, typename _Traits>
|
490
|
+
typename basic_filebuf<_CharT, _Traits>::pos_type
|
491
|
+
basic_filebuf<_CharT, _Traits>::
|
492
|
+
seekpos(pos_type __pos, ios_base::openmode __mode)
|
493
|
+
{
|
494
|
+
#ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS
|
495
|
+
// 171. Strange seekpos() semantics due to joint position
|
496
|
+
return this->seekoff(off_type(__pos), ios_base::beg, __mode);
|
497
|
+
#endif
|
498
|
+
}
|
499
|
+
|
500
|
+
template<typename _CharT, typename _Traits>
|
501
|
+
void
|
502
|
+
basic_filebuf<_CharT, _Traits>::
|
503
|
+
_M_output_unshift()
|
504
|
+
{ }
|
505
|
+
|
506
|
+
template<typename _CharT, typename _Traits>
|
507
|
+
void
|
508
|
+
basic_filebuf<_CharT, _Traits>::
|
509
|
+
imbue(const locale&)
|
510
|
+
{ _M_last_overflowed = false; }
|
511
|
+
|
512
|
+
// Inhibit implicit instantiations for required instantiations,
|
513
|
+
// which are defined via explicit instantiations elsewhere.
|
514
|
+
// NB: This syntax is a GNU extension.
|
515
|
+
#if _GLIBCPP_EXTERN_TEMPLATE
|
516
|
+
extern template class basic_filebuf<char>;
|
517
|
+
extern template class basic_ifstream<char>;
|
518
|
+
extern template class basic_ofstream<char>;
|
519
|
+
extern template class basic_fstream<char>;
|
520
|
+
|
521
|
+
#ifdef _GLIBCPP_USE_WCHAR_T
|
522
|
+
extern template class basic_filebuf<wchar_t>;
|
523
|
+
extern template class basic_ifstream<wchar_t>;
|
524
|
+
extern template class basic_ofstream<wchar_t>;
|
525
|
+
extern template class basic_fstream<wchar_t>;
|
526
|
+
#endif
|
527
|
+
#endif
|
528
|
+
} // namespace std
|
529
|
+
|
530
|
+
#endif
|