1 /* Copyright (C) 1993, 1995, 1997-1999, 2000 Free Software Foundation, Inc.
2 This file is part of the GNU IO Library.
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License as
6 published by the Free Software Foundation; either version 2, or (at
7 your option) any later version.
9 This library is distributed in the hope that it will be useful, but
10 WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this library; see the file COPYING. If not, write to
16 the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19 As a special exception, if you link this library with files
20 compiled with a GNU compiler to produce an executable, this does
21 not cause the resulting executable to be covered by the GNU General
22 Public License. This exception does not however invalidate any
23 other reasons why the executable file might be covered by the GNU
24 General Public License. */
26 /* Generic or default I/O operations. */
35 static _IO_lock_t list_all_lock
= _IO_lock_initializer
;
42 if (fp
->_flags
& _IO_LINKED
)
46 _IO_lock_lock (list_all_lock
);
48 for (f
= &_IO_list_all
; *f
!= NULL
; f
= &(*f
)->_chain
)
57 _IO_lock_unlock (list_all_lock
);
59 fp
->_flags
&= ~_IO_LINKED
;
67 if ((fp
->_flags
& _IO_LINKED
) == 0)
69 fp
->_flags
|= _IO_LINKED
;
71 _IO_lock_lock (list_all_lock
);
73 fp
->_chain
= _IO_list_all
;
76 _IO_lock_unlock (list_all_lock
);
81 /* Return minimum _pos markers
82 Assumes the current get area is the main get area. */
83 _IO_ssize_t _IO_least_marker
__P ((_IO_FILE
*fp
, char *end_p
));
86 _IO_least_marker (fp
, end_p
)
90 _IO_ssize_t least_so_far
= end_p
- fp
->_IO_read_base
;
91 struct _IO_marker
*mark
;
92 for (mark
= fp
->_markers
; mark
!= NULL
; mark
= mark
->_next
)
93 if (mark
->_pos
< least_so_far
)
94 least_so_far
= mark
->_pos
;
98 /* Switch current get area from backup buffer to (start of) main get area. */
101 _IO_switch_to_main_get_area (fp
)
105 fp
->_flags
&= ~_IO_IN_BACKUP
;
106 /* Swap _IO_read_end and _IO_save_end. */
107 tmp
= fp
->_IO_read_end
;
108 fp
->_IO_read_end
= fp
->_IO_save_end
;
109 fp
->_IO_save_end
= tmp
;
110 /* Swap _IO_read_base and _IO_save_base. */
111 tmp
= fp
->_IO_read_base
;
112 fp
->_IO_read_base
= fp
->_IO_save_base
;
113 fp
->_IO_save_base
= tmp
;
114 /* Set _IO_read_ptr. */
115 fp
->_IO_read_ptr
= fp
->_IO_read_base
;
118 /* Switch current get area from main get area to (end of) backup area. */
121 _IO_switch_to_backup_area (fp
)
125 fp
->_flags
|= _IO_IN_BACKUP
;
126 /* Swap _IO_read_end and _IO_save_end. */
127 tmp
= fp
->_IO_read_end
;
128 fp
->_IO_read_end
= fp
->_IO_save_end
;
129 fp
->_IO_save_end
= tmp
;
130 /* Swap _IO_read_base and _IO_save_base. */
131 tmp
= fp
->_IO_read_base
;
132 fp
->_IO_read_base
= fp
->_IO_save_base
;
133 fp
->_IO_save_base
= tmp
;
134 /* Set _IO_read_ptr. */
135 fp
->_IO_read_ptr
= fp
->_IO_read_end
;
139 _IO_switch_to_get_mode (fp
)
142 if (fp
->_IO_write_ptr
> fp
->_IO_write_base
)
143 if (_IO_OVERFLOW (fp
, EOF
) == EOF
)
145 if (_IO_in_backup (fp
))
146 fp
->_IO_read_base
= fp
->_IO_backup_base
;
149 fp
->_IO_read_base
= fp
->_IO_buf_base
;
150 if (fp
->_IO_write_ptr
> fp
->_IO_read_end
)
151 fp
->_IO_read_end
= fp
->_IO_write_ptr
;
153 fp
->_IO_read_ptr
= fp
->_IO_write_ptr
;
155 fp
->_IO_write_base
= fp
->_IO_write_ptr
= fp
->_IO_write_end
= fp
->_IO_read_ptr
;
157 fp
->_flags
&= ~_IO_CURRENTLY_PUTTING
;
162 _IO_free_backup_area (fp
)
165 if (_IO_in_backup (fp
))
166 _IO_switch_to_main_get_area (fp
); /* Just in case. */
167 free (fp
->_IO_save_base
);
168 fp
->_IO_save_base
= NULL
;
169 fp
->_IO_save_end
= NULL
;
170 fp
->_IO_backup_base
= NULL
;
175 _IO_switch_to_put_mode (fp
)
178 fp
->_IO_write_base
= fp
->_IO_read_ptr
;
179 fp
->_IO_write_ptr
= fp
->_IO_read_ptr
;
180 /* Following is wrong if line- or un-buffered? */
181 fp
->_IO_write_end
= (fp
->_flags
& _IO_IN_BACKUP
182 ? fp
->_IO_read_end
: fp
->_IO_buf_end
);
184 fp
->_IO_read_ptr
= fp
->_IO_read_end
;
185 fp
->_IO_read_base
= fp
->_IO_read_end
;
187 fp
->_flags
|= _IO_CURRENTLY_PUTTING
;
197 return _IO_OVERFLOW (f
, ch
);
200 static int save_for_backup
__P ((_IO_FILE
*fp
, char *end_p
))
210 save_for_backup (fp
, end_p
)
214 /* Append [_IO_read_base..end_p] to backup area. */
215 _IO_ssize_t least_mark
= _IO_least_marker (fp
, end_p
);
216 /* needed_size is how much space we need in the backup area. */
217 _IO_size_t needed_size
= (end_p
- fp
->_IO_read_base
) - least_mark
;
218 /* FIXME: Dubious arithmetic if pointers are NULL */
219 _IO_size_t current_Bsize
= fp
->_IO_save_end
- fp
->_IO_save_base
;
220 _IO_size_t avail
; /* Extra space available for future expansion. */
222 struct _IO_marker
*mark
;
223 if (needed_size
> current_Bsize
)
227 new_buffer
= (char *) malloc (avail
+ needed_size
);
228 if (new_buffer
== NULL
)
229 return EOF
; /* FIXME */
233 __mempcpy (__mempcpy (new_buffer
+ avail
,
234 fp
->_IO_save_end
+ least_mark
,
237 end_p
- fp
->_IO_read_base
);
239 memcpy (new_buffer
+ avail
,
240 fp
->_IO_save_end
+ least_mark
,
242 memcpy (new_buffer
+ avail
- least_mark
,
244 end_p
- fp
->_IO_read_base
);
248 memcpy (new_buffer
+ avail
,
249 fp
->_IO_read_base
+ least_mark
,
251 if (fp
->_IO_save_base
)
252 free (fp
->_IO_save_base
);
253 fp
->_IO_save_base
= new_buffer
;
254 fp
->_IO_save_end
= new_buffer
+ avail
+ needed_size
;
258 avail
= current_Bsize
- needed_size
;
261 memmove (fp
->_IO_save_base
+ avail
,
262 fp
->_IO_save_end
+ least_mark
,
264 memcpy (fp
->_IO_save_base
+ avail
- least_mark
,
266 end_p
- fp
->_IO_read_base
);
268 else if (needed_size
> 0)
269 memcpy (fp
->_IO_save_base
+ avail
,
270 fp
->_IO_read_base
+ least_mark
,
273 fp
->_IO_backup_base
= fp
->_IO_save_base
+ avail
;
274 /* Adjust all the streammarkers. */
275 delta
= end_p
- fp
->_IO_read_base
;
276 for (mark
= fp
->_markers
; mark
!= NULL
; mark
= mark
->_next
)
285 if (fp
->_vtable_offset
== 0 && _IO_fwide (fp
, -1) != -1)
288 if (_IO_in_put_mode (fp
))
289 if (_IO_switch_to_get_mode (fp
) == EOF
)
291 if (fp
->_IO_read_ptr
< fp
->_IO_read_end
)
292 return *(unsigned char *) fp
->_IO_read_ptr
;
293 if (_IO_in_backup (fp
))
295 _IO_switch_to_main_get_area (fp
);
296 if (fp
->_IO_read_ptr
< fp
->_IO_read_end
)
297 return *(unsigned char *) fp
->_IO_read_ptr
;
299 if (_IO_have_markers (fp
))
301 if (save_for_backup (fp
, fp
->_IO_read_end
))
304 else if (_IO_have_backup (fp
))
305 _IO_free_backup_area (fp
);
306 return _IO_UNDERFLOW (fp
);
313 if (fp
->_vtable_offset
== 0 && _IO_fwide (fp
, -1) != -1)
316 if (_IO_in_put_mode (fp
))
317 if (_IO_switch_to_get_mode (fp
) == EOF
)
319 if (fp
->_IO_read_ptr
< fp
->_IO_read_end
)
320 return *(unsigned char *) fp
->_IO_read_ptr
++;
321 if (_IO_in_backup (fp
))
323 _IO_switch_to_main_get_area (fp
);
324 if (fp
->_IO_read_ptr
< fp
->_IO_read_end
)
325 return *(unsigned char *) fp
->_IO_read_ptr
++;
327 if (_IO_have_markers (fp
))
329 if (save_for_backup (fp
, fp
->_IO_read_end
))
332 else if (_IO_have_backup (fp
))
333 _IO_free_backup_area (fp
);
334 return _IO_UFLOW (fp
);
338 _IO_setb (f
, b
, eb
, a
)
344 if (f
->_IO_buf_base
&& !(f
->_flags
& _IO_USER_BUF
))
345 FREE_BUF (f
->_IO_buf_base
, _IO_blen (f
));
349 f
->_flags
&= ~_IO_USER_BUF
;
351 f
->_flags
|= _IO_USER_BUF
;
358 if (fp
->_IO_buf_base
)
360 if (!(fp
->_flags
& _IO_UNBUFFERED
))
361 if (_IO_DOALLOCATE (fp
) != EOF
)
363 _IO_setb (fp
, fp
->_shortbuf
, fp
->_shortbuf
+1, 0);
367 _IO_default_underflow (fp
)
374 _IO_default_uflow (fp
)
377 int ch
= _IO_UNDERFLOW (fp
);
380 return *(unsigned char *) fp
->_IO_read_ptr
++;
384 _IO_default_xsputn (f
, data
, n
)
389 const char *s
= (char *) data
;
395 /* Space available. */
396 _IO_ssize_t count
= f
->_IO_write_end
- f
->_IO_write_ptr
;
399 if ((_IO_size_t
) count
> more
)
404 f
->_IO_write_ptr
= __mempcpy (f
->_IO_write_ptr
, s
, count
);
406 memcpy (f
->_IO_write_ptr
, s
, count
);
407 f
->_IO_write_ptr
+= count
;
415 char *p
= f
->_IO_write_ptr
;
417 for (i
= count
; --i
>= 0; )
419 f
->_IO_write_ptr
= p
;
423 if (more
== 0 || _IO_OVERFLOW (f
, (unsigned char) *s
++) == EOF
)
431 _IO_sgetn (fp
, data
, n
)
436 /* FIXME handle putback buffer here! */
437 return _IO_XSGETN (fp
, data
, n
);
441 _IO_default_xsgetn (fp
, data
, n
)
447 char *s
= (char*) data
;
450 /* Data available. */
451 _IO_ssize_t count
= fp
->_IO_read_end
- fp
->_IO_read_ptr
;
454 if ((_IO_size_t
) count
> more
)
459 s
= __mempcpy (s
, fp
->_IO_read_ptr
, count
);
461 memcpy (s
, fp
->_IO_read_ptr
, count
);
464 fp
->_IO_read_ptr
+= count
;
470 char *p
= fp
->_IO_read_ptr
;
474 fp
->_IO_read_ptr
= p
;
478 if (more
== 0 || __underflow (fp
) == EOF
)
485 /* Seems not to be needed. --drepper */
495 _IO_default_setbuf (fp
, p
, len
)
500 if (_IO_SYNC (fp
) == EOF
)
502 if (p
== NULL
|| len
== 0)
504 fp
->_flags
|= _IO_UNBUFFERED
;
505 _IO_setb (fp
, fp
->_shortbuf
, fp
->_shortbuf
+1, 0);
509 fp
->_flags
&= ~_IO_UNBUFFERED
;
510 _IO_setb (fp
, p
, p
+len
, 0);
512 fp
->_IO_write_base
= fp
->_IO_write_ptr
= fp
->_IO_write_end
= 0;
513 fp
->_IO_read_base
= fp
->_IO_read_ptr
= fp
->_IO_read_end
= 0;
518 _IO_default_seekpos (fp
, pos
, mode
)
523 return _IO_SEEKOFF (fp
, pos
, 0, mode
);
527 _IO_default_doallocate (fp
)
532 ALLOC_BUF (buf
, _IO_BUFSIZ
, EOF
);
533 _IO_setb (fp
, buf
, buf
+_IO_BUFSIZ
, 1);
542 _IO_no_init (fp
, flags
, -1, NULL
, NULL
);
546 _IO_no_init (fp
, flags
, orientation
, wd
, jmp
)
550 struct _IO_wide_data
*wd
;
551 struct _IO_jump_t
*jmp
;
553 fp
->_flags
= _IO_MAGIC
|flags
;
554 fp
->_IO_buf_base
= NULL
;
555 fp
->_IO_buf_end
= NULL
;
556 fp
->_IO_read_base
= NULL
;
557 fp
->_IO_read_ptr
= NULL
;
558 fp
->_IO_read_end
= NULL
;
559 fp
->_IO_write_base
= NULL
;
560 fp
->_IO_write_ptr
= NULL
;
561 fp
->_IO_write_end
= NULL
;
562 fp
->_chain
= NULL
; /* Not necessary. */
564 fp
->_IO_save_base
= NULL
;
565 fp
->_IO_backup_base
= NULL
;
566 fp
->_IO_save_end
= NULL
;
570 fp
->_vtable_offset
= 0;
573 _IO_lock_init (*fp
->_lock
);
575 fp
->_mode
= orientation
;
576 if (orientation
>= 0)
579 fp
->_wide_data
->_IO_buf_base
= NULL
;
580 fp
->_wide_data
->_IO_buf_end
= NULL
;
581 fp
->_wide_data
->_IO_read_base
= NULL
;
582 fp
->_wide_data
->_IO_read_ptr
= NULL
;
583 fp
->_wide_data
->_IO_read_end
= NULL
;
584 fp
->_wide_data
->_IO_write_base
= NULL
;
585 fp
->_wide_data
->_IO_write_ptr
= NULL
;
586 fp
->_wide_data
->_IO_write_end
= NULL
;
587 fp
->_wide_data
->_IO_save_base
= NULL
;
588 fp
->_wide_data
->_IO_backup_base
= NULL
;
589 fp
->_wide_data
->_IO_save_end
= NULL
;
591 fp
->_wide_data
->_wide_vtable
= jmp
;
596 _IO_default_sync (fp
)
602 /* The way the C++ classes are mapped into the C functions in the
603 current implementation, this function can get called twice! */
606 _IO_default_finish (fp
, dummy
)
610 struct _IO_marker
*mark
;
611 if (fp
->_IO_buf_base
&& !(fp
->_flags
& _IO_USER_BUF
))
613 FREE_BUF (fp
->_IO_buf_base
, _IO_blen (fp
));
614 fp
->_IO_buf_base
= fp
->_IO_buf_end
= NULL
;
617 for (mark
= fp
->_markers
; mark
!= NULL
; mark
= mark
->_next
)
620 if (fp
->_IO_save_base
)
622 free (fp
->_IO_save_base
);
623 fp
->_IO_save_base
= NULL
;
627 _IO_lock_fini (*fp
->_lock
);
634 _IO_default_seekoff (fp
, offset
, dir
, mode
)
644 _IO_sputbackc (fp
, c
)
650 if (fp
->_IO_read_ptr
> fp
->_IO_read_base
651 && (unsigned char)fp
->_IO_read_ptr
[-1] == (unsigned char)c
)
654 result
= (unsigned char) c
;
657 result
= _IO_PBACKFAIL (fp
, c
);
660 fp
->_flags
&= ~_IO_EOF_SEEN
;
671 if (fp
->_IO_read_ptr
> fp
->_IO_read_base
)
674 result
= (unsigned char) *fp
->_IO_read_ptr
;
677 result
= _IO_PBACKFAIL (fp
, EOF
);
680 fp
->_flags
&= ~_IO_EOF_SEEN
;
685 #if 0 /* Work in progress */
686 /* Seems not to be needed. */
689 _IO_set_column (fp
, c
)
696 fp
->_column
= c
- (fp
->_IO_write_ptr
- fp
->_IO_write_base
);
700 _IO_set_column (fp
, i
)
704 fp
->_cur_column
= i
+ 1;
712 _IO_adjust_column (start
, line
, count
)
717 const char *ptr
= line
+ count
;
720 return line
+ count
- ptr
- 1;
721 return start
+ count
;
725 /* Seems not to be needed. --drepper */
731 return _IO_adjust_column (fp
->_cur_column
- 1,
733 fp
->_IO_write_ptr
- fp
->_IO_write_base
);
743 for (fp
= _IO_list_all
; fp
!= NULL
; fp
= fp
->_chain
)
744 if (((fp
->_mode
< 0 && fp
->_IO_write_ptr
> fp
->_IO_write_base
)
745 || (fp
->_vtable_offset
== 0
746 && fp
->_mode
> 0 && (fp
->_wide_data
->_IO_write_ptr
747 > fp
->_wide_data
->_IO_write_base
)))
748 && _IO_OVERFLOW (fp
, EOF
) == EOF
)
754 _IO_flush_all_linebuffered ()
757 for (fp
= _IO_list_all
; fp
!= NULL
; fp
= fp
->_chain
)
758 if ((fp
->_flags
& _IO_NO_WRITES
) == 0 && fp
->_flags
& _IO_LINE_BUF
)
759 _IO_OVERFLOW (fp
, EOF
);
762 static void _IO_unbuffer_write
__P ((void));
765 _IO_unbuffer_write ()
768 for (fp
= _IO_list_all
; fp
!= NULL
; fp
= fp
->_chain
)
769 if (! (fp
->_flags
& _IO_UNBUFFERED
)
770 && (! (fp
->_flags
& _IO_NO_WRITES
)
771 || (fp
->_flags
& _IO_IS_APPENDING
)))
772 _IO_SETBUF (fp
, NULL
, 0);
778 int result
= _IO_flush_all ();
780 /* We currently don't have a reliable mechanism for making sure that
781 C++ static destructors are executed in the correct order.
782 So it is possible that other static destructors might want to
783 write to cout - and they're supposed to be able to do so.
785 The following will make the standard streambufs be unbuffered,
786 which forces any output from late destructors to be written out. */
787 _IO_unbuffer_write ();
794 _IO_init_marker (marker
, fp
)
795 struct _IO_marker
*marker
;
799 if (_IO_in_put_mode (fp
))
800 _IO_switch_to_get_mode (fp
);
801 if (_IO_in_backup (fp
))
802 marker
->_pos
= fp
->_IO_read_ptr
- fp
->_IO_read_end
;
804 marker
->_pos
= fp
->_IO_read_ptr
- fp
->_IO_read_base
;
806 /* Should perhaps sort the chain? */
807 marker
->_next
= fp
->_markers
;
808 fp
->_markers
= marker
;
812 _IO_remove_marker (marker
)
813 struct _IO_marker
*marker
;
815 /* Unlink from sb's chain. */
816 struct _IO_marker
**ptr
= &marker
->_sbuf
->_markers
;
817 for (; ; ptr
= &(*ptr
)->_next
)
821 else if (*ptr
== marker
)
823 *ptr
= marker
->_next
;
828 if _sbuf has a backup area that is no longer needed
, should we
delete
829 it now
, or wait until the next underflow
?
833 #define BAD_DELTA EOF
836 _IO_marker_difference (mark1
, mark2
)
837 struct _IO_marker
*mark1
;
838 struct _IO_marker
*mark2
;
840 return mark1
->_pos
- mark2
->_pos
;
843 /* Return difference between MARK and current position of MARK's stream. */
845 _IO_marker_delta (mark
)
846 struct _IO_marker
*mark
;
849 if (mark
->_sbuf
== NULL
)
851 if (_IO_in_backup (mark
->_sbuf
))
852 cur_pos
= mark
->_sbuf
->_IO_read_ptr
- mark
->_sbuf
->_IO_read_end
;
854 cur_pos
= mark
->_sbuf
->_IO_read_ptr
- mark
->_sbuf
->_IO_read_base
;
855 return mark
->_pos
- cur_pos
;
859 _IO_seekmark (fp
, mark
, delta
)
861 struct _IO_marker
*mark
;
864 if (mark
->_sbuf
!= fp
)
868 if (_IO_in_backup (fp
))
869 _IO_switch_to_main_get_area (fp
);
870 fp
->_IO_read_ptr
= fp
->_IO_read_base
+ mark
->_pos
;
874 if (!_IO_in_backup (fp
))
875 _IO_switch_to_backup_area (fp
);
876 fp
->_IO_read_ptr
= fp
->_IO_read_end
+ mark
->_pos
;
882 _IO_unsave_markers (fp
)
885 struct _IO_marker
*mark
= fp
->_markers
;
889 streampos offset
= seekoff (0, ios::cur
, ios::in
);
892 offset
+= eGptr () - Gbase ();
893 for ( ; mark
!= NULL
; mark
= mark
->_next
)
894 mark
->set_streampos (mark
->_pos
+ offset
);
898 for ( ; mark
!= NULL
; mark
= mark
->_next
)
899 mark
->set_streampos (EOF
);
905 if (_IO_have_backup (fp
))
906 _IO_free_backup_area (fp
);
910 /* Seems not to be needed. --drepper */
912 _IO_nobackup_pbackfail (fp
, c
)
916 if (fp
->_IO_read_ptr
> fp
->_IO_read_base
)
918 if (c
!= EOF
&& *fp
->_IO_read_ptr
!= c
)
919 *fp
->_IO_read_ptr
= c
;
920 return (unsigned char) c
;
925 _IO_default_pbackfail (fp
, c
)
929 if (fp
->_IO_read_ptr
> fp
->_IO_read_base
&& !_IO_in_backup (fp
)
930 && (unsigned char) fp
->_IO_read_ptr
[-1] == c
)
934 /* Need to handle a filebuf in write mode (switch to read mode). FIXME!*/
935 if (!_IO_in_backup (fp
))
937 /* We need to keep the invariant that the main get area
938 logically follows the backup area. */
939 if (fp
->_IO_read_ptr
> fp
->_IO_read_base
&& _IO_have_backup (fp
))
941 if (save_for_backup (fp
, fp
->_IO_read_ptr
))
944 else if (!_IO_have_backup (fp
))
946 /* No backup buffer: allocate one. */
947 /* Use nshort buffer, if unused? (probably not) FIXME */
948 int backup_size
= 128;
949 char *bbuf
= (char *) malloc (backup_size
);
952 fp
->_IO_save_base
= bbuf
;
953 fp
->_IO_save_end
= fp
->_IO_save_base
+ backup_size
;
954 fp
->_IO_backup_base
= fp
->_IO_save_end
;
956 fp
->_IO_read_base
= fp
->_IO_read_ptr
;
957 _IO_switch_to_backup_area (fp
);
959 else if (fp
->_IO_read_ptr
<= fp
->_IO_read_base
)
961 /* Increase size of existing backup buffer. */
963 _IO_size_t old_size
= fp
->_IO_read_end
- fp
->_IO_read_base
;
965 new_size
= 2 * old_size
;
966 new_buf
= (char *) malloc (new_size
);
969 memcpy (new_buf
+ (new_size
- old_size
), fp
->_IO_read_base
,
971 free (fp
->_IO_read_base
);
972 _IO_setg (fp
, new_buf
, new_buf
+ (new_size
- old_size
),
974 fp
->_IO_backup_base
= fp
->_IO_read_ptr
;
977 *--fp
->_IO_read_ptr
= c
;
979 return (unsigned char) c
;
983 _IO_default_seek (fp
, offset
, dir
)
992 _IO_default_stat (fp
, st
)
1000 _IO_default_read (fp
, data
, n
)
1009 _IO_default_write (fp
, data
, n
)
1018 _IO_default_showmanyc (fp
)
1025 _IO_default_imbue (fp
, locale
)
1034 return _IO_list_all
;
1047 return iter
->_chain
;
1060 #ifdef _IO_MTSAFE_IO
1061 _IO_lock_lock (list_all_lock
);
1068 #ifdef _IO_MTSAFE_IO
1069 _IO_lock_unlock (list_all_lock
);
1074 _IO_list_resetlock()
1076 #ifdef _IO_MTSAFE_IO
1077 _IO_lock_init (list_all_lock
);
1084 #define IO_CLEANUP ;
1092 ~__io_defs() { _IO_cleanup (); }
1094 __io_defs io_defs__
;
1100 weak_alias (_IO_cleanup
, _cleanup
)
1103 #ifdef text_set_element
1104 text_set_element(__libc_atexit
, _cleanup
);