fileops.cc: Update to current glibc sources.

2000-07-31  Benjamin Kosnik  <bkoz@cygnus.com>

	* 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.

From-SVN: r35407
This commit is contained in:
Benjamin Kosnik 2000-08-01 07:44:11 +00:00 committed by Benjamin Kosnik
parent da92f7ff07
commit 18acf3baf1
9 changed files with 127 additions and 88 deletions

View File

@ -1,3 +1,13 @@
2000-07-31 Benjamin Kosnik <bkoz@cygnus.com>
* 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 <aoliva@redhat.com>
* acinclude.m4: Include ../libtool.m4.

View File

@ -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

View File

@ -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

View File

@ -35,6 +35,7 @@
# include <langinfo.h>
# include <locale/localeinfo.h>
# include <wcsmbs/wcsmbsload.h>
# include <iconv/gconv_int.h>
#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;
}

View File

@ -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_;

View File

@ -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

View File

@ -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;

View File

@ -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 <drepper@cygnus.com>.
Based on the single byte version by Per Bothner <bothner@cygnus.com>.
@ -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;

View File

@ -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;