Add fallback paths for nbio_stdio.c

This commit is contained in:
twinaphex 2020-06-27 14:07:41 +02:00
parent c1275cc83d
commit c3f8b7741c
2 changed files with 43 additions and 7 deletions

View File

@ -35,6 +35,18 @@
#endif #endif
#if defined(_WIN32)
#if !defined(_MSC_VER) || (defined(_MSC_VER) && _MSC_VER >= 1400)
#define ATLEAST_VC2005
#endif
#endif
#if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE - 0) >= 200112) || (defined(__POSIX_VISIBLE) && __POSIX_VISIBLE >= 200112) || (defined(_POSIX_VERSION) && _POSIX_VERSION >= 200112) || __USE_LARGEFILE
#ifndef HAVE_64BIT_OFFSETS
#define HAVE_64BIT_OFFSETS
#endif
#endif
struct nbio_stdio_t struct nbio_stdio_t
{ {
FILE* f; FILE* f;
@ -57,11 +69,35 @@ static const char *stdio_modes[] = { "rb", "wb", "r+b", "rb", "wb", "r+b" };
static const wchar_t *stdio_modes[] = { L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" }; static const wchar_t *stdio_modes[] = { L"rb", L"wb", L"r+b", L"rb", L"wb", L"r+b" };
#endif #endif
static int64_t fseek_wrap(FILE *f, int64_t offset, int origin)
{
#ifdef ATLEAST_VC2005
/* VC2005 and up have a special 64-bit fseek */
return _fseeki64(f, offset, origin);
#elif defined(HAVE_64BIT_OFFSETS)
return fseeko(f, (off_t)offset, origin);
#else
return fseek(f, (long)offset, origin);
#endif
}
static int64_t ftell_wrap(FILE *f)
{
#ifdef ATLEAST_VC2005
/* VC2005 and up have a special 64-bit ftell */
return _ftelli64(f);
#elif defined(HAVE_64BIT_OFFSETS)
return ftello(f);
#else
return ftell(f);
#endif
}
static void *nbio_stdio_open(const char * filename, unsigned mode) static void *nbio_stdio_open(const char * filename, unsigned mode)
{ {
void *buf = NULL; void *buf = NULL;
struct nbio_stdio_t* handle = NULL; struct nbio_stdio_t* handle = NULL;
size_t len = 0; int64_t len = 0;
#if !defined(_WIN32) || defined(LEGACY_WIN32) #if !defined(_WIN32) || defined(LEGACY_WIN32)
FILE* f = fopen(filename, stdio_modes[mode]); FILE* f = fopen(filename, stdio_modes[mode]);
#else #else
@ -87,8 +123,8 @@ static void *nbio_stdio_open(const char * filename, unsigned mode)
case BIO_WRITE: case BIO_WRITE:
break; break;
default: default:
fseek(handle->f, 0, SEEK_END); fseek_wrap(handle->f, 0, SEEK_END);
len = ftell(handle->f); len = ftell_wrap(handle->f);
break; break;
} }
@ -123,7 +159,7 @@ static void nbio_stdio_begin_read(void *data)
if (handle->op >= 0) if (handle->op >= 0)
abort(); abort();
fseek(handle->f, 0, SEEK_SET); fseek_wrap(handle->f, 0, SEEK_SET);
handle->op = NBIO_READ; handle->op = NBIO_READ;
handle->progress = 0; handle->progress = 0;
@ -138,7 +174,7 @@ static void nbio_stdio_begin_write(void *data)
if (handle->op >= 0) if (handle->op >= 0)
abort(); abort();
fseek(handle->f, 0, SEEK_SET); fseek_wrap(handle->f, 0, SEEK_SET);
handle->op = NBIO_WRITE; handle->op = NBIO_WRITE;
handle->progress = 0; handle->progress = 0;
} }

View File

@ -198,8 +198,8 @@ int64_t retro_vfs_file_seek_internal(
if (stream->scheme == VFS_SCHEME_CDROM) if (stream->scheme == VFS_SCHEME_CDROM)
return retro_vfs_file_seek_cdrom(stream, offset, whence); return retro_vfs_file_seek_cdrom(stream, offset, whence);
#endif #endif
/* VC2005 and up have a special 64-bit fseek */
#ifdef ATLEAST_VC2005 #ifdef ATLEAST_VC2005
/* VC2005 and up have a special 64-bit fseek */
return _fseeki64(stream->fp, offset, whence); return _fseeki64(stream->fp, offset, whence);
#elif defined(ORBIS) #elif defined(ORBIS)
{ {
@ -607,8 +607,8 @@ int64_t retro_vfs_file_tell_impl(libretro_vfs_implementation_file *stream)
return ret; return ret;
} }
#else #else
/* VC2005 and up have a special 64-bit ftell */
#ifdef ATLEAST_VC2005 #ifdef ATLEAST_VC2005
/* VC2005 and up have a special 64-bit ftell */
return _ftelli64(stream->fp); return _ftelli64(stream->fp);
#elif defined(HAVE_64BIT_OFFSETS) #elif defined(HAVE_64BIT_OFFSETS)
return ftello(stream->fp); return ftello(stream->fp);