# HG changeset patch # User Bruno Haible # Date 1209220937 -7200 # Node ID 621cb908233905143a8aa5745f41ed8c976beb91 # Parent 44e4e306d7c5d2d9ae5c52156346d32a450ee39f Put system dependent routines into inline functions. diff --git a/lib/fflush.c b/lib/fflush.c --- a/lib/fflush.c +++ b/lib/fflush.c @@ -29,6 +29,55 @@ #undef fflush +static inline void +clear_ungetc_buffer (FILE *fp) +{ +#if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ +# if defined __NetBSD__ || defined __OpenBSD__ + struct __sfileext + { + struct __sbuf _ub; /* ungetc buffer */ + /* More fields, not relevant here. */ + }; +# define HASUB(fp) (((struct __sfileext *) (fp)->_ext._base)->_ub._base != NULL) +# else +# define HASUB(fp) ((fp)->_ub._base != NULL) +# endif + if (HASUB (fp)) + { + fp->_p += stream->_r; + fp->_r = 0; + } +#endif +} + +#if defined __sferror && defined __SNPT /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ + +static inline int +disable_seek_optimization (FILE *fp) +{ + int saved_flags = fp->_flags & (__SOPT | __SNPT); + fp->_flags = (fp->_flags & ~__SOPT) | __SNPT; + return saved_flags; +} + +static inline void +restore_seek_optimization (FILE *fp, int saved_flags) +{ + fp->_flags = (fp->_flags & ~(__SOPT | __SNPT)) | saved_flags; +} + +#endif + +static inline void +update_fpos_cache (FILE *fp) +{ +#if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ + fp->_offset = pos; + fp->_flags |= __SOFF; +#endif +} + /* Flush all pending data on STREAM according to POSIX rules. Both output and seekable input streams are supported. */ int @@ -80,24 +129,7 @@ _IOERR, because an ungetc() on this platform prepends the pushed-back bytes to the buffer without an indication of the limit between the pushed-back bytes and the read-ahead bytes. */ -#if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ - { -# if defined __NetBSD__ || defined __OpenBSD__ - struct __sfileext - { - struct __sbuf _ub; /* ungetc buffer */ - /* More fields, not relevant here. */ - }; - if (((struct __sfileext *) stream->_ext._base)->_ub._base != NULL) -# else - if (stream->_ub._base != NULL) -# endif - { - stream->_p += stream->_r; - stream->_r = 0; - } - } -#endif + clear_ungetc_buffer (stream); /* POSIX does not specify fflush behavior for non-seekable input streams. Some implementations purge unread data, some return @@ -122,12 +154,11 @@ /* Disable seek optimization for the next fseeko call. This tells the following fseeko call to seek to the desired position directly, rather than to seek to a block-aligned boundary. */ - int saved_flags = stream->_flags & (__SOPT | __SNPT); - stream->_flags = (stream->_flags & ~__SOPT) | __SNPT; + int saved_flags = disable_seek_optimization (stream); result = fseeko (stream, pos, SEEK_SET); - stream->_flags = (stream->_flags & ~(__SOPT | __SNPT)) | saved_flags; + restore_seek_optimization (stream, saved_flags); } return result; @@ -138,10 +169,7 @@ return EOF; /* After a successful lseek, update the file descriptor's position cache in the stream. */ -# if defined __sferror /* FreeBSD, NetBSD, OpenBSD, MacOS X, Cygwin */ - stream->_offset = pos; - stream->_flags |= __SOFF; -# endif + update_fpos_cache (stream); return 0; diff --git a/m4/fflush.m4 b/m4/fflush.m4 --- a/m4/fflush.m4 +++ b/m4/fflush.m4 @@ -1,4 +1,4 @@ -# fflush.m4 serial 5 +# fflush.m4 serial 6 # Copyright (C) 2007-2008 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation @@ -56,4 +56,12 @@ AC_REQUIRE([gl_STDIO_H_DEFAULTS]) REPLACE_FFLUSH=1 REPLACE_FSEEKO=1 + gl_PREREQ_FFLUSH ]) + +# Prerequisites of lib/fflush.c. +AC_DEFUN([gl_PREREQ_FFLUSH], +[ + AC_REQUIRE([AC_C_INLINE]) + : +])