From: Bruno Haible Date: Sat, 26 Apr 2008 14:42:17 +0000 (+0200) Subject: Put system dependent routines into inline functions. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=02a3c7672c7d677774cf01038f57ab00d73b42d2;p=pspp Put system dependent routines into inline functions. --- diff --git a/lib/fflush.c b/lib/fflush.c index 4d2abc9cbc..5317d2b908 100644 --- 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 @@ rpl_fflush (FILE *stream) _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 @@ rpl_fflush (FILE *stream) /* 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 @@ rpl_fflush (FILE *stream) 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 index e985ffe483..97f12843d4 100644 --- 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_DEFUN([gl_REPLACE_FFLUSH], 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]) + : ])