changeset 38232:a9cb3e28511e

stdioext: Port to native Windows with MSVC. * lib/stdio-impl.h (WINDOWS_OPAQUE_FILE): New macro. (struct _gl_real_FILE): New type. (fp_, _IOREAD, _IOWRT, _IORW, _IOEOF, _IOERR): New macros, for native Windows. * lib/fbufmode.c (fbufmode): Add code for native Windows. * lib/fflush.c (clear_ungetc_buffer): Treat native Windows like the other SystemV derived implementations. * lib/fpurge.c (fpurge): Likewise. * lib/freadable.c (freadable): Likewise. * lib/freadahead.c (freadahead): Likewise. * lib/freading.c (freading): Likewise. * lib/freadptr.c (freadptr): Likewise. * lib/freadseek.c (freadptrinc): Likewise. * lib/fseeko.c (fseeko): Likewise. * lib/fseterr.c (fseterr): Likewise. * lib/fwritable.c (fwritable): Likewise. * lib/fwriting.c (fwriting): Likewise. Reported by Gisle Vanem <gvanem@yahoo.no>.
author Bruno Haible <bruno@clisp.org>
date Tue, 13 Dec 2016 01:44:06 +0100
parents 4c55bca59a59
children 0ab656ac6e8e
files ChangeLog lib/fbufmode.c lib/fflush.c lib/fpurge.c lib/freadable.c lib/freadahead.c lib/freading.c lib/freadptr.c lib/freadseek.c lib/fseeko.c lib/fseterr.c lib/fwritable.c lib/fwriting.c lib/stdio-impl.h
diffstat 14 files changed, 81 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/ChangeLog	Sun Dec 11 22:39:42 2016 -0800
+++ b/ChangeLog	Tue Dec 13 01:44:06 2016 +0100
@@ -1,3 +1,25 @@
+2016-12-12  Bruno Haible  <bruno@clisp.org>
+
+	stdioext: Port to native Windows with MSVC.
+	* lib/stdio-impl.h (WINDOWS_OPAQUE_FILE): New macro.
+	(struct _gl_real_FILE): New type.
+	(fp_, _IOREAD, _IOWRT, _IORW, _IOEOF, _IOERR): New macros, for native
+	Windows.
+	* lib/fbufmode.c (fbufmode): Add code for native Windows.
+	* lib/fflush.c (clear_ungetc_buffer): Treat native Windows like the
+	other SystemV derived implementations.
+	* lib/fpurge.c (fpurge): Likewise.
+	* lib/freadable.c (freadable): Likewise.
+	* lib/freadahead.c (freadahead): Likewise.
+	* lib/freading.c (freading): Likewise.
+	* lib/freadptr.c (freadptr): Likewise.
+	* lib/freadseek.c (freadptrinc): Likewise.
+	* lib/fseeko.c (fseeko): Likewise.
+	* lib/fseterr.c (fseterr): Likewise.
+	* lib/fwritable.c (fwritable): Likewise.
+	* lib/fwriting.c (fwriting): Likewise.
+	Reported by Gisle Vanem <gvanem@yahoo.no>.
+
 2016-12-11  Jim Meyering  <meyering@fb.com>
 
 	non-recursive-gnulib-prefix-hack.m4: remove leading "(" in case stmt
--- a/lib/fbufmode.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/fbufmode.c	Tue Dec 13 01:44:06 2016 +0100
@@ -53,17 +53,24 @@
   return fp->_flags & (_IOLBF | _IONBF | _IOFBF);
 #elif defined __minix               /* Minix */
   return fp->_flags & (_IOLBF | _IONBF | _IOFBF);
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
-# if HAVE___FLBF                    /* Solaris >= 7 */
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
+# if defined WINDOWS_OPAQUE_FILE
+  if (fp_->_flag & 0x100)
+    return _IOFBF; /* Impossible to distinguish _IOFBF and _IOLBF.  */
+  else
+    return _IONBF;
+# else
+#  if HAVE___FLBF                   /* Solaris >= 7 */
   if (__flbf (fp))
     return _IOLBF;
-# else
+#  else
   if (fp->_flag & _IOLBF)
     return _IOLBF;
-# endif
+#  endif
   if (fp_->_flag & _IONBF)
     return _IONBF;
   return _IOFBF;
+# endif
 #elif defined __UCLIBC__            /* uClibc */
   if (fp->__modeflags & __FLAG_LBF)
     return _IOLBF;
--- a/lib/fflush.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/fflush.c	Tue Dec 13 01:44:06 2016 +0100
@@ -63,7 +63,7 @@
       fp->_ungetc_count = 0;
       fp->_rcount = - fp->_rcount;
     }
-# elif defined _IOERR               /* Minix, AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+# elif defined _IOERR               /* Minix, AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
   /* Nothing to do.  */
 # else                              /* other implementations */
   fseeko (fp, 0, SEEK_CUR);
--- a/lib/fpurge.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/fpurge.c	Tue Dec 13 01:44:06 2016 +0100
@@ -98,10 +98,10 @@
   if (fp->_ptr != NULL)
     fp->_count = 0;
   return 0;
-# elif defined _IOERR               /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
-  fp->_ptr = fp->_base;
-  if (fp->_ptr != NULL)
-    fp->_cnt = 0;
+# elif defined _IOERR               /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
+  fp_->_ptr = fp_->_base;
+  if (fp_->_ptr != NULL)
+    fp_->_cnt = 0;
   return 0;
 # elif defined __UCLIBC__           /* uClibc */
 #  ifdef __STDIO_BUFFERS
--- a/lib/freadable.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/freadable.c	Tue Dec 13 01:44:06 2016 +0100
@@ -40,8 +40,8 @@
   return (fp->_flags & (_IORW | _IOREAD)) != 0;
 #elif defined __minix               /* Minix */
   return (fp->_flags & _IOREAD) != 0;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
-  return (fp->_flag & (_IORW | _IOREAD)) != 0;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
+  return (fp_->_flag & (_IORW | _IOREAD)) != 0;
 #elif defined __QNX__               /* QNX */
   return (fp->_Mode & 0x1 /* _MOPENR */) != 0;
 #elif defined __MINT__              /* Atari FreeMiNT */
--- a/lib/freadahead.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/freadahead.c	Tue Dec 13 01:44:06 2016 +0100
@@ -53,7 +53,7 @@
   if ((fp_->_flags & _IOWRITING) != 0)
     return 0;
   return fp_->_count;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
   if ((fp_->_flag & _IOWRT) != 0)
     return 0;
   return fp_->_cnt;
--- a/lib/freading.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/freading.c	Tue Dec 13 01:44:06 2016 +0100
@@ -42,11 +42,11 @@
   return (fp->_flags & _IOREAD) != 0;
 # elif defined __minix               /* Minix */
   return (fp->_flags & _IOREADING) != 0;
-# elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+# elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
 #  if defined __sun                  /* Solaris */
-  return (fp->_flag & _IOREAD) != 0 && (fp->_flag & _IOWRT) == 0;
+  return (fp_->_flag & _IOREAD) != 0 && (fp_->_flag & _IOWRT) == 0;
 #  else
-  return (fp->_flag & _IOREAD) != 0;
+  return (fp_->_flag & _IOREAD) != 0;
 #  endif
 # elif defined __UCLIBC__            /* uClibc */
   return (fp->__modeflags & (__FLAG_READONLY | __FLAG_READING)) != 0;
--- a/lib/freadptr.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/freadptr.c	Tue Dec 13 01:44:06 2016 +0100
@@ -65,7 +65,7 @@
     return NULL;
   *sizep = size;
   return (const char *) fp_->_ptr;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
   if ((fp_->_flag & _IOWRT) != 0)
     return NULL;
   size = fp_->_cnt;
--- a/lib/freadseek.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/freadseek.c	Tue Dec 13 01:44:06 2016 +0100
@@ -48,7 +48,7 @@
 #elif defined __minix               /* Minix */
   fp_->_ptr += increment;
   fp_->_count -= increment;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
   fp_->_ptr += increment;
   fp_->_cnt -= increment;
 #elif defined __UCLIBC__            /* uClibc */
--- a/lib/fseeko.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/fseeko.c	Tue Dec 13 01:44:06 2016 +0100
@@ -80,7 +80,7 @@
 #elif defined __minix               /* Minix */
   if (fp_->_ptr == fp_->_buf
       && (fp_->_ptr == NULL || fp_->_count == 0))
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
   if (fp_->_ptr == fp_->_base
       && (fp_->_ptr == NULL || fp_->_cnt == 0))
 #elif defined __UCLIBC__            /* uClibc */
@@ -150,8 +150,8 @@
       fp_->_flags &= ~__SEOF;
 #elif defined __EMX__               /* emx+gcc */
       fp->_flags &= ~_IOEOF;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
-      fp->_flag &= ~_IOEOF;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
+      fp_->_flag &= ~_IOEOF;
 #elif defined __MINT__              /* Atari FreeMiNT */
       fp->__offset = pos;
       fp->__eof = 0;
--- a/lib/fseterr.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/fseterr.c	Tue Dec 13 01:44:06 2016 +0100
@@ -38,7 +38,7 @@
   fp->_flags |= _IOERR;
 #elif defined __minix               /* Minix */
   fp->_flags |= _IOERR;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
   fp_->_flag |= _IOERR;
 #elif defined __UCLIBC__            /* uClibc */
   fp->__modeflags |= __FLAG_ERROR;
--- a/lib/fwritable.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/fwritable.c	Tue Dec 13 01:44:06 2016 +0100
@@ -40,8 +40,8 @@
   return (fp->_flags & (_IORW | _IOWRT)) != 0;
 #elif defined __minix               /* Minix */
   return (fp->_flags & _IOWRITE) != 0;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
-  return (fp->_flag & (_IORW | _IOWRT)) != 0;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
+  return (fp_->_flag & (_IORW | _IOWRT)) != 0;
 #elif defined __QNX__               /* QNX */
   return (fp->_Mode & 0x2 /* _MOPENW */) != 0;
 #elif defined __MINT__              /* Atari FreeMiNT */
--- a/lib/fwriting.c	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/fwriting.c	Tue Dec 13 01:44:06 2016 +0100
@@ -36,8 +36,8 @@
   return (fp->_flags & _IOWRT) != 0;
 #elif defined __minix               /* Minix */
   return (fp->_flags & _IOWRITING) != 0;
-#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, NonStop Kernel */
-  return (fp->_flag & _IOWRT) != 0;
+#elif defined _IOERR                /* AIX, HP-UX, IRIX, OSF/1, Solaris, OpenServer, mingw, MSVC, NonStop Kernel */
+  return (fp_->_flag & _IOWRT) != 0;
 #elif defined __UCLIBC__            /* uClibc */
   return (fp->__modeflags & __FLAG_WRITING) != 0;
 #elif defined __QNX__               /* QNX */
--- a/lib/stdio-impl.h	Sun Dec 11 22:39:42 2016 -0800
+++ b/lib/stdio-impl.h	Tue Dec 13 01:44:06 2016 +0100
@@ -110,4 +110,31 @@
 #  define _flag __flag
 # endif
 
+#elif (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__  /* newer Windows with MSVC */
+
+/* <stdio.h> does not define the innards of FILE any more.  */
+# define WINDOWS_OPAQUE_FILE
+
+struct _gl_real_FILE
+{
+  /* Note: Compared to older Windows and to mingw, it has the fields
+     _base and _cnt swapped. */
+  unsigned char *_ptr;
+  unsigned char *_base;
+  int _cnt;
+  int _flag;
+  int _file;
+  int _charbuf;
+  int _bufsiz;
+};
+# define fp_ ((struct _gl_real_FILE *) fp)
+
+/* These values were determined by a program similar to the one at
+   <http://lists.gnu.org/archive/html/bug-gnulib/2010-12/msg00165.html>.  */
+# define _IOREAD   0x1
+# define _IOWRT    0x2
+# define _IORW     0x4
+# define _IOEOF    0x8
+# define _IOERR   0x10
+
 #endif