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 <[email protected]>
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 <[email protected]>
---
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public