diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 825ef61500a..75d91b482c6 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,13 @@ +2000-07-31 Benjamin Kosnik + + * libio/fileops.cc: Update to current glibc sources. + * libio/genops.c: Same. + * libio/iofwide.c: Same. + * libio/libio.h: Same. + * libio/libioP.h: Same. + * libio/wfiledoalloc.c: Same. + * libio/wgenops.c: Same. + 2000-07-28 Alexandre Oliva * acinclude.m4: Include ../libtool.m4. diff --git a/libstdc++-v3/libio/fileops.c b/libstdc++-v3/libio/fileops.c index 122203e38bf..f3baa04519e 100644 --- a/libstdc++-v3/libio/fileops.c +++ b/libstdc++-v3/libio/fileops.c @@ -380,8 +380,7 @@ _IO_new_do_write (fp, data, to_do) const char *data; _IO_size_t to_do; { - return (to_do == 0 || new_do_write (fp, data, to_do) == to_do) - ? 0 : EOF; + return (to_do == 0 || new_do_write (fp, data, to_do) == to_do) ? 0 : EOF; } static diff --git a/libstdc++-v3/libio/genops.c b/libstdc++-v3/libio/genops.c index c27f314d44e..281bab0e717 100644 --- a/libstdc++-v3/libio/genops.c +++ b/libstdc++-v3/libio/genops.c @@ -45,11 +45,11 @@ _IO_un_link (fp) #ifdef _IO_MTSAFE_IO _IO_lock_lock (list_all_lock); #endif - for (f = &_IO_list_all; *f != NULL; f = &(*f)->file._chain) + for (f = &_IO_list_all; *f; f = (struct _IO_FILE_plus **) &(*f)->file._chain) { if (*f == fp) { - *f = fp->file._chain; + *f = (struct _IO_FILE_plus *) fp->file._chain; break; } } @@ -70,7 +70,7 @@ _IO_link_in (fp) #ifdef _IO_MTSAFE_IO _IO_lock_lock (list_all_lock); #endif - fp->file._chain = _IO_list_all; + fp->file._chain = (_IO_FILE *) _IO_list_all; _IO_list_all = fp; #ifdef _IO_MTSAFE_IO _IO_lock_unlock (list_all_lock); @@ -194,6 +194,9 @@ __overflow (f, ch) _IO_FILE *f; int ch; { + /* This is a single-byte stream. */ + if (f->_mode == 0) + _IO_fwide (f, -1); return _IO_OVERFLOW (f, ch); } @@ -287,6 +290,8 @@ __underflow (fp) return EOF; #endif + if (fp->_mode == 0) + _IO_fwide (fp, -1); if (_IO_in_put_mode (fp)) if (_IO_switch_to_get_mode (fp) == EOF) return EOF; @@ -317,6 +322,8 @@ __uflow (fp) return EOF; #endif + if (fp->_mode == 0) + _IO_fwide (fp, -11); if (_IO_in_put_mode (fp)) if (_IO_switch_to_get_mode (fp) == EOF) return EOF; @@ -745,17 +752,15 @@ int _IO_flush_all () { int result = 0; - struct _IO_FILE_plus *fp; - for (fp = _IO_list_all; fp != NULL; fp = fp->file._chain) - if (((fp->file._mode < 0 && fp->file._IO_write_ptr > fp->file._IO_write_base) + struct _IO_FILE *fp; + for (fp = (_IO_FILE *) _IO_list_all; fp; fp = fp->_chain) + if (((fp->_mode < 0 && fp->_IO_write_ptr > fp->_IO_write_base) #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T - - || (fp->file._vtable_offset == 0 - && fp->file._mode > 0 && (fp->file._wide_data->_IO_write_ptr - > fp->file._wide_data->_IO_write_base)) + || (fp->_vtable_offset == 0 + && fp->_mode > 0 && (fp->_wide_data->_IO_write_ptr + > fp->_wide_data->_IO_write_base))) #endif - ) - && _IO_OVERFLOW (&fp->file, EOF) == EOF) + && _IO_OVERFLOW (fp, EOF) == EOF) result = EOF; return result; } @@ -763,10 +768,10 @@ _IO_flush_all () void _IO_flush_all_linebuffered () { - struct _IO_FILE_plus *fp; - for (fp = _IO_list_all; fp != NULL; fp = fp->file._chain) - if ((fp->file._flags & _IO_NO_WRITES) == 0 && fp->file._flags & _IO_LINE_BUF) - _IO_OVERFLOW (&fp->file, EOF); + struct _IO_FILE *fp; + for (fp = (_IO_FILE *) _IO_list_all; fp; fp = fp->_chain) + if ((fp->_flags & _IO_NO_WRITES) == 0 && fp->_flags & _IO_LINE_BUF) + _IO_OVERFLOW (fp, EOF); } static void _IO_unbuffer_write __P ((void)); @@ -774,12 +779,12 @@ static void _IO_unbuffer_write __P ((void)); static void _IO_unbuffer_write () { - struct _IO_FILE_plus *fp; - for (fp = _IO_list_all; fp != NULL; fp = fp->file._chain) - if (! (fp->file._flags & _IO_UNBUFFERED) - && (! (fp->file._flags & _IO_NO_WRITES) - || (fp->file._flags & _IO_IS_APPENDING))) - _IO_SETBUF (&fp->file, NULL, 0); + struct _IO_FILE *fp; + for (fp = (_IO_FILE *) _IO_list_all; fp; fp = fp->_chain) + if (! (fp->_flags & _IO_UNBUFFERED) + && (! (fp->_flags & _IO_NO_WRITES) + || (fp->_flags & _IO_IS_APPENDING))) + _IO_SETBUF (fp, NULL, 0); } int @@ -1039,7 +1044,7 @@ _IO_default_imbue (fp, locale) _IO_ITER _IO_iter_begin() { - return _IO_list_all; + return (_IO_ITER) _IO_list_all; } _IO_ITER @@ -1052,14 +1057,14 @@ _IO_ITER _IO_iter_next(iter) _IO_ITER iter; { - return iter->file._chain; + return iter->_chain; } _IO_FILE * _IO_iter_file(iter) _IO_ITER iter; { - return (_IO_FILE *) iter; + return iter; } void diff --git a/libstdc++-v3/libio/iofwide.c b/libstdc++-v3/libio/iofwide.c index 39c7b02ee9d..5032ce5b771 100644 --- a/libstdc++-v3/libio/iofwide.c +++ b/libstdc++-v3/libio/iofwide.c @@ -35,6 +35,7 @@ # include # include # include +# include #endif @@ -76,6 +77,14 @@ struct _IO_codecvt __libio_codecvt = }; +/* static struct __gconv_trans_data libio_translit =*/ +#ifdef _LIBC +struct __gconv_trans_data libio_translit = +{ + .__trans_fct = __gconv_transliterate +}; +#endif + /* Return orientation of stream. If mode is nonzero try to change the orientation first. */ #undef _IO_fwide @@ -92,9 +101,6 @@ _IO_fwide (fp, mode) or the orientation already has been determined. */ return fp->_mode; - _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp); - _IO_flockfile (fp); - /* Set the orientation appropriately. */ if (mode > 0) { @@ -138,7 +144,11 @@ _IO_fwide (fp, mode) cc->__cd_out.__cd.__data[0].__statep = &fp->_wide_data->_IO_state; /* XXX For now no transliteration. */ +#ifdef _LIBC + cc->__cd_out.__cd.__data[0].__trans = &libio_translit; +#else cc->__cd_out.__cd.__data[0].__trans = NULL; +#endif } #else # ifdef _GLIBCPP_USE_WCHAR_T @@ -179,9 +189,6 @@ _IO_fwide (fp, mode) /* Set the mode now. */ fp->_mode = mode; - _IO_funlockfile (fp); - _IO_cleanup_region_end (0); - return mode; } diff --git a/libstdc++-v3/libio/libio.h b/libstdc++-v3/libio/libio.h index e9fb03e3e5b..7b3b2e1d611 100644 --- a/libstdc++-v3/libio/libio.h +++ b/libstdc++-v3/libio/libio.h @@ -259,8 +259,6 @@ struct _IO_wide_data #endif }; -struct _IO_FILE_plus; - struct _IO_FILE { int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ #define _IO_file_flags _flags @@ -282,7 +280,7 @@ struct _IO_FILE { struct _IO_marker *_markers; - struct _IO_FILE_plus *_chain; + struct _IO_FILE *_chain; int _fileno; int _blksize; @@ -324,6 +322,8 @@ struct _IO_FILE_complete typedef struct _IO_FILE _IO_FILE; #endif +struct _IO_FILE_plus; + extern struct _IO_FILE_plus _IO_2_1_stdin_; extern struct _IO_FILE_plus _IO_2_1_stdout_; extern struct _IO_FILE_plus _IO_2_1_stderr_; diff --git a/libstdc++-v3/libio/libioP.h b/libstdc++-v3/libio/libioP.h index a9681a3ec5d..b2a4ecf0634 100644 --- a/libstdc++-v3/libio/libioP.h +++ b/libstdc++-v3/libio/libioP.h @@ -323,7 +323,7 @@ struct _IO_cookie_file /* Iterator type for walking global linked list of _IO_FILE objects. */ -typedef struct _IO_FILE_plus *_IO_ITER; +typedef struct _IO_FILE *_IO_ITER; /* Generic functions */ @@ -714,19 +714,19 @@ extern int _IO_vscanf __P ((const char *, _IO_va_list)); # ifdef _IO_USE_OLD_IO_FILE # define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \ { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \ - 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock } + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \ + 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock } # else # if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \ { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \ 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD,\ NULL, WDP, 0 } # else # define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \ { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \ 0, _IO_pos_BAD, 0, 0, { 0 }, &_IO_stdfile_##FD##_lock, _IO_pos_BAD,\ 0 } # endif @@ -735,18 +735,19 @@ extern int _IO_vscanf __P ((const char *, _IO_va_list)); # ifdef _IO_USE_OLD_IO_FILE # define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \ { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, 0, _IO_pos_BAD } + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \ + 0, _IO_pos_BAD } # else # if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \ { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \ 0, _IO_pos_BAD, 0, 0, { 0 }, 0, _IO_pos_BAD, \ NULL, WDP, 0 } # else # define FILEBUF_LITERAL(CHAIN, FLAGS, FD, WDP) \ { _IO_MAGIC+_IO_LINKED+_IO_IS_FILEBUF+FLAGS, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, CHAIN, FD, \ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, (_IO_FILE *) CHAIN, FD, \ 0, _IO_pos_BAD, 0, 0, { 0 }, 0, _IO_pos_BAD, \ 0 } # endif diff --git a/libstdc++-v3/libio/wfiledoalloc.c b/libstdc++-v3/libio/wfiledoalloc.c index 7f5cb7f960b..4e4ca67b2d3 100644 --- a/libstdc++-v3/libio/wfiledoalloc.c +++ b/libstdc++-v3/libio/wfiledoalloc.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1997, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1997, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU IO Library. This library is free software; you can redistribute it and/or @@ -76,12 +76,13 @@ _IO_wfile_doallocate (fp) struct _G_stat64 st; /* Allocate room for the external buffer. */ - _IO_file_doallocate (fp); + if (fp->_IO_buf_base == NULL) + _IO_file_doallocate (fp); if (fp->_fileno < 0 || _IO_SYSSTAT (fp, &st) < 0) { couldbetty = 0; - size = _IO_BUFSIZ * sizeof (wchar_t); + size = _IO_BUFSIZ; #if 0 /* do not try to optimise fseek() */ fp->_flags |= __SNPT; @@ -91,13 +92,12 @@ _IO_wfile_doallocate (fp) { couldbetty = S_ISCHR (st.st_mode); #if _IO_HAVE_ST_BLKSIZE - size = ((st.st_blksize <= 0 ? _IO_BUFSIZ : st.st_blksize) - * sizeof (wchar_t)); + size = st.st_blksize <= 0 ? _IO_BUFSIZ : st.st_blksize; #else - size = _IO_BUFSIZ * sizeof (wchar_t); + size = _IO_BUFSIZ; #endif } - ALLOC_WBUF (p, size, EOF); + ALLOC_WBUF (p, size * sizeof (wchar_t), EOF); _IO_wsetb (fp, p, p + size, 1); if (couldbetty && isatty (fp->_fileno)) fp->_flags |= _IO_LINE_BUF; diff --git a/libstdc++-v3/libio/wfileops.c b/libstdc++-v3/libio/wfileops.c index ad46c7c9f78..e30bbe1f545 100644 --- a/libstdc++-v3/libio/wfileops.c +++ b/libstdc++-v3/libio/wfileops.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1995, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1993, 95, 97, 98, 99, 2000 Free Software Foundation, Inc. This file is part of the GNU IO Library. Written by Ulrich Drepper . Based on the single byte version by Per Bothner . @@ -77,40 +77,46 @@ _IO_wdo_write (fp, data, to_do) _IO_size_t to_do; { struct _IO_codecvt *cc = &fp->_wide_data->_codecvt; - _IO_size_t count = 0; - while (to_do > 0) + if (to_do > 0) { - enum __codecvt_result result; - const wchar_t *new_data; - - if (fp->_IO_write_end == fp->_IO_write_ptr) + if (fp->_IO_write_end == fp->_IO_write_ptr + && fp->_IO_write_end != fp->_IO_write_base) { - _IO_new_file_overflow (fp, EOF); - assert (fp->_IO_write_end > fp->_IO_write_ptr); + if (_IO_new_do_write (fp, fp->_IO_write_base, + fp->_IO_write_ptr - fp->_IO_write_base) == EOF) + return EOF; } - /* Now convert from the internal format into the external buffer. */ - result = (*cc->__codecvt_do_out) (cc, &fp->_wide_data->_IO_state, - data, data + to_do, &new_data, - fp->_IO_write_ptr, - fp->_IO_write_end, - &fp->_IO_write_ptr); + do + { + enum __codecvt_result result; + const wchar_t *new_data; - /* Write out what we produced so far. */ - if (_IO_new_do_write (fp, fp->_IO_write_base, - fp->_IO_write_ptr - fp->_IO_write_base) == EOF) - /* Something went wrong. */ - return EOF; + /* Now convert from the internal format into the external buffer. */ + result = (*cc->__codecvt_do_out) (cc, &fp->_wide_data->_IO_state, + data, data + to_do, &new_data, + fp->_IO_write_ptr, + fp->_IO_buf_end, + &fp->_IO_write_ptr); - count += new_data - data; - to_do -= new_data - data; - data = new_data; + /* Write out what we produced so far. */ + if (_IO_new_do_write (fp, fp->_IO_write_base, + fp->_IO_write_ptr - fp->_IO_write_base) == EOF) + /* Something went wrong. */ + return EOF; - /* Next see whether we had problems during the conversion. If yes, - we cannot go on. */ - if (result != __codecvt_ok) - break; + to_do -= new_data - data; + + /* Next see whether we had problems during the conversion. If yes, + we cannot go on. */ + if (result != __codecvt_ok + && (result != __codecvt_partial || new_data - data == 0)) + break; + + data = new_data; + } + while (to_do > 0); } _IO_wsetg (fp, fp->_wide_data->_IO_buf_base, fp->_wide_data->_IO_buf_base, @@ -121,7 +127,7 @@ _IO_wdo_write (fp, data, to_do) ? fp->_wide_data->_IO_buf_base : fp->_wide_data->_IO_buf_end); - return count; + return to_do == 0 ? 0 : WEOF; } @@ -190,9 +196,6 @@ _IO_wfile_underflow (fp) fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_read_end = fp->_IO_buf_base; - fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end = - fp->_IO_buf_base; - if (fp->_IO_buf_base == NULL) { /* Maybe we already have a push back pointer. */ @@ -202,8 +205,14 @@ _IO_wfile_underflow (fp) fp->_flags &= ~_IO_IN_BACKUP; } _IO_doallocbuf (fp); + + fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_read_end = + fp->_IO_buf_base; } + fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end = + fp->_IO_buf_base; + if (fp->_wide_data->_IO_buf_base == NULL) { /* Maybe we already have a push back pointer. */ @@ -222,11 +231,6 @@ _IO_wfile_underflow (fp) _IO_switch_to_get_mode (fp); - fp->_IO_read_base = fp->_IO_read_ptr = fp->_IO_buf_base; - fp->_IO_read_end = fp->_IO_buf_base; - fp->_IO_write_base = fp->_IO_write_ptr = fp->_IO_write_end - = fp->_IO_buf_base; - fp->_wide_data->_IO_read_base = fp->_wide_data->_IO_read_ptr = fp->_wide_data->_IO_buf_base; fp->_wide_data->_IO_read_end = fp->_wide_data->_IO_buf_base; @@ -306,6 +310,12 @@ _IO_wfile_overflow (f, wch) _IO_wdoallocbuf (f); _IO_wsetg (f, f->_wide_data->_IO_buf_base, f->_wide_data->_IO_buf_base, f->_wide_data->_IO_buf_base); + + if (f->_IO_write_base == NULL) + { + _IO_doallocbuf (f); + _IO_setg (f, f->_IO_buf_base, f->_IO_buf_base, f->_IO_buf_base); + } } else { @@ -330,13 +340,18 @@ _IO_wfile_overflow (f, wch) f->_wide_data->_IO_read_base = f->_wide_data->_IO_read_ptr = f->_wide_data->_IO_read_end; + f->_IO_write_ptr = f->_IO_read_ptr; + f->_IO_write_base = f->_IO_write_ptr; + f->_IO_write_end = f->_IO_buf_end; + f->_IO_read_base = f->_IO_read_ptr = f->_IO_read_end; + f->_flags |= _IO_CURRENTLY_PUTTING; if (f->_flags & (_IO_LINE_BUF+_IO_UNBUFFERED)) f->_wide_data->_IO_write_end = f->_wide_data->_IO_write_ptr; } if (wch == WEOF) return _IO_do_flush (f); - if (f->_wide_data->_IO_write_ptr == f->_wide_data->_IO_buf_end ) + if (f->_wide_data->_IO_write_ptr == f->_wide_data->_IO_buf_end) /* Buffer is really full */ if (_IO_do_flush (f) == WEOF) return WEOF; diff --git a/libstdc++-v3/libio/wgenops.c b/libstdc++-v3/libio/wgenops.c index 22a38f01ad7..7440e690b6a 100644 --- a/libstdc++-v3/libio/wgenops.c +++ b/libstdc++-v3/libio/wgenops.c @@ -275,6 +275,8 @@ __wunderflow (fp) if (fp->_mode < 0 || (fp->_mode == 0 && _IO_fwide (fp, 1) != 1)) return WEOF; + if (fp->_mode == 0) + _IO_fwide (fp, 1); if (_IO_in_put_mode (fp)) if (_IO_switch_to_wget_mode (fp) == EOF) return WEOF;