From patchwork Mon Jan 8 16:59:54 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zack Weinberg X-Patchwork-Id: 856916 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-88944-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="Gsor765B"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3zFhNj5zzSz9s7f for ; Tue, 9 Jan 2018 04:00:37 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; q=dns; s=default; b=hEi q895KhduT8GNgPIOVCamFsuj2rCLb5Rq3on4gBuoNCsi/EAUxKPrnEtFWRfai6Lu dSmory0CGLTSMLR4ONAeSCvBkPqtrTkRj5sUjLGQYMZvNB1OE0EDX8nMG1m1WpEu 78M5Nwlg2iJaNE7/5EQvVa3VToKu/8BPtm9DPR8U= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; s=default; bh=N0PbJh1jT +ko+fc7nmGqJPOFHy8=; b=Gsor765BRAmNcRUCVansnXMp5ZtEkwkwhsDxwY5ua 3Zw3e3OmIigX8LKUZXhW87gmBzKDNqKNOH/BG2X5yJmlu/j+BDKfzwp8FSIeaWHo vGu3jMLMn2ARVlB8vrwVutvpDUtPSrjx1Uwnnl3jd+Y8Kmu2+H4YUphc2PKjMFRl WU= Received: (qmail 122419 invoked by alias); 8 Jan 2018 17:00:27 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 117102 invoked by uid 89); 8 Jan 2018 17:00:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.7 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_SHORT, SPF_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=985, cookies, inclusion, 32515 X-HELO: mailbackend.panix.com From: Zack Weinberg To: libc-alpha@sourceware.org Cc: fweimer@redhat.com, joseph@codesourcery.com Subject: [PATCH] Don't include libio.h from the installed stdio.h. Date: Mon, 8 Jan 2018 11:59:54 -0500 Message-Id: <20180108165954.6301-1-zackw@panix.com> MIME-Version: 1.0 This patch removes the #include of libio.h from the installed stdio.h, and eradicates all uses of _IO_ and _G_ symbols from public, standard headers. A few such names are preserved as struct tags to avoid changing C++ mangled names. A potentially surprising consequence is that putc and getc are no longer macros; they were never _required_ to be macros, and the macros just expanded to _IO_-prefixed names which aliased back to the same functions. Also, the awkward truth that we require to define a type named __gnuc_va_list is now front and center in stdio.h, instead of hidden behind a typedef. Within glibc, however, libio.h is still pulled in as a side effect of including stdio.h; this minimizes internal fallout from the change. A couple of files in stdio-common that were unnecessarily redefining standard symbols had to be adjusted. libio.h and _G_config.h are still installed at this stage. I am open to the possibility of ceasing to install them altogether, but I think that should be a separate patch. This passes the testsuite on x86-64-linux-gnu. A build-many-glibcs cycle is in progress. * libio/bits/types/__fpos64_t.h, libio/bits/types/__fpos_t.h * libio/bits/types/cookie_io_functions_t.h: New single-type headers. * libio/bits/types/struct_FILE.h: New header containing the complete definitions of struct _IO_FILE and struct _IO_FILE_complete and a few ancillary definitions. * include/bits/types/__fpos64_t.h, include/bits/types/__fpos_t.h * include/bits/types/cookie_io_functions_t.h * include/bits/types/struct_FILE.h: New wrappers. * libio/Makefile: Install the new headers. * libio/stdio.h: Don't include bits/libio.h. Don't define _STDIO_USES_IOSTREAM. Declare __uflow and __overflow here. Get __gnuc_va_list directly from stdarg.h. Get __fpos_t, __fpos64_t, and cookie_io_functions_t from the new headers. Don't use _G_ names when defining va_list, fpos_t, or fpos64_t. Define BUFSIZ unconditionally as 8192, and EOF unconditionally as (-1). Declare stdin, stdout, and stderr with type FILE. Use cookie_io_functions_t instead of _IO_cookie_io_functions_t, __gnuc_va_list instead of _G_va_list, and __ssize_t instead of _IO_ssize_t. Don't define getc or putc as macros. * libio/bits/stdio.h, libio/bits/stdio2.h: Use __ssize_t instead of _IO_ssize_t, and __gnuc_va_list instead of _G_va_list. * libio/bits/stdio.h: Add multiple inclusion guard. Include bits/types/struct_FILE.h. Use getc, not _IO_getc; putc, not _IO_putc; __getc_unlocked_body, not _IO_getc_unlocked; __putc_unlocked_body, not _IO_putc_unlocked; __feof_unlocked_body, not _IO_feof_unlocked; __ferror_unlocked_body, not _IO_ferror_unlocked. * libio/bits/stdio2.h: Add multiple inclusion guard. Use getc_unlocked, not _IO_getc_unlocked. * include/stdio.h: When _ISOMAC is not defined, include stdio-lock.h before libio/stdio.h, and bits/libio.h after. * libio/bits/libio.h: Include stdio.h and don't repeat anything that it does. Permit direct inclusion by libio.h, iolibio.h, libioP.h, and include/stdio.h, but not by the installed stdio.h. Define _IO_BUFSIZ as BUFSIZ, _IO_fpos_t as __fpos_t, _IO_fpos64_t as __fpos64_t, _IO_va_list as __gnuc_va_list, __io_read_fn as cookie_read_fn_t, __io_write_fn as cookie_write_fn_t, __io_seek_fn as cookie_seek_fn_t, __io_close_fn as cookie_close_fn_t, and _IO_cookie_io_functions_t as cookie_io_functions_t. Define _STDIO_USES_IOSTREAM here. Move __HAVE_COLUMN and _IO_file_flags to the set of compatibility defines. Get definition of _IO_FILE and fallback definition of _IO_lock_t from bits/types/struct_FILE.h. Use macros from bits/types/struct_FILE.h for _IO_getc_unlocked, _IO_putc_unlocked, _IO_feof_unlocked, and _IO_ferror_unlocked. Remove some #if 0 blocks and redundant prototypes. * libio/iolibio.h: Add a multiple include guard. Include bits/libio.h after stdio.h. * libioP.h: Add a multiple include guard. Include stdio.h and bits/libio.h before iolibio.h. * bits/_G_config.h, sysdeps/unix/sysv/linux/_G_config.h: Get definitions of __fpos_t and __fpos64_t from the new headers. Define _G_fpos_t as __fpos_t and _G_fpos64_t as __fpos64_t. * conform/data/stdio.h-data: Use __gnuc_va_list instead of _G_va_list. * stdio-common/tstgetln.c: Don't redefine ssize_t. * stdio-common/vfprintf.c: Don't redefine FILE, va_list, or BUFSIZ. --- NEWS | 14 +- bits/_G_config.h | 16 +-- 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 | 4 +- libio/bits/libio.h | 198 ++++------------------------- libio/bits/stdio.h | 35 +++-- 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 | 103 +++++++++++++++ libio/iolibio.h | 6 + libio/libioP.h | 7 + libio/stdio.h | 101 +++++++-------- stdio-common/tstgetln.c | 2 - stdio-common/vfprintf.c | 7 +- sysdeps/unix/sysv/linux/bits/_G_config.h | 16 +-- 22 files changed, 343 insertions(+), 290 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 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 diff --git a/NEWS b/NEWS index 0d6f826dcc..e5d9e2b291 100644 --- a/NEWS +++ b/NEWS @@ -141,16 +141,16 @@ Deprecated and removed features, and other changes affecting compatibility: * The tilepro-*-linux-gnu configuration is no longer supported. -* The nonstandard header files and <_G_config.h> are deprecated - and will be removed in a future release. Software that is still using - either header should be updated to use standard interfaces - instead. +* The nonstandard header files and <_G_config.h> are deprecated. + no longer includes either of them, and they will be removed in a + future release. Software that is still using these headers, or their + contents, should be updated to use standard interfaces instead. libio.h was originally the header for a set of supported GNU extensions, but they have not been maintained as such in many years, they are now - standing in the way of improvements to stdio, and we don't think there are - any remaining external users. _G_config.h was never intended for public - use, but predates the bits convention. + standing in the way of improvements to stdio, and we are not aware of any + remaining external users. _G_config.h was never intended for public use, + but predates the "bits" convention for private-but-installed headers. Changes to build and runtime requirements: diff --git a/bits/_G_config.h b/bits/_G_config.h index 2b60d29f5f..701430f47e 100644 --- a/bits/_G_config.h +++ b/bits/_G_config.h @@ -19,20 +19,16 @@ #include #include +#include +#include + +#define _G_fpos_t __fpos_t +#define _G_fpos64_t __fpos64_t + #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # include #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 typedef union diff --git a/conform/data/stdio.h-data b/conform/data/stdio.h-data index f69802cc70..3ef2460661 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 0000000000..68cc4e8b66 --- /dev/null +++ b/include/bits/types/__fpos64_t.h @@ -0,0 +1 @@ +#include diff --git a/include/bits/types/__fpos_t.h b/include/bits/types/__fpos_t.h new file mode 100644 index 0000000000..2dcdc98d75 --- /dev/null +++ b/include/bits/types/__fpos_t.h @@ -0,0 +1 @@ +#include 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 0000000000..87f7930c6e --- /dev/null +++ b/include/bits/types/cookie_io_functions_t.h @@ -0,0 +1 @@ +#include diff --git a/include/bits/types/struct_FILE.h b/include/bits/types/struct_FILE.h new file mode 100644 index 0000000000..971407292b --- /dev/null +++ b/include/bits/types/struct_FILE.h @@ -0,0 +1 @@ +#include diff --git a/include/stdio.h b/include/stdio.h index f1e987ae5e..3b6da17d82 100644 --- a/include/stdio.h +++ b/include/stdio.h @@ -1,6 +1,11 @@ #ifndef _STDIO_H +# if !defined _ISOMAC && defined _IO_MTSAFE_IO +# include +# endif # include # ifndef _ISOMAC +# define _LIBC_STDIO_H 1 +# include /* Now define the internal interfaces. */ diff --git a/libio/Makefile b/libio/Makefile index 918a86bb74..309fa501d2 100644 --- a/libio/Makefile +++ b/libio/Makefile @@ -25,7 +25,9 @@ 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 + 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/bits/libio.h b/libio/bits/libio.h index fae5b932a1..1c5658715b 100644 --- a/libio/bits/libio.h +++ b/libio/bits/libio.h @@ -28,14 +28,18 @@ #ifndef _BITS_LIBIO_H #define _BITS_LIBIO_H 1 -#if !defined _STDIO_H && !defined _LIBIO_H -# error "Never include directly; use instead." +#if !defined _LIBIO_H && !defined _IOLIBIO_H && \ + !defined _LIBIOP_H && !defined _LIBC_STDIO_H +# error "Never include directly; use instead." #endif +#include +#include + #include /* 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 +48,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 -#ifdef __GNUC_VA_LIST -# undef _IO_va_list -# define _IO_va_list __gnuc_va_list -#endif /* __GNUC_VA_LIST */ - -#ifndef __P -# include -#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 +127,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 +138,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 +206,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 +227,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 +248,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 +260,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 +281,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 d287083de1..90b523a7be 100644 --- a/libio/bits/stdio.h +++ b/libio/bits/stdio.h @@ -16,10 +16,15 @@ License along with the GNU C Library; if not, see . */ +#ifndef _BITS_STDIO_H +#define _BITS_STDIO_H 1 + #ifndef _STDIO_H # error "Never include directly; use instead." #endif +#include + #ifndef __extern_inline # define __STDIO_INLINE inline #else @@ -33,7 +38,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); } @@ -43,7 +48,7 @@ vprintf (const char *__restrict __fmt, _G_va_list __arg) __STDIO_INLINE int getchar (void) { - return _IO_getc (stdin); + return getc (stdin); } @@ -52,7 +57,7 @@ getchar (void) __STDIO_INLINE int fgetc_unlocked (FILE *__fp) { - return _IO_getc_unlocked (__fp); + return __getc_unlocked_body (__fp); } # endif /* misc */ @@ -62,14 +67,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 */ @@ -78,7 +83,7 @@ getchar_unlocked (void) __STDIO_INLINE int putchar (int __c) { - return _IO_putc (__c, stdout); + return putc (__c, stdout); } @@ -87,7 +92,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 +102,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 +129,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 +156,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 +179,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 +193,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 55302e91d0..11651506a6 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 . */ +#ifndef _BITS_STDIO2_H +#define _BITS_STDIO2_H 1 + #ifndef _STDIO_H # error "Never include directly; use 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 0000000000..000091abbb --- /dev/null +++ b/libio/bits/types/__fpos64_t.h @@ -0,0 +1,16 @@ +#ifndef _____fpos64_t_defined +#define _____fpos64_t_defined 1 + +#include +#include + +/* Note: 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 0000000000..9df18701d7 --- /dev/null +++ b/libio/bits/types/__fpos_t.h @@ -0,0 +1,16 @@ +#ifndef _____fpos_t_defined +#define _____fpos_t_defined 1 + +#include +#include + +/* Note: 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 0000000000..4d31c1ff7e --- /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 + +/* 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. + Note: 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 0000000000..a7598886f4 --- /dev/null +++ b/libio/bits/types/struct_FILE.h @@ -0,0 +1,103 @@ +#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 + +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 + +/* Note: 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 libio.h. */ +#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 621b31cff1..7814b1d4e5 100644 --- a/libio/iolibio.h +++ b/libio/iolibio.h @@ -1,4 +1,8 @@ +#ifndef _IOLIBIO_H +#define _IOLIBIO_H 1 + #include +#include /* 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/libioP.h b/libio/libioP.h index 068ceb2615..ac66f95f8d 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 #include @@ -39,6 +42,8 @@ #include +#include +#include #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 95bc902a82..cafcb1819a 100644 --- a/libio/stdio.h +++ b/libio/stdio.h @@ -32,18 +32,23 @@ __BEGIN_DECLS #define __need_NULL #include +#define __need___va_list +#include + #include +#include +#include #include #include -#define _STDIO_USES_IOSTREAM - -#include +#ifdef __USE_GNU +# include +#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 +80,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 +95,11 @@ 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 +/* End of file character. */ +#define EOF (-1) /* The possibilities for the third argument to `fseek'. @@ -132,9 +132,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 +270,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 +325,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 +342,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 +350,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 +363,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 +418,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 +442,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 @@ -483,10 +483,6 @@ extern int getc (FILE *__stream); marked with __THROW. */ extern int getchar (void); -/* The C standard explicitly says this is a macro, so we always do the - optimization for it. */ -#define getc(_fp) _IO_getc (_fp) - #ifdef __USE_POSIX199506 /* These are defined in POSIX.1:1996. @@ -523,10 +519,6 @@ extern int putc (int __c, FILE *__stream); marked with __THROW. */ extern int putchar (int __c); -/* The C standard explicitly says this can be a macro, - so we always do the optimization for it. */ -#define putc(_ch, _fp) _IO_putc (_ch, _fp) - #ifdef __USE_MISC /* Faster version when locking is not necessary. @@ -600,12 +592,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. @@ -613,9 +605,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 @@ -828,7 +820,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. */ @@ -853,6 +845,11 @@ extern void funlockfile (FILE *__stream) __THROW; # include #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/stdio-common/tstgetln.c b/stdio-common/tstgetln.c index a18f754e35..6960e68620 100644 --- a/stdio-common/tstgetln.c +++ b/stdio-common/tstgetln.c @@ -16,8 +16,6 @@ . */ #include -#undef ssize_t -#define ssize_t _IO_ssize_t int main (int argc, char *argv[]) diff --git a/stdio-common/vfprintf.c b/stdio-common/vfprintf.c index 3b87740dd9..a2cab30685 100644 --- a/stdio-common/vfprintf.c +++ b/stdio-common/vfprintf.c @@ -39,13 +39,8 @@ Beside this it is also shared between the normal and wide character implementation as defined in ISO/IEC 9899:1990/Amendment 1:1995. */ - #include -#define FILE _IO_FILE -#undef va_list -#define va_list _IO_va_list -#undef BUFSIZ -#define BUFSIZ _IO_BUFSIZ + /* In some cases we need extra space for all the output which is not counted in the width of the string. We assume 32 characters is enough. */ diff --git a/sysdeps/unix/sysv/linux/bits/_G_config.h b/sysdeps/unix/sysv/linux/bits/_G_config.h index 9994869098..338150291f 100644 --- a/sysdeps/unix/sysv/linux/bits/_G_config.h +++ b/sysdeps/unix/sysv/linux/bits/_G_config.h @@ -19,20 +19,16 @@ #include #include +#include +#include + +#define _G_fpos_t __fpos_t +#define _G_fpos64_t __fpos64_t + #if defined _LIBC || defined _GLIBCPP_USE_WCHAR_T # include #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 typedef union