Hi Eric,

>  #if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, 
> DragonFly, MacOS X, Cygwin */
> -  fp_->_offset = pos;
> +  /* Use a union, since on NetBSD, the compilation flags determine
> +     whether fpos_t is typedef'd to off_t or a struct containing a
> +     single off_t member.  */
> +  union
> +    {
> +      fpos_t f;
> +      off_t o;
> +    } u;
> +  u.o = pos;
> +  fp_->_offset = u.f;

This is right for platforms for which the '_offset' field is declared as an
'fpos_t'. Thanks. But for the platforms where '_offset' is a scalar type
(_off64_t on Cygwin), and where fpos_t might or might become a struct,
the use of fpos_t is better avoided. I'm therefore applything this (which
currently is a no-op).


2009-12-19  Bruno Haible  <br...@clisp.org>

        fflush: tweak
        * lib/fflush.c (update_fpos_cache): Don't use fpos_t on Cygwin.
        * lib/fseeko.c (rpl_fseeko): Likewise.

--- lib/fflush.c.orig   2009-12-19 12:29:56.000000000 +0100
+++ lib/fflush.c        2009-12-19 12:29:32.000000000 +0100
@@ -91,6 +91,11 @@
 update_fpos_cache (FILE *fp, off_t pos)
 {
 #if defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, 
DragonFly, MacOS X, Cygwin */
+# if defined __CYGWIN__
+  /* fp_->_offset is typed as an integer.  */
+  fp_->_offset = pos;
+# else
+  /* fp_->_offset is an fpos_t.  */
   /* Use a union, since on NetBSD, the compilation flags determine
      whether fpos_t is typedef'd to off_t or a struct containing a
      single off_t member.  */
@@ -101,6 +106,7 @@
     } u;
   u.o = pos;
   fp_->_offset = u.f;
+# endif
   fp_->_flags |= __SOFF;
 #endif
 }
--- lib/fseeko.c.orig   2009-12-19 12:29:56.000000000 +0100
+++ lib/fseeko.c        2009-12-19 11:49:43.000000000 +0100
@@ -110,6 +110,11 @@
 #if defined _IO_ftrylockfile || __GNU_LIBRARY__ == 1 /* GNU libc, BeOS, Haiku, 
Linux libc5 */
       fp->_flags &= ~_IO_EOF_SEEN;
 #elif defined __sferror || defined __DragonFly__ /* FreeBSD, NetBSD, OpenBSD, 
DragonFly, MacOS X, Cygwin */
+# if defined __CYGWIN__
+      /* fp_->_offset is typed as an integer.  */
+      fp_->_offset = pos;
+# else
+      /* fp_->_offset is an fpos_t.  */
       {
         /* Use a union, since on NetBSD, the compilation flags
            determine whether fpos_t is typedef'd to off_t or a struct
@@ -122,6 +127,7 @@
         u.o = pos;
         fp_->_offset = u.f;
       }
+# endif
       fp_->_flags |= __SOFF;
       fp_->_flags &= ~__SEOF;
 #elif defined __EMX__               /* emx+gcc */


Reply via email to