Message ID | cee6a6e4550535ac710797713d0ed5398beff6a4.1517872307.git.zackw@panix.com |
---|---|
State | New |
Headers | show |
Series | Don't install libio.h or _G_config.h. | expand |
On 05/02/2018 21:34, Zack Weinberg wrote: > In this patch, we stop installing libio.h and _G_config.h for public > use; necessarily, this means the public stdio.h stops including > libio.h. > > The public stdio.h had a genuine dependency on libio.h for the > complete definitions of FILE and cookie_io_functions_t, and a genuine > dependency on _G_config.h for the complete definitions of fpos_t and > fpos64_t; these are moved to single-type headers. > bits/types/struct_FILE.h also provides a handful of accessor and > bitflags macros so that code is not duplicated between bits/stdio.h > and libio.h. All the other _IO_ and _G_ names used by the public > stdio.h are replaced with either public names or __-names. > > In order to minimize the risk of breaking our own compatibility code, > bits/types/struct_FILE.h preserves the _IO_USE_OLD_IO_FILE mechanism > exactly as it was in libio.h, but you have to define _LIBC to use it, > or it'll error out. Similarly, _IO_lock_t_defined is preserved > exactly, but will error out if used without defining _LIBC. > > Internally, include/stdio.h continues to include libio.h, and libio.h > scrupulously provides every _IO_* and _G_* name that it always did, > perhaps now defined in terms of the public names. This is how this > patch avoids touching dozens of files throughout glibc and becoming > entangled with the _IO_MTSAFE_IO mess. The remaining patches in this > series eliminate most of the _G_ names. > > Installed stripped libraries are unchanged by this patch. It looks good to me, with just a couple of nits below (which do not block the patch itself). Bootstrap build with build-many-glibc.py for x86_64-linux-gnu at least is clean (although I do not think it uses any libio functionality). > > * libio/bits/types/__fpos_t.h, libio/bits/types/__fpos64_t.h: > New single-type headers split from _G_config.h. > * libio/bits/types/cookie_io_functions_t.h > * libio/bits/types/struct_FILE.h > New single-type headers split from libio.h. > > * libio/Makefile: Install the above new headers. Don't install > libio.h, _G_config.h, bits/libio.h, bits/_G_config.h, or > bits/libio-ldbl.h. > * libio/_G_config.h, libio/libio.h: Delete file. > > * libio/bits/libio.h: Remove improper-inclusion guard. > Include stdio.h and don't repeat anything that it does. > Define _IO_fpos_t as __fpos_t, _IO_fpos64_t as __fpos64_t, > _IO_BUFSIZ as BUFSIZ, _IO_va_list as __gnuc_va_list, > __io_read_fn as cookie_read_function_t, > __io_write_fn as cookie_write_function_t, > __io_seek_fn as cookie_seek_function_t, > __io_close_fn as cookie_close_function_t, > and _IO_cookie_io_functions_t as cookie_io_functions_t. > Define _STDIO_USES_IOSTREAM, __HAVE_COLUMN, and _IO_file_flags > here, in the "compatibility defines" section. Remove an #if 0 > block. Use the "body" macros from bits/types/struct_FILE.h to > define _IO_getc_unlocked, _IO_putc_unlocked, _IO_feof_unlocked, > and _IO_ferror_unlocked. > Move prototypes of __uflow and __overflow... > > * libio/stdio.h: ...here. Don't include bits/libio.h. > Don't define _STDIO_USES_IOSTREAM. Get __gnuc_va_list > directly from stdarg.h. Include bits/types/__fpos_t.h, > bits/types/__fpos64_t.h, bits/types/struct_FILE.h, > and, when __USE_GNU, bits/types/cookie_io_functions_t.h. > Use __gnuc_va_list, not _G_va_list; __fpos_t, not _G_fpos_t; > __fpos64_t, not _G_fpos64_t; FILE, not struct _IO_FILE; > cookie_io_functions_t, not _IO_cookie_io_functions_t; > __ssize_t, not _IO_ssize_t. Unconditionally define > BUFSIZ as 8192 and EOF as (-1). > > * libio/bits/stdio.h: Add multiple-include guard. Use the "body" > macros from bits/types/struct_FILE.h instead of _IO_* macros > from libio.h; use __gnuc_va_list instead of va_list and __ssize_t > instead of _IO_ssize_t. > * libio/bits/stdio2.h: Similarly. > > * libio/iolibio.h: Add multiple-include guard. > Include bits/libio.h after stdio.h. > * libio/libioP.h: Add multiple-include guard. > Include stdio.h and bits/libio.h before iolibio.h. > > * include/bits/types/__fpos_t.h, include/bits/types/__fpos64_t.h > * include/bits/types/cookie_io_functions_t.h > * include/bits/types/struct_FILE.h: New wrappers. > > * bits/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h: > Get definitions of _G_fpos_t and _G_fpos64_t from > bits/types/__fpos_t.h and bits/types/__fpos64_t.h > respectively. Remove improper-inclusion guards. > > * conform/data/stdio.h-data: Update expectations of va_list. > * scripts/check-installed-headers.sh: Remove special case for > libio.h and _G_config.h. > --- > NEWS | 4 +- > bits/_G_config.h | 20 +-- > conform/data/stdio.h-data | 2 +- > include/bits/types/__fpos64_t.h | 1 + > include/bits/types/__fpos_t.h | 1 + > include/bits/types/cookie_io_functions_t.h | 1 + > include/bits/types/struct_FILE.h | 1 + > include/stdio.h | 5 + > libio/Makefile | 9 +- > libio/_G_config.h | 25 ---- > libio/bits/libio.h | 194 ++++------------------------- > libio/bits/stdio.h | 29 +++-- > libio/bits/stdio2.h | 35 +++--- > libio/bits/types/__fpos64_t.h | 16 +++ > libio/bits/types/__fpos_t.h | 16 +++ > libio/bits/types/cookie_io_functions_t.h | 46 +++++++ > libio/bits/types/struct_FILE.h | 120 ++++++++++++++++++ > libio/iolibio.h | 6 + > libio/libio.h | 25 ---- > libio/libioP.h | 7 ++ > libio/stdio.h | 95 +++++++------- > scripts/check-installed-headers.sh | 5 - > sysdeps/unix/sysv/linux/bits/_G_config.h | 20 +-- > 23 files changed, 350 insertions(+), 333 deletions(-) > create mode 100644 include/bits/types/__fpos64_t.h > create mode 100644 include/bits/types/__fpos_t.h > create mode 100644 include/bits/types/cookie_io_functions_t.h > create mode 100644 include/bits/types/struct_FILE.h > delete mode 100644 libio/_G_config.h > create mode 100644 libio/bits/types/__fpos64_t.h > create mode 100644 libio/bits/types/__fpos_t.h > create mode 100644 libio/bits/types/cookie_io_functions_t.h > create mode 100644 libio/bits/types/struct_FILE.h > delete mode 100644 libio/libio.h > > diff --git a/NEWS b/NEWS > index eceab2b2be2..87a3f1d1cd8 100644 > --- a/NEWS > +++ b/NEWS > @@ -13,7 +13,9 @@ Major new features: > > Deprecated and removed features, and other changes affecting compatibility: > > - [Add deprecations, removals and changes affecting compatibility here] > + * The nonstandard header files <libio.h> and <_G_config.h> are no longer > + installed. Software that was using either header should be updated to > + use standard <stdio.h> interfaces instead. > > * The stdio.h functions 'getc' and 'putc' are no longer defined as macros. > This was never required by the C standard, and the macros just expanded > diff --git a/bits/_G_config.h b/bits/_G_config.h > index 2b60d29f5ff..8c81bc42787 100644 > --- a/bits/_G_config.h > +++ b/bits/_G_config.h > @@ -4,10 +4,6 @@ > #ifndef _BITS_G_CONFIG_H > #define _BITS_G_CONFIG_H 1 > > -#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H > -# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead." > -#endif > - Ok. > /* Define types for libio in terms of the standard internal type names. */ > > #include <bits/types.h> > @@ -19,20 +15,16 @@ > #include <stddef.h> > > #include <bits/types/__mbstate_t.h> > +#include <bits/types/__fpos_t.h> > +#include <bits/types/__fpos64_t.h> > + > +#define _G_fpos_t __fpos_t > +#define _G_fpos64_t __fpos64_t > + > #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T > # include <bits/types/wint_t.h> > #endif > > -typedef struct > -{ > - __off_t __pos; > - __mbstate_t __state; > -} _G_fpos_t; > -typedef struct > -{ > - __off64_t __pos; > - __mbstate_t __state; > -} _G_fpos64_t; > #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T > # include <gconv.h> > typedef union > diff --git a/conform/data/stdio.h-data b/conform/data/stdio.h-data > index f69802cc703..3ef24606610 100644 > --- a/conform/data/stdio.h-data > +++ b/conform/data/stdio.h-data > @@ -41,7 +41,7 @@ type fpos_t > #if !defined ISO && !defined ISO99 && !defined ISO11 && !defined POSIX > type va_list > #else > -#define va_list _G_va_list > +#define va_list > #endif > type size_t > #if defined XOPEN2K8 || defined POSIX2008 > diff --git a/include/bits/types/__fpos64_t.h b/include/bits/types/__fpos64_t.h > new file mode 100644 > index 00000000000..68cc4e8b66c > --- /dev/null > +++ b/include/bits/types/__fpos64_t.h > @@ -0,0 +1 @@ > +#include <libio/bits/types/__fpos64_t.h> > diff --git a/include/bits/types/__fpos_t.h b/include/bits/types/__fpos_t.h > new file mode 100644 > index 00000000000..2dcdc98d750 > --- /dev/null > +++ b/include/bits/types/__fpos_t.h > @@ -0,0 +1 @@ > +#include <libio/bits/types/__fpos_t.h> > diff --git a/include/bits/types/cookie_io_functions_t.h b/include/bits/types/cookie_io_functions_t.h > new file mode 100644 > index 00000000000..87f7930c6ec > --- /dev/null > +++ b/include/bits/types/cookie_io_functions_t.h > @@ -0,0 +1 @@ > +#include <libio/bits/types/cookie_io_functions_t.h> > diff --git a/include/bits/types/struct_FILE.h b/include/bits/types/struct_FILE.h > new file mode 100644 > index 00000000000..971407292be > --- /dev/null > +++ b/include/bits/types/struct_FILE.h > @@ -0,0 +1 @@ > +#include <libio/bits/types/struct_FILE.h> > diff --git a/include/stdio.h b/include/stdio.h > index f1e987ae5e3..3b6da17d82f 100644 > --- a/include/stdio.h > +++ b/include/stdio.h > @@ -1,6 +1,11 @@ > #ifndef _STDIO_H > +# if !defined _ISOMAC && defined _IO_MTSAFE_IO > +# include <stdio-lock.h> > +# endif > # include <libio/stdio.h> > # ifndef _ISOMAC > +# define _LIBC_STDIO_H 1 > +# include <bits/libio.h> > > /* Now define the internal interfaces. */ > > diff --git a/libio/Makefile b/libio/Makefile > index 918a86bb743..3e08ed0eeb0 100644 > --- a/libio/Makefile > +++ b/libio/Makefile > @@ -22,10 +22,11 @@ subdir := libio > > include ../Makeconfig > > -headers := stdio.h libio.h _G_config.h \ > - bits/stdio.h bits/libio.h bits/_G_config.h \ > - bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h \ > - bits/types/FILE.h bits/types/__FILE.h > +headers := stdio.h \ > + bits/stdio.h bits/stdio2.h bits/sys_errlist.h bits/stdio-ldbl.h \ > + bits/types/FILE.h bits/types/__FILE.h bits/types/struct_FILE.h \ > + bits/types/__fpos_t.h bits/types/__fpos64_t.h \ > + bits/types/cookie_io_functions_t.h Ok. > > routines := \ > filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen \ > diff --git a/libio/_G_config.h b/libio/_G_config.h > deleted file mode 100644 > index 68de2fcaa0d..00000000000 > --- a/libio/_G_config.h > +++ /dev/null > @@ -1,25 +0,0 @@ > -/* Copyright (C) 2017-2018 Free Software Foundation, Inc. > - This file is part of the GNU C Library. > - > - The GNU C Library is free software; you can redistribute it and/or > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library; if not, see > - <http://www.gnu.org/licenses/>. */ > - > -#ifndef _G_CONFIG_H > -#define _G_CONFIG_H 1 > - > -#warning "<_G_config.h> is deprecated; use <stdio.h> instead." > - > -#include <bits/_G_config.h> > - > -#endif Ok. > diff --git a/libio/bits/libio.h b/libio/bits/libio.h > index fae5b932a1f..cefc2c855b9 100644 > --- a/libio/bits/libio.h > +++ b/libio/bits/libio.h > @@ -28,14 +28,12 @@ > #ifndef _BITS_LIBIO_H > #define _BITS_LIBIO_H 1 > > -#if !defined _STDIO_H && !defined _LIBIO_H > -# error "Never include <bits/libio.h> directly; use <stdio.h> instead." > -#endif > +#include <stdio.h> Ok. > > #include <bits/_G_config.h> > /* ALL of these should be defined in _G_config.h */ > -#define _IO_fpos_t _G_fpos_t > -#define _IO_fpos64_t _G_fpos64_t > +#define _IO_fpos_t __fpos_t > +#define _IO_fpos64_t __fpos64_t > #define _IO_size_t size_t > #define _IO_ssize_t __ssize_t > #define _IO_off_t __off_t > @@ -44,40 +42,17 @@ > #define _IO_uid_t __uid_t > #define _IO_iconv_t _G_iconv_t > #define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE > -#define _IO_BUFSIZ _G_BUFSIZ > -#define _IO_va_list _G_va_list > +#define _IO_BUFSIZ BUFSIZ > #define _IO_wint_t wint_t > +#define _IO_va_list __gnuc_va_list > > -/* This define avoids name pollution if we're using GNU stdarg.h */ > -#define __need___va_list > -#include <stdarg.h> > -#ifdef __GNUC_VA_LIST > -# undef _IO_va_list > -# define _IO_va_list __gnuc_va_list > -#endif /* __GNUC_VA_LIST */ > - > -#ifndef __P > -# include <sys/cdefs.h> > -#endif /*!__P*/ > - > +/* compatibility defines */ > +#define _STDIO_USES_IOSTREAM > #define _IO_UNIFIED_JUMPTABLES 1 > +#define __HAVE_COLUMN > +#define _IO_file_flags _flags > > -#ifndef EOF > -# define EOF (-1) > -#endif > -#ifndef NULL > -# if defined __GNUG__ && \ > - (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)) > -# define NULL (__null) > -# else > -# if !defined(__cplusplus) > -# define NULL ((void*)0) > -# else > -# define NULL (0) > -# endif > -# endif > -#endif > - > +/* open modes */ > #define _IOS_INPUT 1 > #define _IOS_OUTPUT 2 > #define _IOS_ATEND 4 > @@ -146,14 +121,7 @@ > #define _IO_BOOLALPHA 0200000 > > > -struct _IO_jump_t; struct _IO_FILE; > - > -/* During the build of glibc itself, _IO_lock_t will already have been > - defined by internal headers. */ > -#ifndef _IO_lock_t_defined > -typedef void _IO_lock_t; > -#endif > - > +struct _IO_jump_t; > > /* A streammarker remembers a position in a buffer. */ > > @@ -164,16 +132,6 @@ struct _IO_marker { > it points to _buf->Gbase()+_pos. FIXME comment */ > /* if _pos < 0, it points to _buf->eBptr()+_pos. FIXME comment */ > int _pos; > -#if 0 > - void set_streampos(streampos sp) { _spos = sp; } > - void set_offset(int offset) { _pos = offset; _spos = (streampos)(-2); } > - public: > - streammarker(streambuf *sb); > - ~streammarker(); > - int saving() { return _spos == -2; } > - int delta(streammarker&); > - int delta(); > -#endif > }; Ok. > > /* This is the structure from the libstdc++ codecvt class. */ > @@ -242,73 +200,6 @@ struct _IO_wide_data > }; > #endif > > -struct _IO_FILE { > - int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ > -#define _IO_file_flags _flags > - > - /* The following pointers correspond to the C++ streambuf protocol. */ > - /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */ > - char* _IO_read_ptr; /* Current read pointer */ > - char* _IO_read_end; /* End of get area. */ > - char* _IO_read_base; /* Start of putback+get area. */ > - char* _IO_write_base; /* Start of put area. */ > - char* _IO_write_ptr; /* Current put pointer. */ > - char* _IO_write_end; /* End of put area. */ > - char* _IO_buf_base; /* Start of reserve area. */ > - char* _IO_buf_end; /* End of reserve area. */ > - /* The following fields are used to support backing up and undo. */ > - char *_IO_save_base; /* Pointer to start of non-current get area. */ > - char *_IO_backup_base; /* Pointer to first valid character of backup area */ > - char *_IO_save_end; /* Pointer to end of non-current get area. */ > - > - struct _IO_marker *_markers; > - > - struct _IO_FILE *_chain; > - > - int _fileno; > -#if 0 > - int _blksize; > -#else > - int _flags2; > -#endif > - _IO_off_t _old_offset; /* This used to be _offset but it's too small. */ > - > -#define __HAVE_COLUMN /* temporary */ > - /* 1+column number of pbase(); 0 is unknown. */ > - unsigned short _cur_column; > - signed char _vtable_offset; > - char _shortbuf[1]; > - > - /* char* _save_gptr; char* _save_egptr; */ > - > - _IO_lock_t *_lock; > -#ifdef _IO_USE_OLD_IO_FILE > -}; > - > -struct _IO_FILE_complete > -{ > - struct _IO_FILE _file; > -#endif > -#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001 > - _IO_off64_t _offset; > -# if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T > - /* Wide character stream stuff. */ > - struct _IO_codecvt *_codecvt; > - struct _IO_wide_data *_wide_data; > - struct _IO_FILE *_freeres_list; > - void *_freeres_buf; > -# else > - void *__pad1; > - void *__pad2; > - void *__pad3; > - void *__pad4; > -# endif > - size_t __pad5; > - int _mode; > - /* Make sure we don't get into trouble again. */ > - char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; > -#endif > -}; Ok. > > #ifndef __cplusplus > typedef struct _IO_FILE _IO_FILE; > @@ -330,49 +221,13 @@ extern _IO_FILE *_IO_stderr attribute_hidden; > #endif > > > -/* Functions to do I/O and file management for a stream. */ > - > -/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF. > - Return number of bytes read. */ > -typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); > - > -/* Write N bytes pointed to by BUF to COOKIE. Write all N bytes > - unless there is an error. Return number of bytes written. If > - there is an error, return 0 and do not write anything. If the file > - has been opened for append (__mode.__append set), then set the file > - pointer to the end of the file and then do the write; if not, just > - write at the current file pointer. */ > -typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, > - size_t __n); > - > -/* Move COOKIE's file position to *POS bytes from the > - beginning of the file (if W is SEEK_SET), > - the current position (if W is SEEK_CUR), > - or the end of the file (if W is SEEK_END). > - Set *POS to the new file position. > - Returns zero if successful, nonzero if not. */ > -typedef int __io_seek_fn (void *__cookie, _IO_off64_t *__pos, int __w); > - > -/* Close COOKIE. */ > -typedef int __io_close_fn (void *__cookie); > - > - > +/* Compatibility names for cookie I/O functions. */ > #ifdef __USE_GNU > -/* User-visible names for the above. */ > -typedef __io_read_fn cookie_read_function_t; > -typedef __io_write_fn cookie_write_function_t; > -typedef __io_seek_fn cookie_seek_function_t; > -typedef __io_close_fn cookie_close_function_t; > - > -/* The structure with the cookie function pointers. */ > -typedef struct > -{ > - __io_read_fn *read; /* Read bytes. */ > - __io_write_fn *write; /* Write bytes. */ > - __io_seek_fn *seek; /* Seek/tell file position. */ > - __io_close_fn *close; /* Close file. */ > -} _IO_cookie_io_functions_t; > -typedef _IO_cookie_io_functions_t cookie_io_functions_t; Ok. > +typedef cookie_read_function_t __io_read_fn; > +typedef cookie_write_function_t __io_write_fn; > +typedef cookie_seek_function_t __io_seek_fn; > +typedef cookie_close_function_t __io_close_fn; > +typedef cookie_io_functions_t _IO_cookie_io_functions_t; Ok. > > struct _IO_cookie_file; > > @@ -387,8 +242,6 @@ extern "C" { > #endif > > extern int __underflow (_IO_FILE *); > -extern int __uflow (_IO_FILE *); > -extern int __overflow (_IO_FILE *, int); > #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T > extern _IO_wint_t __wunderflow (_IO_FILE *); > extern _IO_wint_t __wuflow (_IO_FILE *); > @@ -401,17 +254,12 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); > # define _IO_BE(expr, res) (expr) > #endif > > -#define _IO_getc_unlocked(_fp) \ > - (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \ > - ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++) > +#define _IO_getc_unlocked(_fp) __getc_unlocked_body (_fp) > #define _IO_peekc_unlocked(_fp) \ > (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \ > && __underflow (_fp) == EOF ? EOF \ > : *(unsigned char *) (_fp)->_IO_read_ptr) > -#define _IO_putc_unlocked(_ch, _fp) \ > - (_IO_BE ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end, 0) \ > - ? __overflow (_fp, (unsigned char) (_ch)) \ > - : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch))) > +#define _IO_putc_unlocked(_ch, _fp) __putc_unlocked_body (_ch, _fp) > > #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T > # define _IO_getwc_unlocked(_fp) \ > @@ -427,8 +275,8 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); > : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++ = (_wch))) > #endif > > -#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0) > -#define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0) > +#define _IO_feof_unlocked(_fp) __feof_unlocked_body (_fp) > +#define _IO_ferror_unlocked(_fp) __ferror_unlocked_body (_fp) Ok. > > extern int _IO_getc (_IO_FILE *__fp); > extern int _IO_putc (int __c, _IO_FILE *__fp); > diff --git a/libio/bits/stdio.h b/libio/bits/stdio.h > index eb42b22153c..4ab919031f7 100644 > --- a/libio/bits/stdio.h > +++ b/libio/bits/stdio.h > @@ -16,6 +16,9 @@ > License along with the GNU C Library; if not, see > <http://www.gnu.org/licenses/>. */ > > +#ifndef _BITS_STDIO_H > +#define _BITS_STDIO_H 1 > + > #ifndef _STDIO_H > # error "Never include <bits/stdio.h> directly; use <stdio.h> instead." > #endif > @@ -33,7 +36,7 @@ > # if !(__USE_FORTIFY_LEVEL > 0 && defined __fortify_function) > /* Write formatted output to stdout from argument list ARG. */ > __STDIO_INLINE int > -vprintf (const char *__restrict __fmt, _G_va_list __arg) > +vprintf (const char *__restrict __fmt, __gnuc_va_list __arg) > { > return vfprintf (stdout, __fmt, __arg); > } > @@ -52,7 +55,7 @@ getchar (void) > __STDIO_INLINE int > fgetc_unlocked (FILE *__fp) > { > - return _IO_getc_unlocked (__fp); > + return __getc_unlocked_body (__fp); > } > # endif /* misc */ > > @@ -62,14 +65,14 @@ fgetc_unlocked (FILE *__fp) > __STDIO_INLINE int > getc_unlocked (FILE *__fp) > { > - return _IO_getc_unlocked (__fp); > + return __getc_unlocked_body (__fp); > } > > /* This is defined in POSIX.1:1996. */ > __STDIO_INLINE int > getchar_unlocked (void) > { > - return _IO_getc_unlocked (stdin); > + return __getc_unlocked_body (stdin); > } > # endif /* POSIX */ > > @@ -87,7 +90,7 @@ putchar (int __c) > __STDIO_INLINE int > fputc_unlocked (int __c, FILE *__stream) > { > - return _IO_putc_unlocked (__c, __stream); > + return __putc_unlocked_body (__c, __stream); > } > # endif /* misc */ > > @@ -97,21 +100,21 @@ fputc_unlocked (int __c, FILE *__stream) > __STDIO_INLINE int > putc_unlocked (int __c, FILE *__stream) > { > - return _IO_putc_unlocked (__c, __stream); > + return __putc_unlocked_body (__c, __stream); > } > > /* This is defined in POSIX.1:1996. */ > __STDIO_INLINE int > putchar_unlocked (int __c) > { > - return _IO_putc_unlocked (__c, stdout); > + return __putc_unlocked_body (__c, stdout); > } > # endif /* POSIX */ > > > # ifdef __USE_GNU > /* Like `getdelim', but reads up to a newline. */ > -__STDIO_INLINE _IO_ssize_t > +__STDIO_INLINE __ssize_t > getline (char **__lineptr, size_t *__n, FILE *__stream) > { > return __getdelim (__lineptr, __n, '\n', __stream); > @@ -124,14 +127,14 @@ getline (char **__lineptr, size_t *__n, FILE *__stream) > __STDIO_INLINE int > __NTH (feof_unlocked (FILE *__stream)) > { > - return _IO_feof_unlocked (__stream); > + return __feof_unlocked_body (__stream); > } > > /* Faster versions when locking is not required. */ > __STDIO_INLINE int > __NTH (ferror_unlocked (FILE *__stream)) > { > - return _IO_ferror_unlocked (__stream); > + return __ferror_unlocked_body (__stream); > } > # endif /* misc */ > > @@ -151,7 +154,7 @@ __NTH (ferror_unlocked (FILE *__stream)) > for (__cnt = (size_t) (size) * (size_t) (n); \ > __cnt > 0; --__cnt) \ > { \ > - int __c = _IO_getc_unlocked (__stream); \ > + int __c = getc_unlocked (__stream); \ > if (__c == EOF) \ > break; \ > *__ptr++ = __c; \ > @@ -174,7 +177,7 @@ __NTH (ferror_unlocked (FILE *__stream)) > size_t __cnt; \ > for (__cnt = (size_t) (size) * (size_t) (n); \ > __cnt > 0; --__cnt) \ > - if (_IO_putc_unlocked (*__ptr++, __stream) == EOF) \ > + if (putc_unlocked (*__ptr++, __stream) == EOF) \ > break; \ > ((size_t) (size) * (size_t) (n) - __cnt) \ > / (size_t) (size); }) \ > @@ -188,3 +191,5 @@ __NTH (ferror_unlocked (FILE *__stream)) > > /* Define helper macro. */ > #undef __STDIO_INLINE > + > +#endif /* bits/stdio.h. */ Ok. > diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h > index 55302e91d0d..11651506a67 100644 > --- a/libio/bits/stdio2.h > +++ b/libio/bits/stdio2.h > @@ -16,6 +16,9 @@ > License along with the GNU C Library; if not, see > <http://www.gnu.org/licenses/>. */ > > +#ifndef _BITS_STDIO2_H > +#define _BITS_STDIO2_H 1 > + > #ifndef _STDIO_H > # error "Never include <bits/stdio2.h> directly; use <stdio.h> instead." > #endif > @@ -24,7 +27,7 @@ extern int __sprintf_chk (char *__restrict __s, int __flag, size_t __slen, > const char *__restrict __format, ...) __THROW; > extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen, > const char *__restrict __format, > - _G_va_list __ap) __THROW; > + __gnuc_va_list __ap) __THROW; > > #ifdef __va_arg_pack > __fortify_function int > @@ -41,7 +44,7 @@ __NTH (sprintf (char *__restrict __s, const char *__restrict __fmt, ...)) > > __fortify_function int > __NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt, > - _G_va_list __ap)) > + __gnuc_va_list __ap)) > { > return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1, > __bos (__s), __fmt, __ap); > @@ -54,7 +57,7 @@ extern int __snprintf_chk (char *__restrict __s, size_t __n, int __flag, > ...) __THROW; > extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag, > size_t __slen, const char *__restrict __format, > - _G_va_list __ap) __THROW; > + __gnuc_va_list __ap) __THROW; > > # ifdef __va_arg_pack > __fortify_function int > @@ -72,7 +75,7 @@ __NTH (snprintf (char *__restrict __s, size_t __n, > > __fortify_function int > __NTH (vsnprintf (char *__restrict __s, size_t __n, > - const char *__restrict __fmt, _G_va_list __ap)) > + const char *__restrict __fmt, __gnuc_va_list __ap)) > { > return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, > __bos (__s), __fmt, __ap); > @@ -86,9 +89,9 @@ extern int __fprintf_chk (FILE *__restrict __stream, int __flag, > const char *__restrict __format, ...); > extern int __printf_chk (int __flag, const char *__restrict __format, ...); > extern int __vfprintf_chk (FILE *__restrict __stream, int __flag, > - const char *__restrict __format, _G_va_list __ap); > + const char *__restrict __format, __gnuc_va_list __ap); > extern int __vprintf_chk (int __flag, const char *__restrict __format, > - _G_va_list __ap); > + __gnuc_va_list __ap); > > # ifdef __va_arg_pack > __fortify_function int > @@ -111,7 +114,7 @@ printf (const char *__restrict __fmt, ...) > # endif > > __fortify_function int > -vprintf (const char *__restrict __fmt, _G_va_list __ap) > +vprintf (const char *__restrict __fmt, __gnuc_va_list __ap) > { > #ifdef __USE_EXTERN_INLINES > return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); > @@ -122,7 +125,7 @@ vprintf (const char *__restrict __fmt, _G_va_list __ap) > > __fortify_function int > vfprintf (FILE *__restrict __stream, > - const char *__restrict __fmt, _G_va_list __ap) > + const char *__restrict __fmt, __gnuc_va_list __ap) > { > return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); > } > @@ -131,7 +134,7 @@ vfprintf (FILE *__restrict __stream, > extern int __dprintf_chk (int __fd, int __flag, const char *__restrict __fmt, > ...) __attribute__ ((__format__ (__printf__, 3, 4))); > extern int __vdprintf_chk (int __fd, int __flag, > - const char *__restrict __fmt, _G_va_list __arg) > + const char *__restrict __fmt, __gnuc_va_list __arg) > __attribute__ ((__format__ (__printf__, 3, 0))); > > # ifdef __va_arg_pack > @@ -147,7 +150,7 @@ dprintf (int __fd, const char *__restrict __fmt, ...) > # endif > > __fortify_function int > -vdprintf (int __fd, const char *__restrict __fmt, _G_va_list __ap) > +vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __ap) > { > return __vdprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); > } > @@ -159,7 +162,7 @@ extern int __asprintf_chk (char **__restrict __ptr, int __flag, > const char *__restrict __fmt, ...) > __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur; > extern int __vasprintf_chk (char **__restrict __ptr, int __flag, > - const char *__restrict __fmt, _G_va_list __arg) > + const char *__restrict __fmt, __gnuc_va_list __arg) > __THROW __attribute__ ((__format__ (__printf__, 3, 0))) __wur; > extern int __obstack_printf_chk (struct obstack *__restrict __obstack, > int __flag, const char *__restrict __format, > @@ -168,7 +171,7 @@ extern int __obstack_printf_chk (struct obstack *__restrict __obstack, > extern int __obstack_vprintf_chk (struct obstack *__restrict __obstack, > int __flag, > const char *__restrict __format, > - _G_va_list __args) > + __gnuc_va_list __args) > __THROW __attribute__ ((__format__ (__printf__, 3, 0))); > > # ifdef __va_arg_pack > @@ -205,14 +208,14 @@ __NTH (obstack_printf (struct obstack *__restrict __obstack, > > __fortify_function int > __NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt, > - _G_va_list __ap)) > + __gnuc_va_list __ap)) > { > return __vasprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); > } > > __fortify_function int > __NTH (obstack_vprintf (struct obstack *__restrict __obstack, > - const char *__restrict __fmt, _G_va_list __ap)) > + const char *__restrict __fmt, __gnuc_va_list __ap)) > { > return __obstack_vprintf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt, > __ap); > @@ -368,7 +371,7 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, > > for (; __cnt > 0; --__cnt) > { > - int __c = _IO_getc_unlocked (__stream); > + int __c = getc_unlocked (__stream); > if (__c == EOF) > break; > *__cptr++ = __c; > @@ -379,3 +382,5 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, > return __fread_unlocked_alias (__ptr, __size, __n, __stream); > } > #endif > + > +#endif /* bits/stdio2.h. */ Ok. > diff --git a/libio/bits/types/__fpos64_t.h b/libio/bits/types/__fpos64_t.h > new file mode 100644 > index 00000000000..06a6891154f > --- /dev/null > +++ b/libio/bits/types/__fpos64_t.h > @@ -0,0 +1,16 @@ > +#ifndef _____fpos64_t_defined > +#define _____fpos64_t_defined 1 > + > +#include <bits/types.h> > +#include <bits/types/__mbstate_t.h> > + > +/* The tag name of this struct is _G_fpos64_t to preserve historic > + C++ mangled names for functions taking fpos_t and/or fpos64_t > + arguments. That name should not be used in new code. */ > +typedef struct _G_fpos64_t > +{ > + __off64_t __pos; > + __mbstate_t __state; > +} __fpos64_t; > + > +#endif Ok. > diff --git a/libio/bits/types/__fpos_t.h b/libio/bits/types/__fpos_t.h > new file mode 100644 > index 00000000000..bb04576651b > --- /dev/null > +++ b/libio/bits/types/__fpos_t.h > @@ -0,0 +1,16 @@ > +#ifndef _____fpos_t_defined > +#define _____fpos_t_defined 1 > + > +#include <bits/types.h> > +#include <bits/types/__mbstate_t.h> > + > +/* The tag name of this struct is _G_fpos_t to preserve historic > + C++ mangled names for functions taking fpos_t arguments. > + That name should not be used in new code. */ > +typedef struct _G_fpos_t > +{ > + __off_t __pos; > + __mbstate_t __state; > +} __fpos_t; > + > +#endif Ok. > diff --git a/libio/bits/types/cookie_io_functions_t.h b/libio/bits/types/cookie_io_functions_t.h > new file mode 100644 > index 00000000000..cd4c0e19f4c > --- /dev/null > +++ b/libio/bits/types/cookie_io_functions_t.h > @@ -0,0 +1,46 @@ > +#ifndef __cookie_io_functions_t_defined > +#define __cookie_io_functions_t_defined 1 Not sure if file this size requires a copyright header. > + > +#include <bits/types.h> > + > +/* Functions to do I/O and file management for a stream. */ > + > +/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF. > + Return number of bytes read. */ > +typedef __ssize_t cookie_read_function_t (void *__cookie, char *__buf, > + size_t __nbytes); > + > +/* Write NBYTES bytes pointed to by BUF to COOKIE. Write all NBYTES bytes > + unless there is an error. Return number of bytes written. If > + there is an error, return 0 and do not write anything. If the file > + has been opened for append (__mode.__append set), then set the file > + pointer to the end of the file and then do the write; if not, just > + write at the current file pointer. */ > +typedef __ssize_t cookie_write_function_t (void *__cookie, const char *__buf, > + size_t __nbytes); > + > +/* Move COOKIE's file position to *POS bytes from the > + beginning of the file (if W is SEEK_SET), > + the current position (if W is SEEK_CUR), > + or the end of the file (if W is SEEK_END). > + Set *POS to the new file position. > + Returns zero if successful, nonzero if not. */ > +typedef int cookie_seek_function_t (void *__cookie, __off64_t *__pos, int __w); > + > +/* Close COOKIE. */ > +typedef int cookie_close_function_t (void *__cookie); > + > +/* The structure with the cookie function pointers. > + The tag name of this struct is _IO_cookie_io_functions_t to > + preserve historic C++ mangled names for functions taking > + cookie_io_functions_t arguments. That name should not be used in > + new code. */ > +typedef struct _IO_cookie_io_functions_t > +{ > + cookie_read_function_t *read; /* Read bytes. */ > + cookie_write_function_t *write; /* Write bytes. */ > + cookie_seek_function_t *seek; /* Seek/tell file position. */ > + cookie_close_function_t *close; /* Close file. */ > +} cookie_io_functions_t; > + > +#endif Ok. > diff --git a/libio/bits/types/struct_FILE.h b/libio/bits/types/struct_FILE.h > new file mode 100644 > index 00000000000..a120c762685 > --- /dev/null > +++ b/libio/bits/types/struct_FILE.h > @@ -0,0 +1,120 @@ > +/* Copyright (C) 1991-2018 Free Software Foundation, Inc. > + This file is part of the GNU C Library. > + > + The GNU C Library is free software; you can redistribute it and/or > + modify it under the terms of the GNU Lesser General Public > + License as published by the Free Software Foundation; either > + version 2.1 of the License, or (at your option) any later version. > + > + The GNU C Library is distributed in the hope that it will be useful, > + but WITHOUT ANY WARRANTY; without even the implied warranty of > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + Lesser General Public License for more details. > + > + You should have received a copy of the GNU Lesser General Public > + License along with the GNU C Library; if not, see > + <http://www.gnu.org/licenses/>. */ > + > +#ifndef __struct_FILE_defined > +#define __struct_FILE_defined 1 > + > +/* Caution: The contents of this file are not part of the official > + stdio.h API. However, much of it is part of the official *binary* > + interface, and therefore cannot be changed. */ > + > +#if defined _IO_USE_OLD_IO_FILE && !defined _LIBC > +# error "_IO_USE_OLD_IO_FILE should only be defined when building libc itself" > +#endif > + > +#if defined _IO_lock_t_defined && !defined _LIBC > +# error "_IO_lock_t_defined should only be defined when building libc itself" > +#endif Ok. > + > +#include <bits/types.h> > + > +struct _IO_FILE; > +struct _IO_marker; > +struct _IO_codecvt; > +struct _IO_wide_data; > + > +/* During the build of glibc itself, _IO_lock_t will already have been > + defined by internal headers. */ > +#ifndef _IO_lock_t_defined > +typedef void _IO_lock_t; > +#endif > + > +/* The tag name of this struct is _IO_FILE to preserve historic > + C++ mangled names for functions taking FILE* arguments. > + That name should not be used in new code. */ > +struct _IO_FILE > +{ > + int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ > + > + /* The following pointers correspond to the C++ streambuf protocol. */ > + char *_IO_read_ptr; /* Current read pointer */ > + char *_IO_read_end; /* End of get area. */ > + char *_IO_read_base; /* Start of putback+get area. */ > + char *_IO_write_base; /* Start of put area. */ > + char *_IO_write_ptr; /* Current put pointer. */ > + char *_IO_write_end; /* End of put area. */ > + char *_IO_buf_base; /* Start of reserve area. */ > + char *_IO_buf_end; /* End of reserve area. */ > + > + /* The following fields are used to support backing up and undo. */ > + char *_IO_save_base; /* Pointer to start of non-current get area. */ > + char *_IO_backup_base; /* Pointer to first valid character of backup area */ > + char *_IO_save_end; /* Pointer to end of non-current get area. */ > + > + struct _IO_marker *_markers; > + > + struct _IO_FILE *_chain; > + > + int _fileno; > + int _flags2; > + __off_t _old_offset; /* This used to be _offset but it's too small. */ > + > + /* 1+column number of pbase(); 0 is unknown. */ > + unsigned short _cur_column; > + signed char _vtable_offset; > + char _shortbuf[1]; > + > + _IO_lock_t *_lock; > +#ifdef _IO_USE_OLD_IO_FILE > +}; > + > +struct _IO_FILE_complete > +{ > + struct _IO_FILE _file; > +#endif > + __off64_t _offset; > + /* Wide character stream stuff. */ > + struct _IO_codecvt *_codecvt; > + struct _IO_wide_data *_wide_data; > + struct _IO_FILE *_freeres_list; > + void *_freeres_buf; > + size_t __pad5; > + int _mode; > + /* Make sure we don't get into trouble again. */ > + char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; > +}; > + > +/* These macros are used by bits/stdio.h and internal headers. */ > +#define __getc_unlocked_body(_fp) \ > + (__glibc_unlikely ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end) \ > + ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++) > + > +#define __putc_unlocked_body(_ch, _fp) \ > + (__glibc_unlikely ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end) \ > + ? __overflow (_fp, (unsigned char) (_ch)) \ > + : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch))) > + > +#define _IO_EOF_SEEN 0x10 > +#define __feof_unlocked_body(_fp) (((_fp)->_flags & _IO_EOF_SEEN) != 0) > + > +#define _IO_ERR_SEEN 0x20 > +#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0) > + > +#define _IO_USER_LOCK 0x8000 > +/* Many more flag bits are defined internally. */ > + > +#endif Ok. > diff --git a/libio/iolibio.h b/libio/iolibio.h > index 621b31cff1f..7814b1d4e56 100644 > --- a/libio/iolibio.h > +++ b/libio/iolibio.h > @@ -1,4 +1,8 @@ > +#ifndef _IOLIBIO_H > +#define _IOLIBIO_H 1 > + > #include <stdio.h> > +#include <bits/libio.h> > > /* These emulate stdio functionality, but with a different name > (_IO_ungetc instead of ungetc), and using _IO_FILE instead of FILE. */ > @@ -94,3 +98,5 @@ _IO_FILE *__old_freopen (const char *, const char *, _IO_FILE *) __THROW; > #ifdef __cplusplus > } > #endif > + > +#endif /* iolibio.h. */ Ok. > diff --git a/libio/libio.h b/libio/libio.h > deleted file mode 100644 > index 47a25083ce3..00000000000 > --- a/libio/libio.h > +++ /dev/null > @@ -1,25 +0,0 @@ > -/* Copyright (C) 2017-2018 Free Software Foundation, Inc. > - This file is part of the GNU C Library. > - > - The GNU C Library is free software; you can redistribute it and/or > - modify it under the terms of the GNU Lesser General Public > - License as published by the Free Software Foundation; either > - version 2.1 of the License, or (at your option) any later version. > - > - The GNU C Library is distributed in the hope that it will be useful, > - but WITHOUT ANY WARRANTY; without even the implied warranty of > - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > - Lesser General Public License for more details. > - > - You should have received a copy of the GNU Lesser General Public > - License along with the GNU C Library; if not, see > - <http://www.gnu.org/licenses/>. */ > - > -#ifndef _LIBIO_H > -#define _LIBIO_H 1 > - > -#warning "<libio.h> is deprecated; use <stdio.h> instead." > - > -#include <bits/libio.h> > - > -#endif Ok. > diff --git a/libio/libioP.h b/libio/libioP.h > index 068ceb2615a..ac66f95f8d4 100644 > --- a/libio/libioP.h > +++ b/libio/libioP.h > @@ -32,6 +32,9 @@ > > FIXME: All of the C++ cruft eventually needs to go away. */ > > +#ifndef _LIBIOP_H > +#define _LIBIOP_H 1 > + > #include <stddef.h> > > #include <errno.h> > @@ -39,6 +42,8 @@ > > #include <math_ldbl_opt.h> > > +#include <stdio.h> > +#include <bits/libio.h> > #include "iolibio.h" > > #ifdef __cplusplus > @@ -876,3 +881,5 @@ IO_validate_vtable (const struct _IO_jump_t *vtable) > _IO_vtable_check (); > return vtable; > } > + > +#endif /* libioP.h. */ Ok. > diff --git a/libio/stdio.h b/libio/stdio.h > index 33de3813bbd..731f8e56f4c 100644 > --- a/libio/stdio.h > +++ b/libio/stdio.h > @@ -32,18 +32,24 @@ __BEGIN_DECLS > #define __need_NULL > #include <stddef.h> > > +#define __need___va_list > +#include <stdarg.h> > + > #include <bits/types.h> > +#include <bits/types/__fpos_t.h> > +#include <bits/types/__fpos64_t.h> > #include <bits/types/__FILE.h> > #include <bits/types/FILE.h> > +#include <bits/types/struct_FILE.h> > > -#define _STDIO_USES_IOSTREAM > - > -#include <bits/libio.h> > +#ifdef __USE_GNU > +# include <bits/types/cookie_io_functions_t.h> > +#endif > > #if defined __USE_XOPEN || defined __USE_XOPEN2K8 > # ifdef __GNUC__ > # ifndef _VA_LIST_DEFINED > -typedef _G_va_list va_list; > +typedef __gnuc_va_list va_list; > # define _VA_LIST_DEFINED > # endif > # else > @@ -75,12 +81,12 @@ typedef __ssize_t ssize_t; > > /* The type of the second argument to `fgetpos' and `fsetpos'. */ > #ifndef __USE_FILE_OFFSET64 > -typedef _G_fpos_t fpos_t; > +typedef __fpos_t fpos_t; > #else > -typedef _G_fpos64_t fpos_t; > +typedef __fpos64_t fpos_t; > #endif > #ifdef __USE_LARGEFILE64 > -typedef _G_fpos64_t fpos64_t; > +typedef __fpos64_t fpos64_t; > #endif > > /* The possibilities for the third argument to `setvbuf'. */ > @@ -90,16 +96,12 @@ typedef _G_fpos64_t fpos64_t; > > > /* Default buffer size. */ > -#ifndef BUFSIZ > -# define BUFSIZ _IO_BUFSIZ > -#endif > +#define BUFSIZ 8192 I think a possible subsqueuent cleanup is to remove _IO_BUFSIZE utilization within glibc as well. > > > -/* End of file character. > - Some things throughout the library rely on this being -1. */ > -#ifndef EOF > -# define EOF (-1) > -#endif > +/* The value returned by fgetc and similar functions to indicate the > + end of the file. */ > +#define EOF (-1) EOF is being define on both libio/libioP.h and libio/stdio.h. Shouldn't we cleanup the libioP.h one? > > > /* The possibilities for the third argument to `fseek'. > @@ -132,9 +134,9 @@ typedef _G_fpos64_t fpos64_t; > > > /* Standard streams. */ > -extern struct _IO_FILE *stdin; /* Standard input stream. */ > -extern struct _IO_FILE *stdout; /* Standard output stream. */ > -extern struct _IO_FILE *stderr; /* Standard error output stream. */ > +extern FILE *stdin; /* Standard input stream. */ > +extern FILE *stdout; /* Standard output stream. */ > +extern FILE *stderr; /* Standard error output stream. */ > /* C89/C99 say they're macros. Make them happy. */ > #define stdin stdin > #define stdout stdout > @@ -270,7 +272,7 @@ extern FILE *fdopen (int __fd, const char *__modes) __THROW __wur; > and uses the given functions for input and output. */ > extern FILE *fopencookie (void *__restrict __magic_cookie, > const char *__restrict __modes, > - _IO_cookie_io_functions_t __io_funcs) __THROW __wur; > + cookie_io_functions_t __io_funcs) __THROW __wur; > #endif > > #if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2) Ok. > @@ -325,15 +327,15 @@ extern int sprintf (char *__restrict __s, > This function is a possible cancellation point and therefore not > marked with __THROW. */ > extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, > - _G_va_list __arg); > + __gnuc_va_list __arg); > /* Write formatted output to stdout from argument list ARG. > > This function is a possible cancellation point and therefore not > marked with __THROW. */ > -extern int vprintf (const char *__restrict __format, _G_va_list __arg); > +extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); > /* Write formatted output to S from argument list ARG. */ > extern int vsprintf (char *__restrict __s, const char *__restrict __format, > - _G_va_list __arg) __THROWNL; > + __gnuc_va_list __arg) __THROWNL; > > #if defined __USE_ISOC99 || defined __USE_UNIX98 > /* Maximum chars of output to write in MAXLEN. */ > @@ -342,7 +344,7 @@ extern int snprintf (char *__restrict __s, size_t __maxlen, > __THROWNL __attribute__ ((__format__ (__printf__, 3, 4))); > > extern int vsnprintf (char *__restrict __s, size_t __maxlen, > - const char *__restrict __format, _G_va_list __arg) > + const char *__restrict __format, __gnuc_va_list __arg) > __THROWNL __attribute__ ((__format__ (__printf__, 3, 0))); > #endif > > @@ -350,7 +352,7 @@ extern int vsnprintf (char *__restrict __s, size_t __maxlen, > /* Write formatted output to a string dynamically allocated with `malloc'. > Store the address of the string in *PTR. */ > extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, > - _G_va_list __arg) > + __gnuc_va_list __arg) > __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))) __wur; > extern int __asprintf (char **__restrict __ptr, > const char *__restrict __fmt, ...) > @@ -363,7 +365,7 @@ extern int asprintf (char **__restrict __ptr, > #ifdef __USE_XOPEN2K8 > /* Write formatted output to a file descriptor. */ > extern int vdprintf (int __fd, const char *__restrict __fmt, > - _G_va_list __arg) > + __gnuc_va_list __arg) > __attribute__ ((__format__ (__printf__, 2, 0))); > extern int dprintf (int __fd, const char *__restrict __fmt, ...) > __attribute__ ((__format__ (__printf__, 2, 3))); > @@ -418,19 +420,19 @@ extern int __isoc99_sscanf (const char *__restrict __s, > This function is a possible cancellation point and therefore not > marked with __THROW. */ > extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, > - _G_va_list __arg) > + __gnuc_va_list __arg) > __attribute__ ((__format__ (__scanf__, 2, 0))) __wur; > > /* Read formatted input from stdin into argument list ARG. > > This function is a possible cancellation point and therefore not > marked with __THROW. */ > -extern int vscanf (const char *__restrict __format, _G_va_list __arg) > +extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) > __attribute__ ((__format__ (__scanf__, 1, 0))) __wur; > > /* Read formatted input from S into argument list ARG. */ > extern int vsscanf (const char *__restrict __s, > - const char *__restrict __format, _G_va_list __arg) > + const char *__restrict __format, __gnuc_va_list __arg) > __THROW __attribute__ ((__format__ (__scanf__, 2, 0))); > > # if !defined __USE_GNU \ > @@ -442,26 +444,26 @@ extern int vsscanf (const char *__restrict __s, > s, S or [. */ > extern int __REDIRECT (vfscanf, > (FILE *__restrict __s, > - const char *__restrict __format, _G_va_list __arg), > + const char *__restrict __format, __gnuc_va_list __arg), > __isoc99_vfscanf) > __attribute__ ((__format__ (__scanf__, 2, 0))) __wur; > extern int __REDIRECT (vscanf, (const char *__restrict __format, > - _G_va_list __arg), __isoc99_vscanf) > + __gnuc_va_list __arg), __isoc99_vscanf) > __attribute__ ((__format__ (__scanf__, 1, 0))) __wur; > extern int __REDIRECT_NTH (vsscanf, > (const char *__restrict __s, > const char *__restrict __format, > - _G_va_list __arg), __isoc99_vsscanf) > + __gnuc_va_list __arg), __isoc99_vsscanf) > __attribute__ ((__format__ (__scanf__, 2, 0))); > # else > extern int __isoc99_vfscanf (FILE *__restrict __s, > const char *__restrict __format, > - _G_va_list __arg) __wur; > + __gnuc_va_list __arg) __wur; > extern int __isoc99_vscanf (const char *__restrict __format, > - _G_va_list __arg) __wur; > + __gnuc_va_list __arg) __wur; > extern int __isoc99_vsscanf (const char *__restrict __s, > const char *__restrict __format, > - _G_va_list __arg) __THROW; > + __gnuc_va_list __arg) __THROW; > # define vfscanf __isoc99_vfscanf > # define vscanf __isoc99_vscanf > # define vsscanf __isoc99_vsscanf Ok. > @@ -592,12 +594,12 @@ extern char *fgets_unlocked (char *__restrict __s, int __n, > cancellation point. But due to similarity with an POSIX interface > or due to the implementation they are cancellation points and > therefore not marked with __THROW. */ > -extern _IO_ssize_t __getdelim (char **__restrict __lineptr, > - size_t *__restrict __n, int __delimiter, > - FILE *__restrict __stream) __wur; > -extern _IO_ssize_t getdelim (char **__restrict __lineptr, > - size_t *__restrict __n, int __delimiter, > - FILE *__restrict __stream) __wur; > +extern __ssize_t __getdelim (char **__restrict __lineptr, > + size_t *__restrict __n, int __delimiter, > + FILE *__restrict __stream) __wur; > +extern __ssize_t getdelim (char **__restrict __lineptr, > + size_t *__restrict __n, int __delimiter, > + FILE *__restrict __stream) __wur; > > /* Like `getdelim', but reads up to a newline. > > @@ -605,9 +607,9 @@ extern _IO_ssize_t getdelim (char **__restrict __lineptr, > cancellation point. But due to similarity with an POSIX interface > or due to the implementation it is a cancellation point and > therefore not marked with __THROW. */ > -extern _IO_ssize_t getline (char **__restrict __lineptr, > - size_t *__restrict __n, > - FILE *__restrict __stream) __wur; > +extern __ssize_t getline (char **__restrict __lineptr, > + size_t *__restrict __n, > + FILE *__restrict __stream) __wur; > #endif > > Ok. > @@ -820,7 +822,7 @@ extern int obstack_printf (struct obstack *__restrict __obstack, > __THROWNL __attribute__ ((__format__ (__printf__, 2, 3))); > extern int obstack_vprintf (struct obstack *__restrict __obstack, > const char *__restrict __format, > - _G_va_list __args) > + __gnuc_va_list __args) > __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))); > #endif /* Use GNU. */ > > @@ -845,6 +847,11 @@ extern void funlockfile (FILE *__stream) __THROW; > # include <bits/getopt_posix.h> > #endif > > +/* Slow-path routines used by the optimized inline functions in > + bits/stdio.h. */ > +extern int __uflow (FILE *); > +extern int __overflow (FILE *, int); > + > /* If we are compiling with optimizing read this file. It contains > several optimizing inline functions and macros. */ > #ifdef __USE_EXTERN_INLINES Ok. > diff --git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh > index 3384e1c3e76..7ffd2b8e749 100644 > --- a/scripts/check-installed-headers.sh > +++ b/scripts/check-installed-headers.sh > @@ -84,11 +84,6 @@ for header in "$@"; do > (sys/elf.h) > continue;; > > - # libio.h and _G_config.h are deprecation stubs containing #warnings > - # to use stdio.h instead. > - (libio.h | _G_config.h) > - continue;; > - > # sys/sysctl.h is unsupported for x32. > (sys/sysctl.h) > case "$is_x32" in Ok. > diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h > index 9994869098b..05a64acb2cf 100644 > --- a/sysdeps/unix/sysv/linux/bits/_G_config.h > +++ b/sysdeps/unix/sysv/linux/bits/_G_config.h > @@ -4,10 +4,6 @@ > #ifndef _BITS_G_CONFIG_H > #define _BITS_G_CONFIG_H 1 > > -#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H > -# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead." > -#endif > - > /* Define types for libio in terms of the standard internal type names. */ > > #include <bits/types.h> > @@ -19,20 +15,16 @@ > #include <stddef.h> > > #include <bits/types/__mbstate_t.h> > +#include <bits/types/__fpos_t.h> > +#include <bits/types/__fpos64_t.h> > + > +#define _G_fpos_t __fpos_t > +#define _G_fpos64_t __fpos64_t > + > #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T > # include <bits/types/wint_t.h> > #endif > > -typedef struct > -{ > - __off_t __pos; > - __mbstate_t __state; > -} _G_fpos_t; > -typedef struct > -{ > - __off64_t __pos; > - __mbstate_t __state; > -} _G_fpos64_t; > #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T > # include <gconv.h> > typedef union > Ok.
[forwarding accidental off-list reply] On Tue, Feb 6, 2018 at 8:50 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > On 05/02/2018 21:34, Zack Weinberg wrote: >> In this patch, we stop installing libio.h and _G_config.h for public >> use; necessarily, this means the public stdio.h stops including >> libio.h. > > It looks good to me, with just a couple of nits below (which do not > block the patch itself). I can't promise to do any follow-up work anytime soon. >> -#ifndef BUFSIZ >> -# define BUFSIZ _IO_BUFSIZ >> -#endif >> +#define BUFSIZ 8192 > > I think a possible subsqueuent cleanup is to remove _IO_BUFSIZE utilization > within glibc as well. > >> +/* The value returned by fgetc and similar functions to indicate the >> + end of the file. */ >> +#define EOF (-1) > > EOF is being define on both libio/libioP.h and libio/stdio.h. Shouldn't we > cleanup the libioP.h one? These are good suggestions for further cleanups but I'm not going to fold them into this patchset. I don't think there's any danger of them getting forgotten about; whoever next looks at libio(P).h is going to be looking for cleanups. zw
On 02/06/2018 09:08 PM, Zack Weinberg wrote: > These are good suggestions for further cleanups but I'm not going to > fold them into this patchset. I don't think there's any danger of > them getting forgotten about; whoever next looks at libio(P).h is > going to be looking for cleanups. I completely agree with this approach. Thanks, Florian
On 06/02/2018 18:30, Florian Weimer wrote: > On 02/06/2018 09:08 PM, Zack Weinberg wrote: >> These are good suggestions for further cleanups but I'm not going to >> fold them into this patchset. I don't think there's any danger of >> them getting forgotten about; whoever next looks at libio(P).h is >> going to be looking for cleanups. > > I completely agree with this approach. Fair enough.
On Wed, Feb 7, 2018 at 7:11 AM, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote: > On 06/02/2018 18:30, Florian Weimer wrote: >> On 02/06/2018 09:08 PM, Zack Weinberg wrote: >>> These are good suggestions for further cleanups but I'm not going to >>> fold them into this patchset. I don't think there's any danger of >>> them getting forgotten about; whoever next looks at libio(P).h is >>> going to be looking for cleanups. >> >> I completely agree with this approach. > > Fair enough. I added a copyright header to bits/types/cookie_io_functions_t.h and pushed the rest of this series. zw
diff --git a/NEWS b/NEWS index eceab2b2be2..87a3f1d1cd8 100644 --- a/NEWS +++ b/NEWS @@ -13,7 +13,9 @@ Major new features: Deprecated and removed features, and other changes affecting compatibility: - [Add deprecations, removals and changes affecting compatibility here] + * The nonstandard header files <libio.h> and <_G_config.h> are no longer + installed. Software that was using either header should be updated to + use standard <stdio.h> interfaces instead. * The stdio.h functions 'getc' and 'putc' are no longer defined as macros. This was never required by the C standard, and the macros just expanded diff --git a/bits/_G_config.h b/bits/_G_config.h index 2b60d29f5ff..8c81bc42787 100644 --- a/bits/_G_config.h +++ b/bits/_G_config.h @@ -4,10 +4,6 @@ #ifndef _BITS_G_CONFIG_H #define _BITS_G_CONFIG_H 1 -#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H -# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead." -#endif - /* Define types for libio in terms of the standard internal type names. */ #include <bits/types.h> @@ -19,20 +15,16 @@ #include <stddef.h> #include <bits/types/__mbstate_t.h> +#include <bits/types/__fpos_t.h> +#include <bits/types/__fpos64_t.h> + +#define _G_fpos_t __fpos_t +#define _G_fpos64_t __fpos64_t + #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # include <bits/types/wint_t.h> #endif -typedef struct -{ - __off_t __pos; - __mbstate_t __state; -} _G_fpos_t; -typedef struct -{ - __off64_t __pos; - __mbstate_t __state; -} _G_fpos64_t; #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # include <gconv.h> typedef union diff --git a/conform/data/stdio.h-data b/conform/data/stdio.h-data index f69802cc703..3ef24606610 100644 --- a/conform/data/stdio.h-data +++ b/conform/data/stdio.h-data @@ -41,7 +41,7 @@ type fpos_t #if !defined ISO && !defined ISO99 && !defined ISO11 && !defined POSIX type va_list #else -#define va_list _G_va_list +#define va_list __gnuc_va_list #endif type size_t #if defined XOPEN2K8 || defined POSIX2008 diff --git a/include/bits/types/__fpos64_t.h b/include/bits/types/__fpos64_t.h new file mode 100644 index 00000000000..68cc4e8b66c --- /dev/null +++ b/include/bits/types/__fpos64_t.h @@ -0,0 +1 @@ +#include <libio/bits/types/__fpos64_t.h> diff --git a/include/bits/types/__fpos_t.h b/include/bits/types/__fpos_t.h new file mode 100644 index 00000000000..2dcdc98d750 --- /dev/null +++ b/include/bits/types/__fpos_t.h @@ -0,0 +1 @@ +#include <libio/bits/types/__fpos_t.h> diff --git a/include/bits/types/cookie_io_functions_t.h b/include/bits/types/cookie_io_functions_t.h new file mode 100644 index 00000000000..87f7930c6ec --- /dev/null +++ b/include/bits/types/cookie_io_functions_t.h @@ -0,0 +1 @@ +#include <libio/bits/types/cookie_io_functions_t.h> diff --git a/include/bits/types/struct_FILE.h b/include/bits/types/struct_FILE.h new file mode 100644 index 00000000000..971407292be --- /dev/null +++ b/include/bits/types/struct_FILE.h @@ -0,0 +1 @@ +#include <libio/bits/types/struct_FILE.h> diff --git a/include/stdio.h b/include/stdio.h index f1e987ae5e3..3b6da17d82f 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -1,6 +1,11 @@ #ifndef _STDIO_H +# if !defined _ISOMAC && defined _IO_MTSAFE_IO +# include <stdio-lock.h> +# endif # include <libio/stdio.h> # ifndef _ISOMAC +# define _LIBC_STDIO_H 1 +# include <bits/libio.h> /* Now define the internal interfaces. */ diff --git a/libio/Makefile b/libio/Makefile index 918a86bb743..3e08ed0eeb0 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -22,10 +22,11 @@ subdir := libio include ../Makeconfig -headers := stdio.h libio.h _G_config.h \ - bits/stdio.h bits/libio.h bits/_G_config.h \ - bits/sys_errlist.h bits/stdio2.h bits/stdio-ldbl.h bits/libio-ldbl.h \ - bits/types/FILE.h bits/types/__FILE.h +headers := stdio.h \ + bits/stdio.h bits/stdio2.h bits/sys_errlist.h bits/stdio-ldbl.h \ + bits/types/FILE.h bits/types/__FILE.h bits/types/struct_FILE.h \ + bits/types/__fpos_t.h bits/types/__fpos64_t.h \ + bits/types/cookie_io_functions_t.h routines := \ filedoalloc iofclose iofdopen iofflush iofgetpos iofgets iofopen \ diff --git a/libio/_G_config.h b/libio/_G_config.h deleted file mode 100644 index 68de2fcaa0d..00000000000 --- a/libio/_G_config.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (C) 2017-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _G_CONFIG_H -#define _G_CONFIG_H 1 - -#warning "<_G_config.h> is deprecated; use <stdio.h> instead." - -#include <bits/_G_config.h> - -#endif diff --git a/libio/bits/libio.h b/libio/bits/libio.h index fae5b932a1f..cefc2c855b9 100644 --- a/libio/bits/libio.h +++ b/libio/bits/libio.h @@ -28,14 +28,12 @@ #ifndef _BITS_LIBIO_H #define _BITS_LIBIO_H 1 -#if !defined _STDIO_H && !defined _LIBIO_H -# error "Never include <bits/libio.h> directly; use <stdio.h> instead." -#endif +#include <stdio.h> #include <bits/_G_config.h> /* ALL of these should be defined in _G_config.h */ -#define _IO_fpos_t _G_fpos_t -#define _IO_fpos64_t _G_fpos64_t +#define _IO_fpos_t __fpos_t +#define _IO_fpos64_t __fpos64_t #define _IO_size_t size_t #define _IO_ssize_t __ssize_t #define _IO_off_t __off_t @@ -44,40 +42,17 @@ #define _IO_uid_t __uid_t #define _IO_iconv_t _G_iconv_t #define _IO_HAVE_ST_BLKSIZE _G_HAVE_ST_BLKSIZE -#define _IO_BUFSIZ _G_BUFSIZ -#define _IO_va_list _G_va_list +#define _IO_BUFSIZ BUFSIZ #define _IO_wint_t wint_t +#define _IO_va_list __gnuc_va_list -/* This define avoids name pollution if we're using GNU stdarg.h */ -#define __need___va_list -#include <stdarg.h> -#ifdef __GNUC_VA_LIST -# undef _IO_va_list -# define _IO_va_list __gnuc_va_list -#endif /* __GNUC_VA_LIST */ - -#ifndef __P -# include <sys/cdefs.h> -#endif /*!__P*/ - +/* compatibility defines */ +#define _STDIO_USES_IOSTREAM #define _IO_UNIFIED_JUMPTABLES 1 +#define __HAVE_COLUMN +#define _IO_file_flags _flags -#ifndef EOF -# define EOF (-1) -#endif -#ifndef NULL -# if defined __GNUG__ && \ - (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 8)) -# define NULL (__null) -# else -# if !defined(__cplusplus) -# define NULL ((void*)0) -# else -# define NULL (0) -# endif -# endif -#endif - +/* open modes */ #define _IOS_INPUT 1 #define _IOS_OUTPUT 2 #define _IOS_ATEND 4 @@ -146,14 +121,7 @@ #define _IO_BOOLALPHA 0200000 -struct _IO_jump_t; struct _IO_FILE; - -/* During the build of glibc itself, _IO_lock_t will already have been - defined by internal headers. */ -#ifndef _IO_lock_t_defined -typedef void _IO_lock_t; -#endif - +struct _IO_jump_t; /* A streammarker remembers a position in a buffer. */ @@ -164,16 +132,6 @@ struct _IO_marker { it points to _buf->Gbase()+_pos. FIXME comment */ /* if _pos < 0, it points to _buf->eBptr()+_pos. FIXME comment */ int _pos; -#if 0 - void set_streampos(streampos sp) { _spos = sp; } - void set_offset(int offset) { _pos = offset; _spos = (streampos)(-2); } - public: - streammarker(streambuf *sb); - ~streammarker(); - int saving() { return _spos == -2; } - int delta(streammarker&); - int delta(); -#endif }; /* This is the structure from the libstdc++ codecvt class. */ @@ -242,73 +200,6 @@ struct _IO_wide_data }; #endif -struct _IO_FILE { - int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ -#define _IO_file_flags _flags - - /* The following pointers correspond to the C++ streambuf protocol. */ - /* Note: Tk uses the _IO_read_ptr and _IO_read_end fields directly. */ - char* _IO_read_ptr; /* Current read pointer */ - char* _IO_read_end; /* End of get area. */ - char* _IO_read_base; /* Start of putback+get area. */ - char* _IO_write_base; /* Start of put area. */ - char* _IO_write_ptr; /* Current put pointer. */ - char* _IO_write_end; /* End of put area. */ - char* _IO_buf_base; /* Start of reserve area. */ - char* _IO_buf_end; /* End of reserve area. */ - /* The following fields are used to support backing up and undo. */ - char *_IO_save_base; /* Pointer to start of non-current get area. */ - char *_IO_backup_base; /* Pointer to first valid character of backup area */ - char *_IO_save_end; /* Pointer to end of non-current get area. */ - - struct _IO_marker *_markers; - - struct _IO_FILE *_chain; - - int _fileno; -#if 0 - int _blksize; -#else - int _flags2; -#endif - _IO_off_t _old_offset; /* This used to be _offset but it's too small. */ - -#define __HAVE_COLUMN /* temporary */ - /* 1+column number of pbase(); 0 is unknown. */ - unsigned short _cur_column; - signed char _vtable_offset; - char _shortbuf[1]; - - /* char* _save_gptr; char* _save_egptr; */ - - _IO_lock_t *_lock; -#ifdef _IO_USE_OLD_IO_FILE -}; - -struct _IO_FILE_complete -{ - struct _IO_FILE _file; -#endif -#if defined _G_IO_IO_FILE_VERSION && _G_IO_IO_FILE_VERSION == 0x20001 - _IO_off64_t _offset; -# if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T - /* Wide character stream stuff. */ - struct _IO_codecvt *_codecvt; - struct _IO_wide_data *_wide_data; - struct _IO_FILE *_freeres_list; - void *_freeres_buf; -# else - void *__pad1; - void *__pad2; - void *__pad3; - void *__pad4; -# endif - size_t __pad5; - int _mode; - /* Make sure we don't get into trouble again. */ - char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; -#endif -}; #ifndef __cplusplus typedef struct _IO_FILE _IO_FILE; @@ -330,49 +221,13 @@ extern _IO_FILE *_IO_stderr attribute_hidden; #endif -/* Functions to do I/O and file management for a stream. */ - -/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF. - Return number of bytes read. */ -typedef __ssize_t __io_read_fn (void *__cookie, char *__buf, size_t __nbytes); - -/* Write N bytes pointed to by BUF to COOKIE. Write all N bytes - unless there is an error. Return number of bytes written. If - there is an error, return 0 and do not write anything. If the file - has been opened for append (__mode.__append set), then set the file - pointer to the end of the file and then do the write; if not, just - write at the current file pointer. */ -typedef __ssize_t __io_write_fn (void *__cookie, const char *__buf, - size_t __n); - -/* Move COOKIE's file position to *POS bytes from the - beginning of the file (if W is SEEK_SET), - the current position (if W is SEEK_CUR), - or the end of the file (if W is SEEK_END). - Set *POS to the new file position. - Returns zero if successful, nonzero if not. */ -typedef int __io_seek_fn (void *__cookie, _IO_off64_t *__pos, int __w); - -/* Close COOKIE. */ -typedef int __io_close_fn (void *__cookie); - - +/* Compatibility names for cookie I/O functions. */ #ifdef __USE_GNU -/* User-visible names for the above. */ -typedef __io_read_fn cookie_read_function_t; -typedef __io_write_fn cookie_write_function_t; -typedef __io_seek_fn cookie_seek_function_t; -typedef __io_close_fn cookie_close_function_t; - -/* The structure with the cookie function pointers. */ -typedef struct -{ - __io_read_fn *read; /* Read bytes. */ - __io_write_fn *write; /* Write bytes. */ - __io_seek_fn *seek; /* Seek/tell file position. */ - __io_close_fn *close; /* Close file. */ -} _IO_cookie_io_functions_t; -typedef _IO_cookie_io_functions_t cookie_io_functions_t; +typedef cookie_read_function_t __io_read_fn; +typedef cookie_write_function_t __io_write_fn; +typedef cookie_seek_function_t __io_seek_fn; +typedef cookie_close_function_t __io_close_fn; +typedef cookie_io_functions_t _IO_cookie_io_functions_t; struct _IO_cookie_file; @@ -387,8 +242,6 @@ extern "C" { #endif extern int __underflow (_IO_FILE *); -extern int __uflow (_IO_FILE *); -extern int __overflow (_IO_FILE *, int); #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T extern _IO_wint_t __wunderflow (_IO_FILE *); extern _IO_wint_t __wuflow (_IO_FILE *); @@ -401,17 +254,12 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); # define _IO_BE(expr, res) (expr) #endif -#define _IO_getc_unlocked(_fp) \ - (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \ - ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++) +#define _IO_getc_unlocked(_fp) __getc_unlocked_body (_fp) #define _IO_peekc_unlocked(_fp) \ (_IO_BE ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end, 0) \ && __underflow (_fp) == EOF ? EOF \ : *(unsigned char *) (_fp)->_IO_read_ptr) -#define _IO_putc_unlocked(_ch, _fp) \ - (_IO_BE ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end, 0) \ - ? __overflow (_fp, (unsigned char) (_ch)) \ - : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch))) +#define _IO_putc_unlocked(_ch, _fp) __putc_unlocked_body (_ch, _fp) #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # define _IO_getwc_unlocked(_fp) \ @@ -427,8 +275,8 @@ extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); : (_IO_wint_t) (*(_fp)->_wide_data->_IO_write_ptr++ = (_wch))) #endif -#define _IO_feof_unlocked(__fp) (((__fp)->_flags & _IO_EOF_SEEN) != 0) -#define _IO_ferror_unlocked(__fp) (((__fp)->_flags & _IO_ERR_SEEN) != 0) +#define _IO_feof_unlocked(_fp) __feof_unlocked_body (_fp) +#define _IO_ferror_unlocked(_fp) __ferror_unlocked_body (_fp) extern int _IO_getc (_IO_FILE *__fp); extern int _IO_putc (int __c, _IO_FILE *__fp); diff --git a/libio/bits/stdio.h b/libio/bits/stdio.h index eb42b22153c..4ab919031f7 100644 --- a/libio/bits/stdio.h +++ b/libio/bits/stdio.h @@ -16,6 +16,9 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#ifndef _BITS_STDIO_H +#define _BITS_STDIO_H 1 + #ifndef _STDIO_H # error "Never include <bits/stdio.h> directly; use <stdio.h> instead." #endif @@ -33,7 +36,7 @@ # if !(__USE_FORTIFY_LEVEL > 0 && defined __fortify_function) /* Write formatted output to stdout from argument list ARG. */ __STDIO_INLINE int -vprintf (const char *__restrict __fmt, _G_va_list __arg) +vprintf (const char *__restrict __fmt, __gnuc_va_list __arg) { return vfprintf (stdout, __fmt, __arg); } @@ -52,7 +55,7 @@ getchar (void) __STDIO_INLINE int fgetc_unlocked (FILE *__fp) { - return _IO_getc_unlocked (__fp); + return __getc_unlocked_body (__fp); } # endif /* misc */ @@ -62,14 +65,14 @@ fgetc_unlocked (FILE *__fp) __STDIO_INLINE int getc_unlocked (FILE *__fp) { - return _IO_getc_unlocked (__fp); + return __getc_unlocked_body (__fp); } /* This is defined in POSIX.1:1996. */ __STDIO_INLINE int getchar_unlocked (void) { - return _IO_getc_unlocked (stdin); + return __getc_unlocked_body (stdin); } # endif /* POSIX */ @@ -87,7 +90,7 @@ putchar (int __c) __STDIO_INLINE int fputc_unlocked (int __c, FILE *__stream) { - return _IO_putc_unlocked (__c, __stream); + return __putc_unlocked_body (__c, __stream); } # endif /* misc */ @@ -97,21 +100,21 @@ fputc_unlocked (int __c, FILE *__stream) __STDIO_INLINE int putc_unlocked (int __c, FILE *__stream) { - return _IO_putc_unlocked (__c, __stream); + return __putc_unlocked_body (__c, __stream); } /* This is defined in POSIX.1:1996. */ __STDIO_INLINE int putchar_unlocked (int __c) { - return _IO_putc_unlocked (__c, stdout); + return __putc_unlocked_body (__c, stdout); } # endif /* POSIX */ # ifdef __USE_GNU /* Like `getdelim', but reads up to a newline. */ -__STDIO_INLINE _IO_ssize_t +__STDIO_INLINE __ssize_t getline (char **__lineptr, size_t *__n, FILE *__stream) { return __getdelim (__lineptr, __n, '\n', __stream); @@ -124,14 +127,14 @@ getline (char **__lineptr, size_t *__n, FILE *__stream) __STDIO_INLINE int __NTH (feof_unlocked (FILE *__stream)) { - return _IO_feof_unlocked (__stream); + return __feof_unlocked_body (__stream); } /* Faster versions when locking is not required. */ __STDIO_INLINE int __NTH (ferror_unlocked (FILE *__stream)) { - return _IO_ferror_unlocked (__stream); + return __ferror_unlocked_body (__stream); } # endif /* misc */ @@ -151,7 +154,7 @@ __NTH (ferror_unlocked (FILE *__stream)) for (__cnt = (size_t) (size) * (size_t) (n); \ __cnt > 0; --__cnt) \ { \ - int __c = _IO_getc_unlocked (__stream); \ + int __c = getc_unlocked (__stream); \ if (__c == EOF) \ break; \ *__ptr++ = __c; \ @@ -174,7 +177,7 @@ __NTH (ferror_unlocked (FILE *__stream)) size_t __cnt; \ for (__cnt = (size_t) (size) * (size_t) (n); \ __cnt > 0; --__cnt) \ - if (_IO_putc_unlocked (*__ptr++, __stream) == EOF) \ + if (putc_unlocked (*__ptr++, __stream) == EOF) \ break; \ ((size_t) (size) * (size_t) (n) - __cnt) \ / (size_t) (size); }) \ @@ -188,3 +191,5 @@ __NTH (ferror_unlocked (FILE *__stream)) /* Define helper macro. */ #undef __STDIO_INLINE + +#endif /* bits/stdio.h. */ diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h index 55302e91d0d..11651506a67 100644 --- a/libio/bits/stdio2.h +++ b/libio/bits/stdio2.h @@ -16,6 +16,9 @@ License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ +#ifndef _BITS_STDIO2_H +#define _BITS_STDIO2_H 1 + #ifndef _STDIO_H # error "Never include <bits/stdio2.h> directly; use <stdio.h> instead." #endif @@ -24,7 +27,7 @@ extern int __sprintf_chk (char *__restrict __s, int __flag, size_t __slen, const char *__restrict __format, ...) __THROW; extern int __vsprintf_chk (char *__restrict __s, int __flag, size_t __slen, const char *__restrict __format, - _G_va_list __ap) __THROW; + __gnuc_va_list __ap) __THROW; #ifdef __va_arg_pack __fortify_function int @@ -41,7 +44,7 @@ __NTH (sprintf (char *__restrict __s, const char *__restrict __fmt, ...)) __fortify_function int __NTH (vsprintf (char *__restrict __s, const char *__restrict __fmt, - _G_va_list __ap)) + __gnuc_va_list __ap)) { return __builtin___vsprintf_chk (__s, __USE_FORTIFY_LEVEL - 1, __bos (__s), __fmt, __ap); @@ -54,7 +57,7 @@ extern int __snprintf_chk (char *__restrict __s, size_t __n, int __flag, ...) __THROW; extern int __vsnprintf_chk (char *__restrict __s, size_t __n, int __flag, size_t __slen, const char *__restrict __format, - _G_va_list __ap) __THROW; + __gnuc_va_list __ap) __THROW; # ifdef __va_arg_pack __fortify_function int @@ -72,7 +75,7 @@ __NTH (snprintf (char *__restrict __s, size_t __n, __fortify_function int __NTH (vsnprintf (char *__restrict __s, size_t __n, - const char *__restrict __fmt, _G_va_list __ap)) + const char *__restrict __fmt, __gnuc_va_list __ap)) { return __builtin___vsnprintf_chk (__s, __n, __USE_FORTIFY_LEVEL - 1, __bos (__s), __fmt, __ap); @@ -86,9 +89,9 @@ extern int __fprintf_chk (FILE *__restrict __stream, int __flag, const char *__restrict __format, ...); extern int __printf_chk (int __flag, const char *__restrict __format, ...); extern int __vfprintf_chk (FILE *__restrict __stream, int __flag, - const char *__restrict __format, _G_va_list __ap); + const char *__restrict __format, __gnuc_va_list __ap); extern int __vprintf_chk (int __flag, const char *__restrict __format, - _G_va_list __ap); + __gnuc_va_list __ap); # ifdef __va_arg_pack __fortify_function int @@ -111,7 +114,7 @@ printf (const char *__restrict __fmt, ...) # endif __fortify_function int -vprintf (const char *__restrict __fmt, _G_va_list __ap) +vprintf (const char *__restrict __fmt, __gnuc_va_list __ap) { #ifdef __USE_EXTERN_INLINES return __vfprintf_chk (stdout, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); @@ -122,7 +125,7 @@ vprintf (const char *__restrict __fmt, _G_va_list __ap) __fortify_function int vfprintf (FILE *__restrict __stream, - const char *__restrict __fmt, _G_va_list __ap) + const char *__restrict __fmt, __gnuc_va_list __ap) { return __vfprintf_chk (__stream, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); } @@ -131,7 +134,7 @@ vfprintf (FILE *__restrict __stream, extern int __dprintf_chk (int __fd, int __flag, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 3, 4))); extern int __vdprintf_chk (int __fd, int __flag, - const char *__restrict __fmt, _G_va_list __arg) + const char *__restrict __fmt, __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 3, 0))); # ifdef __va_arg_pack @@ -147,7 +150,7 @@ dprintf (int __fd, const char *__restrict __fmt, ...) # endif __fortify_function int -vdprintf (int __fd, const char *__restrict __fmt, _G_va_list __ap) +vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __ap) { return __vdprintf_chk (__fd, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); } @@ -159,7 +162,7 @@ extern int __asprintf_chk (char **__restrict __ptr, int __flag, const char *__restrict __fmt, ...) __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur; extern int __vasprintf_chk (char **__restrict __ptr, int __flag, - const char *__restrict __fmt, _G_va_list __arg) + const char *__restrict __fmt, __gnuc_va_list __arg) __THROW __attribute__ ((__format__ (__printf__, 3, 0))) __wur; extern int __obstack_printf_chk (struct obstack *__restrict __obstack, int __flag, const char *__restrict __format, @@ -168,7 +171,7 @@ extern int __obstack_printf_chk (struct obstack *__restrict __obstack, extern int __obstack_vprintf_chk (struct obstack *__restrict __obstack, int __flag, const char *__restrict __format, - _G_va_list __args) + __gnuc_va_list __args) __THROW __attribute__ ((__format__ (__printf__, 3, 0))); # ifdef __va_arg_pack @@ -205,14 +208,14 @@ __NTH (obstack_printf (struct obstack *__restrict __obstack, __fortify_function int __NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt, - _G_va_list __ap)) + __gnuc_va_list __ap)) { return __vasprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); } __fortify_function int __NTH (obstack_vprintf (struct obstack *__restrict __obstack, - const char *__restrict __fmt, _G_va_list __ap)) + const char *__restrict __fmt, __gnuc_va_list __ap)) { return __obstack_vprintf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt, __ap); @@ -368,7 +371,7 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, for (; __cnt > 0; --__cnt) { - int __c = _IO_getc_unlocked (__stream); + int __c = getc_unlocked (__stream); if (__c == EOF) break; *__cptr++ = __c; @@ -379,3 +382,5 @@ fread_unlocked (void *__restrict __ptr, size_t __size, size_t __n, return __fread_unlocked_alias (__ptr, __size, __n, __stream); } #endif + +#endif /* bits/stdio2.h. */ diff --git a/libio/bits/types/__fpos64_t.h b/libio/bits/types/__fpos64_t.h new file mode 100644 index 00000000000..06a6891154f --- /dev/null +++ b/libio/bits/types/__fpos64_t.h @@ -0,0 +1,16 @@ +#ifndef _____fpos64_t_defined +#define _____fpos64_t_defined 1 + +#include <bits/types.h> +#include <bits/types/__mbstate_t.h> + +/* The tag name of this struct is _G_fpos64_t to preserve historic + C++ mangled names for functions taking fpos_t and/or fpos64_t + arguments. That name should not be used in new code. */ +typedef struct _G_fpos64_t +{ + __off64_t __pos; + __mbstate_t __state; +} __fpos64_t; + +#endif diff --git a/libio/bits/types/__fpos_t.h b/libio/bits/types/__fpos_t.h new file mode 100644 index 00000000000..bb04576651b --- /dev/null +++ b/libio/bits/types/__fpos_t.h @@ -0,0 +1,16 @@ +#ifndef _____fpos_t_defined +#define _____fpos_t_defined 1 + +#include <bits/types.h> +#include <bits/types/__mbstate_t.h> + +/* The tag name of this struct is _G_fpos_t to preserve historic + C++ mangled names for functions taking fpos_t arguments. + That name should not be used in new code. */ +typedef struct _G_fpos_t +{ + __off_t __pos; + __mbstate_t __state; +} __fpos_t; + +#endif diff --git a/libio/bits/types/cookie_io_functions_t.h b/libio/bits/types/cookie_io_functions_t.h new file mode 100644 index 00000000000..cd4c0e19f4c --- /dev/null +++ b/libio/bits/types/cookie_io_functions_t.h @@ -0,0 +1,46 @@ +#ifndef __cookie_io_functions_t_defined +#define __cookie_io_functions_t_defined 1 + +#include <bits/types.h> + +/* Functions to do I/O and file management for a stream. */ + +/* Read NBYTES bytes from COOKIE into a buffer pointed to by BUF. + Return number of bytes read. */ +typedef __ssize_t cookie_read_function_t (void *__cookie, char *__buf, + size_t __nbytes); + +/* Write NBYTES bytes pointed to by BUF to COOKIE. Write all NBYTES bytes + unless there is an error. Return number of bytes written. If + there is an error, return 0 and do not write anything. If the file + has been opened for append (__mode.__append set), then set the file + pointer to the end of the file and then do the write; if not, just + write at the current file pointer. */ +typedef __ssize_t cookie_write_function_t (void *__cookie, const char *__buf, + size_t __nbytes); + +/* Move COOKIE's file position to *POS bytes from the + beginning of the file (if W is SEEK_SET), + the current position (if W is SEEK_CUR), + or the end of the file (if W is SEEK_END). + Set *POS to the new file position. + Returns zero if successful, nonzero if not. */ +typedef int cookie_seek_function_t (void *__cookie, __off64_t *__pos, int __w); + +/* Close COOKIE. */ +typedef int cookie_close_function_t (void *__cookie); + +/* The structure with the cookie function pointers. + The tag name of this struct is _IO_cookie_io_functions_t to + preserve historic C++ mangled names for functions taking + cookie_io_functions_t arguments. That name should not be used in + new code. */ +typedef struct _IO_cookie_io_functions_t +{ + cookie_read_function_t *read; /* Read bytes. */ + cookie_write_function_t *write; /* Write bytes. */ + cookie_seek_function_t *seek; /* Seek/tell file position. */ + cookie_close_function_t *close; /* Close file. */ +} cookie_io_functions_t; + +#endif diff --git a/libio/bits/types/struct_FILE.h b/libio/bits/types/struct_FILE.h new file mode 100644 index 00000000000..a120c762685 --- /dev/null +++ b/libio/bits/types/struct_FILE.h @@ -0,0 +1,120 @@ +/* Copyright (C) 1991-2018 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef __struct_FILE_defined +#define __struct_FILE_defined 1 + +/* Caution: The contents of this file are not part of the official + stdio.h API. However, much of it is part of the official *binary* + interface, and therefore cannot be changed. */ + +#if defined _IO_USE_OLD_IO_FILE && !defined _LIBC +# error "_IO_USE_OLD_IO_FILE should only be defined when building libc itself" +#endif + +#if defined _IO_lock_t_defined && !defined _LIBC +# error "_IO_lock_t_defined should only be defined when building libc itself" +#endif + +#include <bits/types.h> + +struct _IO_FILE; +struct _IO_marker; +struct _IO_codecvt; +struct _IO_wide_data; + +/* During the build of glibc itself, _IO_lock_t will already have been + defined by internal headers. */ +#ifndef _IO_lock_t_defined +typedef void _IO_lock_t; +#endif + +/* The tag name of this struct is _IO_FILE to preserve historic + C++ mangled names for functions taking FILE* arguments. + That name should not be used in new code. */ +struct _IO_FILE +{ + int _flags; /* High-order word is _IO_MAGIC; rest is flags. */ + + /* The following pointers correspond to the C++ streambuf protocol. */ + char *_IO_read_ptr; /* Current read pointer */ + char *_IO_read_end; /* End of get area. */ + char *_IO_read_base; /* Start of putback+get area. */ + char *_IO_write_base; /* Start of put area. */ + char *_IO_write_ptr; /* Current put pointer. */ + char *_IO_write_end; /* End of put area. */ + char *_IO_buf_base; /* Start of reserve area. */ + char *_IO_buf_end; /* End of reserve area. */ + + /* The following fields are used to support backing up and undo. */ + char *_IO_save_base; /* Pointer to start of non-current get area. */ + char *_IO_backup_base; /* Pointer to first valid character of backup area */ + char *_IO_save_end; /* Pointer to end of non-current get area. */ + + struct _IO_marker *_markers; + + struct _IO_FILE *_chain; + + int _fileno; + int _flags2; + __off_t _old_offset; /* This used to be _offset but it's too small. */ + + /* 1+column number of pbase(); 0 is unknown. */ + unsigned short _cur_column; + signed char _vtable_offset; + char _shortbuf[1]; + + _IO_lock_t *_lock; +#ifdef _IO_USE_OLD_IO_FILE +}; + +struct _IO_FILE_complete +{ + struct _IO_FILE _file; +#endif + __off64_t _offset; + /* Wide character stream stuff. */ + struct _IO_codecvt *_codecvt; + struct _IO_wide_data *_wide_data; + struct _IO_FILE *_freeres_list; + void *_freeres_buf; + size_t __pad5; + int _mode; + /* Make sure we don't get into trouble again. */ + char _unused2[15 * sizeof (int) - 4 * sizeof (void *) - sizeof (size_t)]; +}; + +/* These macros are used by bits/stdio.h and internal headers. */ +#define __getc_unlocked_body(_fp) \ + (__glibc_unlikely ((_fp)->_IO_read_ptr >= (_fp)->_IO_read_end) \ + ? __uflow (_fp) : *(unsigned char *) (_fp)->_IO_read_ptr++) + +#define __putc_unlocked_body(_ch, _fp) \ + (__glibc_unlikely ((_fp)->_IO_write_ptr >= (_fp)->_IO_write_end) \ + ? __overflow (_fp, (unsigned char) (_ch)) \ + : (unsigned char) (*(_fp)->_IO_write_ptr++ = (_ch))) + +#define _IO_EOF_SEEN 0x10 +#define __feof_unlocked_body(_fp) (((_fp)->_flags & _IO_EOF_SEEN) != 0) + +#define _IO_ERR_SEEN 0x20 +#define __ferror_unlocked_body(_fp) (((_fp)->_flags & _IO_ERR_SEEN) != 0) + +#define _IO_USER_LOCK 0x8000 +/* Many more flag bits are defined internally. */ + +#endif diff --git a/libio/iolibio.h b/libio/iolibio.h index 621b31cff1f..7814b1d4e56 100644 --- a/libio/iolibio.h +++ b/libio/iolibio.h @@ -1,4 +1,8 @@ +#ifndef _IOLIBIO_H +#define _IOLIBIO_H 1 + #include <stdio.h> +#include <bits/libio.h> /* These emulate stdio functionality, but with a different name (_IO_ungetc instead of ungetc), and using _IO_FILE instead of FILE. */ @@ -94,3 +98,5 @@ _IO_FILE *__old_freopen (const char *, const char *, _IO_FILE *) __THROW; #ifdef __cplusplus } #endif + +#endif /* iolibio.h. */ diff --git a/libio/libio.h b/libio/libio.h deleted file mode 100644 index 47a25083ce3..00000000000 --- a/libio/libio.h +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (C) 2017-2018 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - <http://www.gnu.org/licenses/>. */ - -#ifndef _LIBIO_H -#define _LIBIO_H 1 - -#warning "<libio.h> is deprecated; use <stdio.h> instead." - -#include <bits/libio.h> - -#endif diff --git a/libio/libioP.h b/libio/libioP.h index 068ceb2615a..ac66f95f8d4 100644 --- a/libio/libioP.h +++ b/libio/libioP.h @@ -32,6 +32,9 @@ FIXME: All of the C++ cruft eventually needs to go away. */ +#ifndef _LIBIOP_H +#define _LIBIOP_H 1 + #include <stddef.h> #include <errno.h> @@ -39,6 +42,8 @@ #include <math_ldbl_opt.h> +#include <stdio.h> +#include <bits/libio.h> #include "iolibio.h" #ifdef __cplusplus @@ -876,3 +881,5 @@ IO_validate_vtable (const struct _IO_jump_t *vtable) _IO_vtable_check (); return vtable; } + +#endif /* libioP.h. */ diff --git a/libio/stdio.h b/libio/stdio.h index 33de3813bbd..731f8e56f4c 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -32,18 +32,24 @@ __BEGIN_DECLS #define __need_NULL #include <stddef.h> +#define __need___va_list +#include <stdarg.h> + #include <bits/types.h> +#include <bits/types/__fpos_t.h> +#include <bits/types/__fpos64_t.h> #include <bits/types/__FILE.h> #include <bits/types/FILE.h> +#include <bits/types/struct_FILE.h> -#define _STDIO_USES_IOSTREAM - -#include <bits/libio.h> +#ifdef __USE_GNU +# include <bits/types/cookie_io_functions_t.h> +#endif #if defined __USE_XOPEN || defined __USE_XOPEN2K8 # ifdef __GNUC__ # ifndef _VA_LIST_DEFINED -typedef _G_va_list va_list; +typedef __gnuc_va_list va_list; # define _VA_LIST_DEFINED # endif # else @@ -75,12 +81,12 @@ typedef __ssize_t ssize_t; /* The type of the second argument to `fgetpos' and `fsetpos'. */ #ifndef __USE_FILE_OFFSET64 -typedef _G_fpos_t fpos_t; +typedef __fpos_t fpos_t; #else -typedef _G_fpos64_t fpos_t; +typedef __fpos64_t fpos_t; #endif #ifdef __USE_LARGEFILE64 -typedef _G_fpos64_t fpos64_t; +typedef __fpos64_t fpos64_t; #endif /* The possibilities for the third argument to `setvbuf'. */ @@ -90,16 +96,12 @@ typedef _G_fpos64_t fpos64_t; /* Default buffer size. */ -#ifndef BUFSIZ -# define BUFSIZ _IO_BUFSIZ -#endif +#define BUFSIZ 8192 -/* End of file character. - Some things throughout the library rely on this being -1. */ -#ifndef EOF -# define EOF (-1) -#endif +/* The value returned by fgetc and similar functions to indicate the + end of the file. */ +#define EOF (-1) /* The possibilities for the third argument to `fseek'. @@ -132,9 +134,9 @@ typedef _G_fpos64_t fpos64_t; /* Standard streams. */ -extern struct _IO_FILE *stdin; /* Standard input stream. */ -extern struct _IO_FILE *stdout; /* Standard output stream. */ -extern struct _IO_FILE *stderr; /* Standard error output stream. */ +extern FILE *stdin; /* Standard input stream. */ +extern FILE *stdout; /* Standard output stream. */ +extern FILE *stderr; /* Standard error output stream. */ /* C89/C99 say they're macros. Make them happy. */ #define stdin stdin #define stdout stdout @@ -270,7 +272,7 @@ extern FILE *fdopen (int __fd, const char *__modes) __THROW __wur; and uses the given functions for input and output. */ extern FILE *fopencookie (void *__restrict __magic_cookie, const char *__restrict __modes, - _IO_cookie_io_functions_t __io_funcs) __THROW __wur; + cookie_io_functions_t __io_funcs) __THROW __wur; #endif #if defined __USE_XOPEN2K8 || __GLIBC_USE (LIB_EXT2) @@ -325,15 +327,15 @@ extern int sprintf (char *__restrict __s, This function is a possible cancellation point and therefore not marked with __THROW. */ extern int vfprintf (FILE *__restrict __s, const char *__restrict __format, - _G_va_list __arg); + __gnuc_va_list __arg); /* Write formatted output to stdout from argument list ARG. This function is a possible cancellation point and therefore not marked with __THROW. */ -extern int vprintf (const char *__restrict __format, _G_va_list __arg); +extern int vprintf (const char *__restrict __format, __gnuc_va_list __arg); /* Write formatted output to S from argument list ARG. */ extern int vsprintf (char *__restrict __s, const char *__restrict __format, - _G_va_list __arg) __THROWNL; + __gnuc_va_list __arg) __THROWNL; #if defined __USE_ISOC99 || defined __USE_UNIX98 /* Maximum chars of output to write in MAXLEN. */ @@ -342,7 +344,7 @@ extern int snprintf (char *__restrict __s, size_t __maxlen, __THROWNL __attribute__ ((__format__ (__printf__, 3, 4))); extern int vsnprintf (char *__restrict __s, size_t __maxlen, - const char *__restrict __format, _G_va_list __arg) + const char *__restrict __format, __gnuc_va_list __arg) __THROWNL __attribute__ ((__format__ (__printf__, 3, 0))); #endif @@ -350,7 +352,7 @@ extern int vsnprintf (char *__restrict __s, size_t __maxlen, /* Write formatted output to a string dynamically allocated with `malloc'. Store the address of the string in *PTR. */ extern int vasprintf (char **__restrict __ptr, const char *__restrict __f, - _G_va_list __arg) + __gnuc_va_list __arg) __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))) __wur; extern int __asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...) @@ -363,7 +365,7 @@ extern int asprintf (char **__restrict __ptr, #ifdef __USE_XOPEN2K8 /* Write formatted output to a file descriptor. */ extern int vdprintf (int __fd, const char *__restrict __fmt, - _G_va_list __arg) + __gnuc_va_list __arg) __attribute__ ((__format__ (__printf__, 2, 0))); extern int dprintf (int __fd, const char *__restrict __fmt, ...) __attribute__ ((__format__ (__printf__, 2, 3))); @@ -418,19 +420,19 @@ extern int __isoc99_sscanf (const char *__restrict __s, This function is a possible cancellation point and therefore not marked with __THROW. */ extern int vfscanf (FILE *__restrict __s, const char *__restrict __format, - _G_va_list __arg) + __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 2, 0))) __wur; /* Read formatted input from stdin into argument list ARG. This function is a possible cancellation point and therefore not marked with __THROW. */ -extern int vscanf (const char *__restrict __format, _G_va_list __arg) +extern int vscanf (const char *__restrict __format, __gnuc_va_list __arg) __attribute__ ((__format__ (__scanf__, 1, 0))) __wur; /* Read formatted input from S into argument list ARG. */ extern int vsscanf (const char *__restrict __s, - const char *__restrict __format, _G_va_list __arg) + const char *__restrict __format, __gnuc_va_list __arg) __THROW __attribute__ ((__format__ (__scanf__, 2, 0))); # if !defined __USE_GNU \ @@ -442,26 +444,26 @@ extern int vsscanf (const char *__restrict __s, s, S or [. */ extern int __REDIRECT (vfscanf, (FILE *__restrict __s, - const char *__restrict __format, _G_va_list __arg), + const char *__restrict __format, __gnuc_va_list __arg), __isoc99_vfscanf) __attribute__ ((__format__ (__scanf__, 2, 0))) __wur; extern int __REDIRECT (vscanf, (const char *__restrict __format, - _G_va_list __arg), __isoc99_vscanf) + __gnuc_va_list __arg), __isoc99_vscanf) __attribute__ ((__format__ (__scanf__, 1, 0))) __wur; extern int __REDIRECT_NTH (vsscanf, (const char *__restrict __s, const char *__restrict __format, - _G_va_list __arg), __isoc99_vsscanf) + __gnuc_va_list __arg), __isoc99_vsscanf) __attribute__ ((__format__ (__scanf__, 2, 0))); # else extern int __isoc99_vfscanf (FILE *__restrict __s, const char *__restrict __format, - _G_va_list __arg) __wur; + __gnuc_va_list __arg) __wur; extern int __isoc99_vscanf (const char *__restrict __format, - _G_va_list __arg) __wur; + __gnuc_va_list __arg) __wur; extern int __isoc99_vsscanf (const char *__restrict __s, const char *__restrict __format, - _G_va_list __arg) __THROW; + __gnuc_va_list __arg) __THROW; # define vfscanf __isoc99_vfscanf # define vscanf __isoc99_vscanf # define vsscanf __isoc99_vsscanf @@ -592,12 +594,12 @@ extern char *fgets_unlocked (char *__restrict __s, int __n, cancellation point. But due to similarity with an POSIX interface or due to the implementation they are cancellation points and therefore not marked with __THROW. */ -extern _IO_ssize_t __getdelim (char **__restrict __lineptr, - size_t *__restrict __n, int __delimiter, - FILE *__restrict __stream) __wur; -extern _IO_ssize_t getdelim (char **__restrict __lineptr, - size_t *__restrict __n, int __delimiter, - FILE *__restrict __stream) __wur; +extern __ssize_t __getdelim (char **__restrict __lineptr, + size_t *__restrict __n, int __delimiter, + FILE *__restrict __stream) __wur; +extern __ssize_t getdelim (char **__restrict __lineptr, + size_t *__restrict __n, int __delimiter, + FILE *__restrict __stream) __wur; /* Like `getdelim', but reads up to a newline. @@ -605,9 +607,9 @@ extern _IO_ssize_t getdelim (char **__restrict __lineptr, cancellation point. But due to similarity with an POSIX interface or due to the implementation it is a cancellation point and therefore not marked with __THROW. */ -extern _IO_ssize_t getline (char **__restrict __lineptr, - size_t *__restrict __n, - FILE *__restrict __stream) __wur; +extern __ssize_t getline (char **__restrict __lineptr, + size_t *__restrict __n, + FILE *__restrict __stream) __wur; #endif @@ -820,7 +822,7 @@ extern int obstack_printf (struct obstack *__restrict __obstack, __THROWNL __attribute__ ((__format__ (__printf__, 2, 3))); extern int obstack_vprintf (struct obstack *__restrict __obstack, const char *__restrict __format, - _G_va_list __args) + __gnuc_va_list __args) __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))); #endif /* Use GNU. */ @@ -845,6 +847,11 @@ extern void funlockfile (FILE *__stream) __THROW; # include <bits/getopt_posix.h> #endif +/* Slow-path routines used by the optimized inline functions in + bits/stdio.h. */ +extern int __uflow (FILE *); +extern int __overflow (FILE *, int); + /* If we are compiling with optimizing read this file. It contains several optimizing inline functions and macros. */ #ifdef __USE_EXTERN_INLINES diff --git a/scripts/check-installed-headers.sh b/scripts/check-installed-headers.sh index 3384e1c3e76..7ffd2b8e749 100644 --- a/scripts/check-installed-headers.sh +++ b/scripts/check-installed-headers.sh @@ -84,11 +84,6 @@ for header in "$@"; do (sys/elf.h) continue;; - # libio.h and _G_config.h are deprecation stubs containing #warnings - # to use stdio.h instead. - (libio.h | _G_config.h) - continue;; - # sys/sysctl.h is unsupported for x32. (sys/sysctl.h) case "$is_x32" in diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h index 9994869098b..05a64acb2cf 100644 --- a/sysdeps/unix/sysv/linux/bits/_G_config.h +++ b/sysdeps/unix/sysv/linux/bits/_G_config.h @@ -4,10 +4,6 @@ #ifndef _BITS_G_CONFIG_H #define _BITS_G_CONFIG_H 1 -#if !defined _BITS_LIBIO_H && !defined _G_CONFIG_H -# error "Never include <bits/_G_config.h> directly; use <stdio.h> instead." -#endif - /* Define types for libio in terms of the standard internal type names. */ #include <bits/types.h> @@ -19,20 +15,16 @@ #include <stddef.h> #include <bits/types/__mbstate_t.h> +#include <bits/types/__fpos_t.h> +#include <bits/types/__fpos64_t.h> + +#define _G_fpos_t __fpos_t +#define _G_fpos64_t __fpos64_t + #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # include <bits/types/wint_t.h> #endif -typedef struct -{ - __off_t __pos; - __mbstate_t __state; -} _G_fpos_t; -typedef struct -{ - __off64_t __pos; - __mbstate_t __state; -} _G_fpos64_t; #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # include <gconv.h> typedef union