]> Savannah Git Hosting - gnulib.git/commitdiff
fpending: Port to native Windows with MSVC.
authorBruno Haible <bruno@clisp.org>
Tue, 13 Dec 2016 10:19:35 +0000 (11:19 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 13 Dec 2016 10:19:35 +0000 (11:19 +0100)
* lib/fpending.c: Include stdio-impl.h.
(__fpending): Include all known implementations. Err out if it's not
ported.
* m4/fpending.m4 (gl_PREREQ_FPENDING): Remove macro.
* modules/fpending (Files): Add lib/stdio-impl.h.
(configure.ac): Don't invoke gl_PREREQ_FPENDING.

ChangeLog
lib/fpending.c
m4/fpending.m4
modules/fpending

index 37c1a9a931df15cd64d2438f202ce17fda044e04..a5e6f7ebbc4629cec37e8a0002f902774a99e33c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2016-12-12  Bruno Haible  <bruno@clisp.org>
+
+       fpending: Port to native Windows with MSVC.
+       * lib/fpending.c: Include stdio-impl.h.
+       (__fpending): Include all known implementations. Err out if it's not
+       ported.
+       * m4/fpending.m4 (gl_PREREQ_FPENDING): Remove macro.
+       * modules/fpending (Files): Add lib/stdio-impl.h.
+       (configure.ac): Don't invoke gl_PREREQ_FPENDING.
+
 2016-12-12  Bruno Haible  <bruno@clisp.org>
 
        stdioext: Port to native Windows with MSVC.
index a503b9f53ae3e157d2a4eb40f4ed855806af2731..ce93604e518fc0d2fe169209a9c1f9f3845a82bc 100644 (file)
 
 #include <config.h>
 
+/* Specification.  */
 #include "fpending.h"
 
+#include "stdio-impl.h"
+
 /* Return the number of pending (aka buffered, unflushed)
    bytes on the stream, FP, that is open for writing.  */
 size_t
 __fpending (FILE *fp)
 {
-  return PENDING_OUTPUT_N_BYTES;
+  /* Most systems provide FILE as a struct and the necessary bitmask in
+     <stdio.h>, because they need it for implementing getc() and putc() as
+     fast macros.  */
+#if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, Linux libc5 */
+  return fp->_IO_write_ptr - fp->_IO_write_base;
+#elif defined __sferror || defined __DragonFly__ || defined __ANDROID__
+  /* FreeBSD, NetBSD, OpenBSD, DragonFly, Mac OS X, Cygwin, Android */
+  return fp->_p - fp->_bf._base;
+#elif defined __EMX__                /* emx+gcc */
+  return fp->_ptr - fp->_buffer;
+#elif defined __minix                /* Minix */
+  return fp_->_ptr - fp_->_buf;
+#elif defined _IOERR                 /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
+  return (fp_->_ptr ? fp_->_ptr - fp_->_base : 0);
+#elif defined __UCLIBC__             /* uClibc */
+  return (fp->__modeflags & __FLAG_WRITING ? fp->__bufpos - fp->__bufstart : 0);
+#elif defined __QNX__                /* QNX */
+  return (fp->_Mode & 0x2000 /*_MWRITE*/ ? fp->_Next - fp->_Buf : 0);
+#elif defined __MINT__               /* Atari FreeMiNT */
+  return fp->__bufp - fp->__buffer;
+#elif defined EPLAN9                 /* Plan9 */
+  return fp->wp - fp->buf;
+#elif defined __VMS                  /* VMS */
+  return (*fp)->_ptr - (*fp)->_base;
+#else
+# error "Please port gnulib fpending.c to your platform!"
+  return 1;
+#endif
 }
index a446156df2f3a5e72d34b84d62942515ce4a4501..f6776a83e691f84f5c085147de0d5eea59ea3954 100644 (file)
@@ -1,4 +1,4 @@
-# serial 21
+# serial 22
 
 # Copyright (C) 2000-2001, 2004-2016 Free Software Foundation, Inc.
 # This file is free software; the Free Software Foundation
@@ -11,7 +11,7 @@ dnl and Ulrich Drepper.
 
 dnl Find out how to determine the number of pending output bytes on a stream.
 dnl glibc (2.1.93 and newer) and Solaris provide __fpending.  On other systems,
-dnl we have to grub around in the FILE struct.
+dnl we have to grub around in the (possibly opaque) FILE struct.
 
 AC_DEFUN([gl_FUNC_FPENDING],
 [
@@ -34,66 +34,3 @@ AC_DEFUN([gl_FUNC_FPENDING],
     AC_CHECK_DECLS([__fpending], [], [], [$fp_headers])
   fi
 ])
-
-AC_DEFUN([gl_PREREQ_FPENDING],
-[
-  AC_CACHE_CHECK(
-              [how to determine the number of pending output bytes on a stream],
-                 ac_cv_sys_pending_output_n_bytes,
-    [
-      for ac_expr in                                                    \
-                                                                        \
-          '# glibc2'                                                    \
-          'fp->_IO_write_ptr - fp->_IO_write_base'                      \
-                                                                        \
-          '# traditional Unix'                                          \
-          'fp->_ptr - fp->_base'                                        \
-                                                                        \
-          '# BSD'                                                       \
-          'fp->_p - fp->_bf._base'                                      \
-                                                                        \
-          '# SCO, Unixware'                                             \
-          '(fp->__ptr ? fp->__ptr - fp->__base : 0)'                    \
-                                                                        \
-          '# QNX'                                                       \
-          '(fp->_Mode & 0x2000 /*_MWRITE*/ ? fp->_Next - fp->_Buf : 0)' \
-                                                                        \
-          '# old glibc?'                                                \
-          'fp->__bufp - fp->__buffer'                                   \
-                                                                        \
-          '# old glibc iostream?'                                       \
-          'fp->_pptr - fp->_pbase'                                      \
-                                                                        \
-          '# emx+gcc'                                                   \
-          'fp->_ptr - fp->_buffer'                                      \
-                                                                        \
-          '# Minix'                                                     \
-          'fp->_ptr - fp->_buf'                                         \
-                                                                        \
-          '# Plan9'                                                     \
-          'fp->wp - fp->buf'                                            \
-                                                                        \
-          '# VMS'                                                       \
-          '(*fp)->_ptr - (*fp)->_base'                                  \
-                                                                        \
-          '# e.g., DGUX R4.11; the info is not available'               \
-          1                                                             \
-          ; do
-
-        # Skip each embedded comment.
-        case "$ac_expr" in '#'*) continue;; esac
-
-        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],
-          [[FILE *fp = stdin; (void) ($ac_expr);]])],
-          [fp_done=yes]
-        )
-        test "$fp_done" = yes && break
-      done
-
-      ac_cv_sys_pending_output_n_bytes=$ac_expr
-    ]
-  )
-  AC_DEFINE_UNQUOTED([PENDING_OUTPUT_N_BYTES],
-    $ac_cv_sys_pending_output_n_bytes,
-    [the number of pending output bytes on stream 'fp'])
-])
index 1375eb1b28f19ed2ceb111612caed9abca59c458..8dc4bee427db62ad84b26638ade0e5c0f30147e9 100644 (file)
@@ -4,6 +4,7 @@ Determine the number of bytes waiting in the output buffer of a stream.
 Files:
 lib/fpending.h
 lib/fpending.c
+lib/stdio-impl.h
 m4/fpending.m4
 
 Depends-on:
@@ -12,7 +13,6 @@ configure.ac:
 gl_FUNC_FPENDING
 if test $gl_cv_func___fpending = no; then
   AC_LIBOBJ([fpending])
-  gl_PREREQ_FPENDING
 fi
 
 Makefile.am: