These 32-bit wide functions are missing in 64-bit system OS msvcrt.dll
libraries and in 32-bit pre-msvcrt40 libraries. Provide mingw-w64 emulation
as a simple wrapper around 64-bit wide functions.

On 32-bit systems, these *32i64 functions are available also under
alternative name with just *i64 suffix. So in emulation code provide also
those symbol aliases.
---
 mingw-w64-crt/Makefile.am              | 12 ++++++++++++
 mingw-w64-crt/stdio/_findfirst32i64.c  | 25 +++++++++++++++++++++++++
 mingw-w64-crt/stdio/_findnext32i64.c   | 25 +++++++++++++++++++++++++
 mingw-w64-crt/stdio/_wfindfirst32i64.c | 25 +++++++++++++++++++++++++
 mingw-w64-crt/stdio/_wfindnext32i64.c  | 25 +++++++++++++++++++++++++
 5 files changed, 112 insertions(+)
 create mode 100644 mingw-w64-crt/stdio/_findfirst32i64.c
 create mode 100644 mingw-w64-crt/stdio/_findnext32i64.c
 create mode 100644 mingw-w64-crt/stdio/_wfindfirst32i64.c
 create mode 100644 mingw-w64-crt/stdio/_wfindnext32i64.c

diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index ca9ec404aeae..6f6ac57fc60d 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -675,14 +675,18 @@ src_msvcrt64=\
   misc/wcsnlen.c \
   secapi/wcstok_s.c \
   stdio/_findfirst32.c \
+  stdio/_findfirst32i64.c \
   stdio/_findnext32.c \
+  stdio/_findnext32i64.c \
   stdio/_fseeki64.c \
   stdio/_fstat32.c \
   stdio/_fstat32i64.c \
   stdio/_stat32.c \
   stdio/_stat32i64.c \
   stdio/_wfindfirst32.c \
+  stdio/_wfindfirst32i64.c \
   stdio/_wfindnext32.c \
+  stdio/_wfindnext32i64.c \
   stdio/_wstat32.c \
   stdio/_wstat32i64.c \
   string/msvcr80pre_wcstok.c
@@ -844,14 +848,18 @@ src_msvcrtarm64=\
   misc/__winitenv.c \
   secapi/msvcrt_arm_wcstok_s.c \
   stdio/_findfirst32.c \
+  stdio/_findfirst32i64.c \
   stdio/_findnext32.c \
+  stdio/_findnext32i64.c \
   stdio/_fstat32.c \
   stdio/_fstat32i64.c \
   stdio/_setmaxstdio.c \
   stdio/_stat32.c \
   stdio/_stat32i64.c \
   stdio/_wfindfirst32.c \
+  stdio/_wfindfirst32i64.c \
   stdio/_wfindnext32.c \
+  stdio/_wfindnext32i64.c \
   stdio/_wstat32.c \
   stdio/_wstat32i64.c \
   stdio/gets.c \
@@ -895,9 +903,13 @@ src_pre_msvcrt40=\
   misc/_dstbias.c \
   misc/dummy__setusermatherr.c \
   stdio/_filelengthi64.c \
+  stdio/_findfirst32i64.c \
+  stdio/_findnext32i64.c \
   stdio/_fstat32i64.c \
   stdio/_lseeki64.c \
   stdio/_stat32i64.c \
+  stdio/_wfindfirst32i64.c \
+  stdio/_wfindnext32i64.c \
   stdio/_wstat32i64.c \
   stdio/fgetpos.c \
   stdio/fsetpos.c
diff --git a/mingw-w64-crt/stdio/_findfirst32i64.c 
b/mingw-w64-crt/stdio/_findfirst32i64.c
new file mode 100644
index 000000000000..0e56fc5b41b3
--- /dev/null
+++ b/mingw-w64-crt/stdio/_findfirst32i64.c
@@ -0,0 +1,25 @@
+#include <io.h>
+#include <string.h>
+
+intptr_t __cdecl _findfirst32i64(const char *_Filename, struct 
_finddata32i64_t *_FindData)
+{
+  struct __finddata64_t fd;
+  intptr_t ret = _findfirst64(_Filename, &fd);
+  if (ret == -1)
+    return -1;
+  _FindData->attrib = fd.attrib;
+  _FindData->time_create = fd.time_create;
+  _FindData->time_access = fd.time_access;
+  _FindData->time_write = fd.time_write;
+  _FindData->size = (_fsize_t)fd.size;
+  _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of 
_FindData->name and fd.name");
+  memcpy(_FindData->name, fd.name, sizeof(_FindData->name));
+  return ret;
+}
+intptr_t (__cdecl *__MINGW_IMP_SYMBOL(_findfirst32i64))(const char *, struct 
_finddata32i64_t *) = _findfirst32i64;
+
+#ifndef _WIN64
+#undef _findfirsti64
+intptr_t __attribute__ ((alias ("_findfirst32i64"))) __cdecl 
_findfirsti64(const char *, struct _finddata32i64_t *);
+extern intptr_t __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(_findfirst32i64))))) (__cdecl 
*__MINGW_IMP_SYMBOL(_findfirsti64))(const char *, struct _finddata32i64_t *);
+#endif
diff --git a/mingw-w64-crt/stdio/_findnext32i64.c 
b/mingw-w64-crt/stdio/_findnext32i64.c
new file mode 100644
index 000000000000..09407569997f
--- /dev/null
+++ b/mingw-w64-crt/stdio/_findnext32i64.c
@@ -0,0 +1,25 @@
+#include <io.h>
+#include <string.h>
+
+int __cdecl _findnext32i64(intptr_t _FindHandle, struct _finddata32i64_t 
*_FindData)
+{
+  struct __finddata64_t fd;
+  int ret = _findnext64(_FindHandle, &fd);
+  if (ret != 0)
+    return ret;
+  _FindData->attrib = fd.attrib;
+  _FindData->time_create = fd.time_create;
+  _FindData->time_access = fd.time_access;
+  _FindData->time_write = fd.time_write;
+  _FindData->size = (_fsize_t)fd.size;
+  _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of 
_FindData->name and fd.name");
+  memcpy(_FindData->name, fd.name, sizeof(_FindData->name));
+  return 0;
+}
+int (__cdecl *__MINGW_IMP_SYMBOL(_findnext32i64))(intptr_t, struct 
_finddata32i64_t *) = _findnext32i64;
+
+#ifndef _WIN64
+#undef _findnexti64
+int __attribute__ ((alias ("_findnext32i64"))) __cdecl _findnexti64(intptr_t, 
struct _finddata32i64_t *);
+extern int __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(_findnext32i64))))) (__cdecl 
*__MINGW_IMP_SYMBOL(_findnexti64))(intptr_t, struct _finddata32i64_t *);
+#endif
diff --git a/mingw-w64-crt/stdio/_wfindfirst32i64.c 
b/mingw-w64-crt/stdio/_wfindfirst32i64.c
new file mode 100644
index 000000000000..d3600c7b850f
--- /dev/null
+++ b/mingw-w64-crt/stdio/_wfindfirst32i64.c
@@ -0,0 +1,25 @@
+#include <io.h>
+#include <string.h>
+
+intptr_t __cdecl _wfindfirst32i64(const wchar_t *_Filename, struct 
_wfinddata32i64_t *_FindData)
+{
+  struct _wfinddata64_t fd;
+  intptr_t ret = _wfindfirst64(_Filename, &fd);
+  if (ret == -1)
+    return -1;
+  _FindData->attrib = fd.attrib;
+  _FindData->time_create = fd.time_create;
+  _FindData->time_access = fd.time_access;
+  _FindData->time_write = fd.time_write;
+  _FindData->size = (_fsize_t)fd.size;
+  _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of 
_FindData->name and fd.name");
+  memcpy(_FindData->name, fd.name, sizeof(_FindData->name));
+  return ret;
+}
+intptr_t (__cdecl *__MINGW_IMP_SYMBOL(_wfindfirst32i64))(const wchar_t *, 
struct _wfinddata32i64_t *) = _wfindfirst32i64;
+
+#ifndef _WIN64
+#undef _wfindfirsti64
+intptr_t __attribute__ ((alias ("_wfindfirst32i64"))) __cdecl 
_wfindfirsti64(const wchar_t *, struct _wfinddata32i64_t *);
+extern intptr_t __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(_wfindfirst32i64))))) (__cdecl 
*__MINGW_IMP_SYMBOL(_wfindfirsti64))(const wchar_t *, struct _wfinddata32i64_t 
*);
+#endif
diff --git a/mingw-w64-crt/stdio/_wfindnext32i64.c 
b/mingw-w64-crt/stdio/_wfindnext32i64.c
new file mode 100644
index 000000000000..32e60a42736a
--- /dev/null
+++ b/mingw-w64-crt/stdio/_wfindnext32i64.c
@@ -0,0 +1,25 @@
+#include <io.h>
+#include <string.h>
+
+int __cdecl _wfindnext32i64(intptr_t _FindHandle, struct _wfinddata32i64_t 
*_FindData)
+{
+  struct _wfinddata64_t fd;
+  int ret = _wfindnext64(_FindHandle, &fd);
+  if (ret != 0)
+    return ret;
+  _FindData->attrib = fd.attrib;
+  _FindData->time_create = fd.time_create;
+  _FindData->time_access = fd.time_access;
+  _FindData->time_write = fd.time_write;
+  _FindData->size = (_fsize_t)fd.size;
+  _Static_assert(sizeof(_FindData->name) == sizeof(fd.name), "mismatch size of 
_FindData->name and fd.name");
+  memcpy(_FindData->name, fd.name, sizeof(_FindData->name));
+  return 0;
+}
+int (__cdecl *__MINGW_IMP_SYMBOL(_wfindnext32i64))(intptr_t, struct 
_wfinddata32i64_t *) = _wfindnext32i64;
+
+#ifndef _WIN64
+#undef _wfindnexti64
+int __attribute__ ((alias ("_wfindnext32i64"))) __cdecl 
_wfindnexti64(intptr_t, struct _wfinddata32i64_t *);
+extern int __attribute__ ((alias 
(__MINGW64_STRINGIFY(__MINGW_IMP_SYMBOL(_wfindnext32i64))))) (__cdecl 
*__MINGW_IMP_SYMBOL(_wfindnexti64))(intptr_t, struct _wfinddata32i64_t *);
+#endif
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to