]>
Commit | Line | Data |
---|---|---|
725dc051 BK |
1 | // Iostreams base classes -*- C++ -*- |
2 | ||
17325050 AP |
3 | // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 |
4 | // Free Software Foundation, Inc. | |
725dc051 BK |
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 | ||
729e3d3f PE |
35 | /** @file ios_base.h |
36 | * This is an internal header file, included by other library headers. | |
37 | * You should not attempt to use it directly. | |
38 | */ | |
39 | ||
725dc051 BK |
40 | #ifndef _CPP_BITS_IOSBASE_H |
41 | #define _CPP_BITS_IOSBASE_H 1 | |
42 | ||
b0a85b86 GDR |
43 | #pragma GCC system_header |
44 | ||
17325050 AP |
45 | #include <bits/atomicity.h> |
46 | ||
d53d7f6e PE |
47 | namespace std |
48 | { | |
725dc051 BK |
49 | // The following definitions of bitmask types are enums, not ints, |
50 | // as permitted (but not required) in the standard, in order to provide | |
51 | // better type safety in iostream calls. A side effect is that | |
52 | // expressions involving them are no longer compile-time constants. | |
07319722 | 53 | enum _Ios_Fmtflags { _M_ios_fmtflags_end = 1L << 16 }; |
725dc051 BK |
54 | |
55 | inline _Ios_Fmtflags | |
56 | operator&(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | |
57 | { return _Ios_Fmtflags(static_cast<int>(__a) & static_cast<int>(__b)); } | |
58 | ||
59 | inline _Ios_Fmtflags | |
60 | operator|(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | |
61 | { return _Ios_Fmtflags(static_cast<int>(__a) | static_cast<int>(__b)); } | |
62 | ||
63 | inline _Ios_Fmtflags | |
64 | operator^(_Ios_Fmtflags __a, _Ios_Fmtflags __b) | |
65 | { return _Ios_Fmtflags(static_cast<int>(__a) ^ static_cast<int>(__b)); } | |
66 | ||
67 | inline _Ios_Fmtflags | |
68 | operator|=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) | |
69 | { return __a = __a | __b; } | |
70 | ||
71 | inline _Ios_Fmtflags | |
72 | operator&=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) | |
73 | { return __a = __a & __b; } | |
74 | ||
75 | inline _Ios_Fmtflags | |
76 | operator^=(_Ios_Fmtflags& __a, _Ios_Fmtflags __b) | |
77 | { return __a = __a ^ __b; } | |
78 | ||
79 | inline _Ios_Fmtflags | |
80 | operator~(_Ios_Fmtflags __a) | |
81 | { return _Ios_Fmtflags(~static_cast<int>(__a)); } | |
82 | ||
83 | ||
07319722 | 84 | enum _Ios_Openmode { _M_ios_openmode_end = 1L << 16 }; |
725dc051 BK |
85 | |
86 | inline _Ios_Openmode | |
87 | operator&(_Ios_Openmode __a, _Ios_Openmode __b) | |
88 | { return _Ios_Openmode(static_cast<int>(__a) & static_cast<int>(__b)); } | |
89 | ||
90 | inline _Ios_Openmode | |
91 | operator|(_Ios_Openmode __a, _Ios_Openmode __b) | |
92 | { return _Ios_Openmode(static_cast<int>(__a) | static_cast<int>(__b)); } | |
93 | ||
94 | inline _Ios_Openmode | |
95 | operator^(_Ios_Openmode __a, _Ios_Openmode __b) | |
96 | { return _Ios_Openmode(static_cast<int>(__a) ^ static_cast<int>(__b)); } | |
97 | ||
98 | inline _Ios_Openmode | |
99 | operator|=(_Ios_Openmode& __a, _Ios_Openmode __b) | |
100 | { return __a = __a | __b; } | |
101 | ||
102 | inline _Ios_Openmode | |
103 | operator&=(_Ios_Openmode& __a, _Ios_Openmode __b) | |
104 | { return __a = __a & __b; } | |
105 | ||
106 | inline _Ios_Openmode | |
107 | operator^=(_Ios_Openmode& __a, _Ios_Openmode __b) | |
108 | { return __a = __a ^ __b; } | |
109 | ||
110 | inline _Ios_Openmode | |
111 | operator~(_Ios_Openmode __a) | |
112 | { return _Ios_Openmode(~static_cast<int>(__a)); } | |
113 | ||
114 | ||
07319722 | 115 | enum _Ios_Iostate { _M_ios_iostate_end = 1L << 16 }; |
725dc051 BK |
116 | |
117 | inline _Ios_Iostate | |
118 | operator&(_Ios_Iostate __a, _Ios_Iostate __b) | |
119 | { return _Ios_Iostate(static_cast<int>(__a) & static_cast<int>(__b)); } | |
120 | ||
121 | inline _Ios_Iostate | |
122 | operator|(_Ios_Iostate __a, _Ios_Iostate __b) | |
123 | { return _Ios_Iostate(static_cast<int>(__a) | static_cast<int>(__b)); } | |
124 | ||
125 | inline _Ios_Iostate | |
126 | operator^(_Ios_Iostate __a, _Ios_Iostate __b) | |
127 | { return _Ios_Iostate(static_cast<int>(__a) ^ static_cast<int>(__b)); } | |
128 | ||
129 | inline _Ios_Iostate | |
130 | operator|=(_Ios_Iostate& __a, _Ios_Iostate __b) | |
131 | { return __a = __a | __b; } | |
132 | ||
133 | inline _Ios_Iostate | |
134 | operator&=(_Ios_Iostate& __a, _Ios_Iostate __b) | |
135 | { return __a = __a & __b; } | |
136 | ||
137 | inline _Ios_Iostate | |
138 | operator^=(_Ios_Iostate& __a, _Ios_Iostate __b) | |
139 | { return __a = __a ^ __b; } | |
140 | ||
141 | inline _Ios_Iostate | |
142 | operator~(_Ios_Iostate __a) | |
143 | { return _Ios_Iostate(~static_cast<int>(__a)); } | |
144 | ||
07319722 | 145 | enum _Ios_Seekdir { _M_ios_seekdir_end = 1L << 16 }; |
725dc051 BK |
146 | |
147 | // 27.4.2 Class ios_base | |
148 | class ios_base | |
149 | { | |
150 | public: | |
d358ecd0 | 151 | |
725dc051 BK |
152 | // 27.4.2.1.1 Class ios_base::failure |
153 | class failure : public exception | |
154 | { | |
155 | public: | |
156 | #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS | |
77cd227e | 157 | //48. Use of non-existent exception constructor |
725dc051 | 158 | explicit |
d34786e3 | 159 | failure(const string& __str) throw(); |
725dc051 BK |
160 | |
161 | virtual | |
d34786e3 | 162 | ~failure() throw(); |
725dc051 | 163 | |
23a5b444 GDR |
164 | virtual const char* |
165 | what() const throw(); | |
725dc051 BK |
166 | |
167 | private: | |
168 | enum { _M_bufsize = 256 }; | |
169 | char _M_name[_M_bufsize]; | |
170 | #endif | |
171 | }; | |
172 | ||
173 | // 27.4.2.1.2 Type ios_base::fmtflags | |
174 | typedef _Ios_Fmtflags fmtflags; | |
175 | // 27.4.2.1.2 Type fmtflags | |
176 | static const fmtflags boolalpha = fmtflags(__ios_flags::_S_boolalpha); | |
177 | static const fmtflags dec = fmtflags(__ios_flags::_S_dec); | |
178 | static const fmtflags fixed = fmtflags(__ios_flags::_S_fixed); | |
179 | static const fmtflags hex = fmtflags(__ios_flags::_S_hex); | |
180 | static const fmtflags internal = fmtflags(__ios_flags::_S_internal); | |
181 | static const fmtflags left = fmtflags(__ios_flags::_S_left); | |
182 | static const fmtflags oct = fmtflags(__ios_flags::_S_oct); | |
183 | static const fmtflags right = fmtflags(__ios_flags::_S_right); | |
184 | static const fmtflags scientific = fmtflags(__ios_flags::_S_scientific); | |
185 | static const fmtflags showbase = fmtflags(__ios_flags::_S_showbase); | |
186 | static const fmtflags showpoint = fmtflags(__ios_flags::_S_showpoint); | |
187 | static const fmtflags showpos = fmtflags(__ios_flags::_S_showpos); | |
188 | static const fmtflags skipws = fmtflags(__ios_flags::_S_skipws); | |
189 | static const fmtflags unitbuf = fmtflags(__ios_flags::_S_unitbuf); | |
190 | static const fmtflags uppercase = fmtflags(__ios_flags::_S_uppercase); | |
191 | static const fmtflags adjustfield = fmtflags(__ios_flags::_S_adjustfield); | |
192 | static const fmtflags basefield = fmtflags(__ios_flags::_S_basefield); | |
193 | static const fmtflags floatfield = fmtflags(__ios_flags::_S_floatfield); | |
194 | ||
195 | // 27.4.2.1.3 Type ios_base::iostate | |
196 | typedef _Ios_Iostate iostate; | |
197 | static const iostate badbit = iostate(__ios_flags::_S_badbit); | |
198 | static const iostate eofbit = iostate(__ios_flags::_S_eofbit); | |
199 | static const iostate failbit = iostate(__ios_flags::_S_failbit); | |
200 | static const iostate goodbit = iostate(0); | |
201 | ||
202 | // 27.4.2.1.4 Type openmode | |
203 | typedef _Ios_Openmode openmode; | |
204 | static const openmode app = openmode(__ios_flags::_S_app); | |
205 | static const openmode ate = openmode(__ios_flags::_S_ate); | |
206 | static const openmode binary = openmode(__ios_flags::_S_bin); | |
207 | static const openmode in = openmode(__ios_flags::_S_in); | |
208 | static const openmode out = openmode(__ios_flags::_S_out); | |
209 | static const openmode trunc = openmode(__ios_flags::_S_trunc); | |
210 | ||
211 | // 27.4.2.1.5 Type seekdir | |
212 | typedef _Ios_Seekdir seekdir; | |
213 | static const seekdir beg = seekdir(0); | |
214 | static const seekdir cur = seekdir(SEEK_CUR); | |
215 | static const seekdir end = seekdir(SEEK_END); | |
216 | ||
78d58962 | 217 | #ifdef _GLIBCPP_DEPRECATED |
725dc051 BK |
218 | typedef int io_state; |
219 | typedef int open_mode; | |
220 | typedef int seek_dir; | |
221 | #endif | |
222 | ||
223 | // Callbacks; | |
224 | enum event | |
225 | { | |
226 | erase_event, | |
227 | imbue_event, | |
228 | copyfmt_event | |
229 | }; | |
230 | ||
231 | typedef void (*event_callback) (event, ios_base&, int); | |
232 | ||
233 | void | |
234 | register_callback(event_callback __fn, int __index); | |
235 | ||
236 | protected: | |
237 | // Data Members | |
238 | streamsize _M_precision; | |
239 | streamsize _M_width; | |
240 | fmtflags _M_flags; | |
241 | ||
d9ab8adb | 242 | // 27.4.2.6 Members for callbacks |
725dc051 | 243 | // 27.4.2.6 ios_base callbacks |
725dc051 BK |
244 | struct _Callback_list |
245 | { | |
246 | // Data Members | |
247 | _Callback_list* _M_next; | |
248 | ios_base::event_callback _M_fn; | |
249 | int _M_index; | |
17325050 | 250 | _Atomic_word _M_refcount; // 0 means one reference. |
725dc051 BK |
251 | |
252 | _Callback_list(ios_base::event_callback __fn, int __index, | |
253 | _Callback_list* __cb) | |
254 | : _M_next(__cb), _M_fn(__fn), _M_index(__index), _M_refcount(0) { } | |
255 | ||
256 | void | |
17325050 AP |
257 | _M_add_reference() { __atomic_add(&_M_refcount, 1); } |
258 | ||
725dc051 | 259 | int |
17325050 AP |
260 | _M_remove_reference() { return __exchange_and_add(&_M_refcount, -1); } |
261 | // 0 => OK to delete | |
725dc051 BK |
262 | }; |
263 | ||
264 | _Callback_list* _M_callbacks; | |
265 | ||
266 | void | |
267 | _M_call_callbacks(event __ev) throw(); | |
268 | ||
269 | void | |
270 | _M_dispose_callbacks(void); | |
271 | ||
d9ab8adb | 272 | // 27.4.2.5 Members for iword/pword storage |
725dc051 BK |
273 | struct _Words |
274 | { | |
275 | void* _M_pword; | |
276 | long _M_iword; | |
277 | }; | |
278 | ||
279 | static const int _S_local_words = 8; | |
280 | _Words _M_word_array[_S_local_words]; // Guaranteed storage | |
281 | _Words _M_dummy; // Only for failed iword/pword calls. | |
282 | _Words* _M_words; | |
283 | int _M_word_limit; | |
284 | ||
285 | _Words& | |
286 | _M_grow_words(int __index); | |
287 | ||
288 | // Members for locale and locale caching. | |
289 | locale _M_ios_locale; | |
290 | ||
291 | void | |
292 | _M_init(); | |
293 | ||
294 | public: | |
d9ab8adb | 295 | |
725dc051 BK |
296 | // 27.4.2.1.6 Class ios_base::Init |
297 | // Used to initialize standard streams. In theory, g++ could use | |
298 | // -finit-priority to order this stuff correctly without going | |
299 | // through these machinations. | |
725dc051 BK |
300 | class Init |
301 | { | |
302 | friend class ios_base; | |
303 | public: | |
304 | Init(); | |
305 | ~Init(); | |
12764462 BK |
306 | |
307 | static void | |
308 | _S_ios_create(bool __sync); | |
309 | ||
310 | static void | |
311 | _S_ios_destroy(); | |
312 | ||
725dc051 BK |
313 | private: |
314 | static int _S_ios_base_init; | |
469550eb | 315 | static bool _S_synced_with_stdio; |
725dc051 BK |
316 | }; |
317 | ||
318 | // Fmtflags state: | |
319 | inline fmtflags | |
320 | flags() const { return _M_flags; } | |
321 | ||
322 | inline fmtflags | |
323 | flags(fmtflags __fmtfl) | |
324 | { | |
325 | fmtflags __old = _M_flags; | |
326 | _M_flags = __fmtfl; | |
327 | return __old; | |
328 | } | |
329 | ||
330 | inline fmtflags | |
331 | setf(fmtflags __fmtfl) | |
332 | { | |
333 | fmtflags __old = _M_flags; | |
334 | _M_flags |= __fmtfl; | |
335 | return __old; | |
336 | } | |
337 | ||
338 | inline fmtflags | |
339 | setf(fmtflags __fmtfl, fmtflags __mask) | |
340 | { | |
341 | fmtflags __old = _M_flags; | |
342 | _M_flags &= ~__mask; | |
343 | _M_flags |= (__fmtfl & __mask); | |
344 | return __old; | |
345 | } | |
346 | ||
347 | inline void | |
348 | unsetf(fmtflags __mask) { _M_flags &= ~__mask; } | |
349 | ||
350 | inline streamsize | |
351 | precision() const { return _M_precision; } | |
352 | ||
353 | inline streamsize | |
354 | precision(streamsize __prec) | |
355 | { | |
356 | streamsize __old = _M_precision; | |
357 | _M_precision = __prec; | |
358 | return __old; | |
359 | } | |
360 | ||
361 | inline streamsize | |
362 | width() const { return _M_width; } | |
363 | ||
364 | inline streamsize | |
365 | width(streamsize __wide) | |
366 | { | |
367 | streamsize __old = _M_width; | |
368 | _M_width = __wide; | |
369 | return __old; | |
370 | } | |
371 | ||
372 | static bool | |
373 | sync_with_stdio(bool __sync = true); | |
374 | ||
d9ab8adb | 375 | // Locales: |
725dc051 BK |
376 | locale |
377 | imbue(const locale& __loc); | |
378 | ||
379 | inline locale | |
380 | getloc() const { return _M_ios_locale; } | |
381 | ||
382 | // Storage: | |
383 | static int | |
384 | xalloc() throw(); | |
385 | ||
386 | inline long& | |
387 | iword(int __ix) | |
388 | { | |
389 | _Words& __word = (__ix < _M_word_limit) | |
390 | ? _M_words[__ix] : _M_grow_words(__ix); | |
391 | return __word._M_iword; | |
392 | } | |
393 | ||
394 | inline void*& | |
395 | pword(int __ix) | |
396 | { | |
397 | _Words& __word = (__ix < _M_word_limit) | |
398 | ? _M_words[__ix] : _M_grow_words(__ix); | |
399 | return __word._M_pword; | |
400 | } | |
401 | ||
402 | // Destructor | |
403 | ~ios_base(); | |
404 | ||
405 | protected: | |
406 | ios_base(); | |
407 | ||
408 | #ifdef _GLIBCPP_RESOLVE_LIB_DEFECTS | |
77cd227e | 409 | //50. Copy constructor and assignment operator of ios_base |
725dc051 BK |
410 | private: |
411 | ios_base(const ios_base&); | |
412 | ||
413 | ios_base& | |
414 | operator=(const ios_base&); | |
415 | #endif | |
416 | }; | |
417 | ||
418 | // 27.4.5.1 fmtflags manipulators: | |
419 | inline ios_base& | |
420 | boolalpha(ios_base& __base) | |
421 | { | |
422 | __base.setf(ios_base::boolalpha); | |
423 | return __base; | |
424 | } | |
425 | ||
426 | inline ios_base& | |
427 | noboolalpha(ios_base& __base) | |
428 | { | |
429 | __base.unsetf(ios_base::boolalpha); | |
430 | return __base; | |
431 | } | |
432 | ||
433 | inline ios_base& | |
434 | showbase(ios_base& __base) | |
435 | { | |
436 | __base.setf(ios_base::showbase); | |
437 | return __base; | |
438 | } | |
439 | ||
440 | inline ios_base& | |
441 | noshowbase(ios_base& __base) | |
442 | { | |
443 | __base.unsetf(ios_base::showbase); | |
444 | return __base; | |
445 | } | |
446 | ||
447 | inline ios_base& | |
448 | showpoint(ios_base& __base) | |
449 | { | |
450 | __base.setf(ios_base::showpoint); | |
451 | return __base; | |
452 | } | |
453 | ||
454 | inline ios_base& | |
455 | noshowpoint(ios_base& __base) | |
456 | { | |
457 | __base.unsetf(ios_base::showpoint); | |
458 | return __base; | |
459 | } | |
460 | ||
461 | inline ios_base& | |
462 | showpos(ios_base& __base) | |
463 | { | |
464 | __base.setf(ios_base::showpos); | |
465 | return __base; | |
466 | } | |
467 | ||
468 | inline ios_base& | |
469 | noshowpos(ios_base& __base) | |
470 | { | |
471 | __base.unsetf(ios_base::showpos); | |
472 | return __base; | |
473 | } | |
474 | ||
475 | inline ios_base& | |
476 | skipws(ios_base& __base) | |
477 | { | |
478 | __base.setf(ios_base::skipws); | |
479 | return __base; | |
480 | } | |
481 | ||
482 | inline ios_base& | |
483 | noskipws(ios_base& __base) | |
484 | { | |
485 | __base.unsetf(ios_base::skipws); | |
486 | return __base; | |
487 | } | |
488 | ||
489 | inline ios_base& | |
490 | uppercase(ios_base& __base) | |
491 | { | |
492 | __base.setf(ios_base::uppercase); | |
493 | return __base; | |
494 | } | |
495 | ||
496 | inline ios_base& | |
497 | nouppercase(ios_base& __base) | |
498 | { | |
499 | __base.unsetf(ios_base::uppercase); | |
500 | return __base; | |
501 | } | |
502 | ||
503 | inline ios_base& | |
504 | unitbuf(ios_base& __base) | |
505 | { | |
506 | __base.setf(ios_base::unitbuf); | |
507 | return __base; | |
508 | } | |
509 | ||
510 | inline ios_base& | |
511 | nounitbuf(ios_base& __base) | |
512 | { | |
513 | __base.unsetf(ios_base::unitbuf); | |
514 | return __base; | |
515 | } | |
516 | ||
517 | // 27.4.5.2 adjustfield anipulators: | |
518 | inline ios_base& | |
519 | internal(ios_base& __base) | |
520 | { | |
521 | __base.setf(ios_base::internal, ios_base::adjustfield); | |
522 | return __base; | |
523 | } | |
524 | ||
525 | inline ios_base& | |
526 | left(ios_base& __base) | |
527 | { | |
528 | __base.setf(ios_base::left, ios_base::adjustfield); | |
529 | return __base; | |
530 | } | |
531 | ||
532 | inline ios_base& | |
533 | right(ios_base& __base) | |
534 | { | |
535 | __base.setf(ios_base::right, ios_base::adjustfield); | |
536 | return __base; | |
537 | } | |
538 | ||
539 | // 27.4.5.3 basefield anipulators: | |
540 | inline ios_base& | |
541 | dec(ios_base& __base) | |
542 | { | |
543 | __base.setf(ios_base::dec, ios_base::basefield); | |
544 | return __base; | |
545 | } | |
546 | ||
547 | inline ios_base& | |
548 | hex(ios_base& __base) | |
549 | { | |
550 | __base.setf(ios_base::hex, ios_base::basefield); | |
551 | return __base; | |
552 | } | |
553 | ||
554 | inline ios_base& | |
555 | oct(ios_base& __base) | |
556 | { | |
557 | __base.setf(ios_base::oct, ios_base::basefield); | |
558 | return __base; | |
559 | } | |
560 | ||
561 | // 27.4.5.4 floatfield anipulators: | |
562 | inline ios_base& | |
563 | fixed(ios_base& __base) | |
564 | { | |
565 | __base.setf(ios_base::fixed, ios_base::floatfield); | |
566 | return __base; | |
567 | } | |
568 | ||
569 | inline ios_base& | |
570 | scientific(ios_base& __base) | |
571 | { | |
572 | __base.setf(ios_base::scientific, ios_base::floatfield); | |
573 | return __base; | |
574 | } | |
575 | ||
576 | } // namespace std | |
577 | ||
578 | #endif /* _CPP_BITS_IOSBASE_H */ | |
579 |