W dniu 26.11.2018 o 12:36, Jacek Caban pisze: > Hi Mateusz, > > > The patch looks mostly good to me. > > > On 23/11/2018 22:37, Mateusz wrote: >> --- a/mingw-w64-headers/crt/stdio.h >> +++ b/mingw-w64-headers/crt/stdio.h >> @@ -609,31 +609,20 @@ int vsnprintf (char *__stream, size_t __n, const char >> *__format, __builtin_va_li >> /* Shouldn't be any fseeko32 in glibc, 32bit to 64bit casting should >> be fine */ >> /* int fseeko32(FILE* stream, _off_t offset, int whence);*/ /* fseeko32 >> redirects to fseeko64 */ >> -#if __MSVCRT_VERSION__ >= 0x1400 >> +#if __MSVCRT_VERSION__ >= 0x900 >> // Mark these as _CRTIMP to avoid trying to link in the mingwex versions. >> _CRTIMP int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin); >> _CRTIMP __int64 __cdecl _ftelli64(FILE *_File); >> - __mingw_static_ovr int fseeko(FILE *_File, _off_t _Offset, int _Origin) { >> - return fseek(_File, _Offset, _Origin); >> - } >> - __mingw_static_ovr int fseeko64(FILE *_File, _off64_t _Offset, int >> _Origin) { >> - return _fseeki64(_File, _Offset, _Origin); >> - } >> - __mingw_static_ovr _off_t ftello(FILE *_File) { >> - return ftell(_File); >> - } >> - __mingw_static_ovr _off64_t ftello64(FILE *_File) { >> - return _ftelli64(_File); >> - } >> #else >> __MINGW_EXTENSION int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int >> _Origin); >> __MINGW_EXTENSION __int64 __cdecl _ftelli64(FILE *_File); >> +#endif > > I would suggest to get rid of #if here and simply always use _CRTIMP without > __MINGW_EXTENSION. This would require adding symbols with __MINGW_IMP_SYMBOL > to symbols in fseeki64.c.
Thanks for the suggestion -- new patch attached with __MINGW_IMP_SYMBOL. I decided to not remove mingw_dosmaperr function -- it is safer and I found in some project the code: #ifndef WIN_32 #define _dosmaperr mingw_dosmaperr There is a problem with libmsvcr80 -- it is not working for me at all, error output from CMake: The C compiler "F:/MSYS/m64-731/bin/gcc.exe" is not able to compile a simple test program. It fails with the following output: Change Dir: F:/x265/ma/12-b/CMakeFiles/CMakeTmp Run Build Command:"F:/MSYS/bin/make.exe" "cmTC_1e936/fast" /usr/bin/make -f CMakeFiles/cmTC_1e936.dir/build.make CMakeFiles/cmTC_1e936.dir/build make[1]: Entering directory `/f/x265/ma/12-b/CMakeFiles/CMakeTmp' Building C object CMakeFiles/cmTC_1e936.dir/testCCompiler.c.obj /F/MSYS/m64-731/bin/gcc.exe -o CMakeFiles/cmTC_1e936.dir/testCCompiler.c.obj -c /F/x265/ma/12-b/CMakeFiles/CMakeTmp/testCCompiler.c Linking C executable cmTC_1e936.exe /F/cmake/bin/cmake.exe -E remove -f CMakeFiles/cmTC_1e936.dir/objects.a /F/MSYS/m64-731/bin/ar.exe cr CMakeFiles/cmTC_1e936.dir/objects.a @CMakeFiles/cmTC_1e936.dir/objects1.rsp /F/MSYS/m64-731/bin/gcc.exe -Wl,--whole-archive CMakeFiles/cmTC_1e936.dir/objects.a -Wl,--no-whole-archive -o cmTC_1e936.exe -Wl,--out-implib,libcmTC_1e936.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/cmTC_1e936.dir/linklibs.rsp f:/msys/m64-731/bin/../lib/gcc/x86_64-w64-mingw32/7.3.1/../../../../x86_64-w64-mingw32/bin/ld.exe: f:/msys/m64-731/bin/../lib/gcc/x86_64-w64-mingw32/7.3.1/../../../../x86_64-w64-mingw32/lib/../lib/crt2.o:crtexe.c:(.text+0x270): undefined reference to `_set_invalid_parameter_handler' collect2.exe: error: ld returned 1 exit status I decide to not touch libmsvcr80 at all, because it is not working. Regards, Mateusz
From 7ffedc542531e01cc76242ff96c6b96593779a26 Mon Sep 17 00:00:00 2001 From: Mateusz Brzostek <mateu...@poczta.onet.pl> Date: Mon, 26 Nov 2018 20:17:22 +0100 Subject: [PATCH] move _fseeki64 and _ftelli64 functions from libmingwex to libmsvcrt _fseeki64 and _ftelli64 functions are already in libmsvcr90 and newer, so we need to provide these functions only for libmsvcrt. In addition, _ftelli64 function implementation is not compatible with ucrt. Signed-off-by: Mateusz Brzostek <mateu...@poczta.onet.pl> --- mingw-w64-crt/Makefile.am | 1 + mingw-w64-crt/stdio/fseeki64.c | 175 +++++++++++++++++++++++++++++++++++++++++ mingw-w64-crt/stdio/fseeko64.c | 131 ------------------------------ mingw-w64-headers/crt/stdio.h | 18 ----- 4 files changed, 176 insertions(+), 149 deletions(-) create mode 100644 mingw-w64-crt/stdio/fseeki64.c diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index 079dc5a..f8b0623 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am @@ -210,6 +210,7 @@ src_msvcrt=\ secapi/vsprintf_s.c \ secapi/wmemcpy_s.c \ secapi/wmemmove_s.c \ + stdio/fseeki64.c \ stdio/mingw_lock.c src_ucrtbase=\ diff --git a/mingw-w64-crt/stdio/fseeki64.c b/mingw-w64-crt/stdio/fseeki64.c new file mode 100644 index 0000000..fbf7f4c --- /dev/null +++ b/mingw-w64-crt/stdio/fseeki64.c @@ -0,0 +1,175 @@ +/** + * This file has no copyright assigned and is placed in the Public Domain. + * This file is part of the mingw-w64 runtime package. + * No warranty is given; refer to the file DISCLAIMER.PD within this package. + */ +#include <stdio.h> +#include <io.h> +#include <errno.h> +#include <internal.h> + +#define _IOYOURBUF 0x0100 +#define _IOSETVBUF 0x0400 +#define _IOFEOF 0x0800 +#define _IOFLRTN 0x1000 +#define _IOCTRLZ 0x2000 +#define _IOCOMMIT 0x4000 + +/* General use macros */ + +#define inuse(s) ((s)->_flag & (_IOREAD|_IOWRT|_IORW)) +#define mbuf(s) ((s)->_flag & _IOMYBUF) +#define nbuf(s) ((s)->_flag & _IONBF) +#define ybuf(s) ((s)->_flag & _IOYOURBUF) +#define bigbuf(s) ((s)->_flag & (_IOMYBUF|_IOYOURBUF)) +#define anybuf(s) ((s)->_flag & (_IOMYBUF|_IONBF|_IOYOURBUF)) + +#define _INTERNAL_BUFSIZ 4096 +#define _SMALL_BUFSIZ 512 + +#define FOPEN 0x01 /* file handle open */ +#define FEOFLAG 0x02 /* end of file has been encountered */ +#define FCRLF 0x04 /* CR-LF across read buffer (in text mode) */ +#define FPIPE 0x08 /* file handle refers to a pipe */ +#define FNOINHERIT 0x10 /* file handle opened _O_NOINHERIT */ +#define FAPPEND 0x20 /* file handle opened O_APPEND */ +#define FDEV 0x40 /* file handle refers to device */ +#define FTEXT 0x80 /* file handle is in text mode */ + +_CRTIMP __int64 __cdecl _lseeki64(int fh,__int64 pos,int mthd); +__int64 __cdecl _ftelli64(FILE *str); +int __cdecl _flush (FILE *str); + +int __cdecl _flush (FILE *str) +{ + FILE *stream; + int rc = 0; /* assume good return */ + __int64 nchar; + + stream = str; + if ((stream->_flag & (_IOREAD | _IOWRT)) == _IOWRT && bigbuf(stream) + && (nchar = (__int64) (stream->_ptr - stream->_base)) > 0ll) + { + if ( _write(_fileno(stream), stream->_base, nchar) == nchar) { + if (_IORW & stream->_flag) + stream->_flag &= ~_IOWRT; + } else { + stream->_flag |= _IOERR; + rc = EOF; + } + } + stream->_ptr = stream->_base; + stream->_cnt = 0ll; + return rc; +} + +int __cdecl _fseeki64(FILE *str,__int64 offset,int whence) +{ + FILE *stream; + /* Init stream pointer */ + stream = str; + errno=0; + if(!stream || ((whence != SEEK_SET) && (whence != SEEK_CUR) && (whence != SEEK_END))) + { + errno=EINVAL; + return -1; + } + /* Clear EOF flag */ + stream->_flag &= ~_IOEOF; + + if (whence == SEEK_CUR) { + offset += _ftelli64(stream); + whence = SEEK_SET; + } + /* Flush buffer as necessary */ + _flush(stream); + + /* If file opened for read/write, clear flags since we don't know + what the user is going to do next. If the file was opened for + read access only, decrease _bufsiz so that the next _filbuf + won't cost quite so much */ + + if (stream->_flag & _IORW) + stream->_flag &= ~(_IOWRT|_IOREAD); + else if ( (stream->_flag & _IOREAD) && (stream->_flag & _IOMYBUF) && + !(stream->_flag & _IOSETVBUF) ) + stream->_bufsiz = _SMALL_BUFSIZ; + + /* Seek to the desired locale and return. */ + + return (_lseeki64(_fileno(stream), offset, whence) == -1ll ? -1 : 0); +} + +int __cdecl (*__MINGW_IMP_SYMBOL(_fseeki64))(FILE *, __int64, int) = _fseeki64; + + +__int64 __cdecl _ftelli64(FILE *str) +{ + FILE *stream; + size_t offset; + __int64 filepos; + register char *p; + char *max; + int fd; + size_t rdcnt = 0; + + errno=0; + stream = str; + fd = _fileno(stream); + if (stream->_cnt < 0ll) stream->_cnt = 0ll; + if ((filepos = _lseeki64(fd, 0ll, SEEK_CUR)) < 0L) + return -1ll; + + if (!bigbuf(stream)) /* _IONBF or no buffering designated */ + return (filepos - (__int64) stream->_cnt); + + offset = (size_t)(stream->_ptr - stream->_base); + + if (stream->_flag & (_IOWRT|_IOREAD)) + { + if (_osfile(fd) & FTEXT) + for (p = stream->_base; p < stream->_ptr; p++) + if (*p == '\n') /* adjust for '\r' */ + offset++; + } + else if (!(stream->_flag & _IORW)) { + errno=EINVAL; + return -1ll; + } + if (filepos == 0ll) + return ((__int64)offset); + + if (stream->_flag & _IOREAD) /* go to preceding sector */ + { + if (stream->_cnt == 0ll) /* filepos holds correct location */ + offset = 0ll; + else + { + rdcnt = ((size_t) stream->_cnt) + ((size_t) (size_t)(stream->_ptr - stream->_base)); + if (_osfile(fd) & FTEXT) { + if (_lseeki64(fd, 0ll, SEEK_END) == filepos) { + max = stream->_base + rdcnt; + for (p = stream->_base; p < max; p++) + if (*p == '\n') /* adjust for '\r' */ + rdcnt++; + if (stream->_flag & _IOCTRLZ) + ++rdcnt; + } else { + _lseeki64(fd, filepos, SEEK_SET); + if ( (rdcnt <= _SMALL_BUFSIZ) && (stream->_flag & _IOMYBUF) && + !(stream->_flag & _IOSETVBUF)) + rdcnt = _SMALL_BUFSIZ; + else + rdcnt = stream->_bufsiz; + if (_osfile(fd) & FCRLF) + ++rdcnt; + } + } /* end if FTEXT */ + } + filepos -= (__int64)rdcnt; + } /* end else stream->_cnt != 0 */ + return (filepos + (__int64)offset); +} + +__int64 __cdecl (*__MINGW_IMP_SYMBOL(_ftelli64))(FILE *) = _ftelli64; + diff --git a/mingw-w64-crt/stdio/fseeko64.c b/mingw-w64-crt/stdio/fseeko64.c index 5905aa2..99a54f7 100644 --- a/mingw-w64-crt/stdio/fseeko64.c +++ b/mingw-w64-crt/stdio/fseeko64.c @@ -76,33 +76,7 @@ static struct oserr_map local_errtab[] = { { ERROR_NOT_ENOUGH_QUOTA, ENOMEM }, { 0, -1 } }; -_CRTIMP __int64 __cdecl _lseeki64(int fh,__int64 pos,int mthd); -__int64 __cdecl _ftelli64(FILE *str); void mingw_dosmaperr (unsigned long oserrno); -int __cdecl _flush (FILE *str); - -int __cdecl _flush (FILE *str) -{ - FILE *stream; - int rc = 0; /* assume good return */ - __int64 nchar; - - stream = str; - if ((stream->_flag & (_IOREAD | _IOWRT)) == _IOWRT && bigbuf(stream) - && (nchar = (__int64) (stream->_ptr - stream->_base)) > 0ll) - { - if ( _write(_fileno(stream), stream->_base, nchar) == nchar) { - if (_IORW & stream->_flag) - stream->_flag &= ~_IOWRT; - } else { - stream->_flag |= _IOERR; - rc = EOF; - } - } - stream->_ptr = stream->_base; - stream->_cnt = 0ll; - return rc; -} int fseeko64 (FILE* stream, _off64_t offset, int whence) { @@ -130,111 +104,6 @@ int fseeko64 (FILE* stream, _off64_t offset, int whence) return fsetpos (stream, &pos); } -int __cdecl _fseeki64(FILE *str,__int64 offset,int whence) -{ - FILE *stream; - /* Init stream pointer */ - stream = str; - errno=0; - if(!stream || ((whence != SEEK_SET) && (whence != SEEK_CUR) && (whence != SEEK_END))) - { - errno=EINVAL; - return -1; - } - /* Clear EOF flag */ - stream->_flag &= ~_IOEOF; - - if (whence == SEEK_CUR) { - offset += _ftelli64(stream); - whence = SEEK_SET; - } - /* Flush buffer as necessary */ - _flush(stream); - - /* If file opened for read/write, clear flags since we don't know - what the user is going to do next. If the file was opened for - read access only, decrease _bufsiz so that the next _filbuf - won't cost quite so much */ - - if (stream->_flag & _IORW) - stream->_flag &= ~(_IOWRT|_IOREAD); - else if ( (stream->_flag & _IOREAD) && (stream->_flag & _IOMYBUF) && - !(stream->_flag & _IOSETVBUF) ) - stream->_bufsiz = _SMALL_BUFSIZ; - - /* Seek to the desired locale and return. */ - - return (_lseeki64(_fileno(stream), offset, whence) == -1ll ? -1 : 0); -} - -__int64 __cdecl _ftelli64(FILE *str) -{ - FILE *stream; - size_t offset; - __int64 filepos; - register char *p; - char *max; - int fd; - size_t rdcnt = 0; - - errno=0; - stream = str; - fd = _fileno(stream); - if (stream->_cnt < 0ll) stream->_cnt = 0ll; - if ((filepos = _lseeki64(fd, 0ll, SEEK_CUR)) < 0L) - return -1ll; - - if (!bigbuf(stream)) /* _IONBF or no buffering designated */ - return (filepos - (__int64) stream->_cnt); - - offset = (size_t)(stream->_ptr - stream->_base); - - if (stream->_flag & (_IOWRT|_IOREAD)) - { - if (_osfile(fd) & FTEXT) - for (p = stream->_base; p < stream->_ptr; p++) - if (*p == '\n') /* adjust for '\r' */ - offset++; - } - else if (!(stream->_flag & _IORW)) { - errno=EINVAL; - return -1ll; - } - if (filepos == 0ll) - return ((__int64)offset); - - if (stream->_flag & _IOREAD) /* go to preceding sector */ - { - if (stream->_cnt == 0ll) /* filepos holds correct location */ - offset = 0ll; - else - { - rdcnt = ((size_t) stream->_cnt) + ((size_t) (size_t)(stream->_ptr - stream->_base)); - if (_osfile(fd) & FTEXT) { - if (_lseeki64(fd, 0ll, SEEK_END) == filepos) { - max = stream->_base + rdcnt; - for (p = stream->_base; p < max; p++) - if (*p == '\n') /* adjust for '\r' */ - rdcnt++; - if (stream->_flag & _IOCTRLZ) - ++rdcnt; - } else { - _lseeki64(fd, filepos, SEEK_SET); - if ( (rdcnt <= _SMALL_BUFSIZ) && (stream->_flag & _IOMYBUF) && - !(stream->_flag & _IOSETVBUF)) - rdcnt = _SMALL_BUFSIZ; - else - rdcnt = stream->_bufsiz; - if (_osfile(fd) & FCRLF) - ++rdcnt; - } - } /* end if FTEXT */ - } - filepos -= (__int64)rdcnt; - } /* end else stream->_cnt != 0 */ - return (filepos + (__int64)offset); -} - void mingw_dosmaperr (unsigned long oserrno) { size_t i; diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h index c79d705..01e4ee8 100644 --- a/mingw-w64-headers/crt/stdio.h +++ b/mingw-w64-headers/crt/stdio.h @@ -609,31 +609,13 @@ int vsnprintf (char *__stream, size_t __n, const char *__format, __builtin_va_li /* Shouldn't be any fseeko32 in glibc, 32bit to 64bit casting should be fine */ /* int fseeko32(FILE* stream, _off_t offset, int whence);*/ /* fseeko32 redirects to fseeko64 */ -#if __MSVCRT_VERSION__ >= 0x1400 - // Mark these as _CRTIMP to avoid trying to link in the mingwex versions. _CRTIMP int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin); _CRTIMP __int64 __cdecl _ftelli64(FILE *_File); - __mingw_static_ovr int fseeko(FILE *_File, _off_t _Offset, int _Origin) { - return fseek(_File, _Offset, _Origin); - } - __mingw_static_ovr int fseeko64(FILE *_File, _off64_t _Offset, int _Origin) { - return _fseeki64(_File, _Offset, _Origin); - } - __mingw_static_ovr _off_t ftello(FILE *_File) { - return ftell(_File); - } - __mingw_static_ovr _off64_t ftello64(FILE *_File) { - return _ftelli64(_File); - } -#else - __MINGW_EXTENSION int __cdecl _fseeki64(FILE *_File,__int64 _Offset,int _Origin); - __MINGW_EXTENSION __int64 __cdecl _ftelli64(FILE *_File); int fseeko64(FILE* stream, _off64_t offset, int whence); int fseeko(FILE* stream, _off_t offset, int whence); /* Returns truncated 64bit off_t */ _off_t ftello(FILE * stream); _off64_t ftello64(FILE * stream); -#endif #ifndef _FILE_OFFSET_BITS_SET_FSEEKO #define _FILE_OFFSET_BITS_SET_FSEEKO -- 2.7.4
_______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public