Mercurial > gnulib
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