From 399311ae5dc729ff0c0aea08510ed7b2662ca3e2 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Thu, 30 Mar 2017 02:54:22 +0300 Subject: Improve VirtfsDir::rwops_write. --- src/fs/virtfs/virtfsdirrwops.cpp | 30 +++++++++++++++++++++++------- src/fs/virtfs/virtfsdirrwops.h | 2 +- 2 files changed, 24 insertions(+), 8 deletions(-) (limited to 'src/fs') diff --git a/src/fs/virtfs/virtfsdirrwops.cpp b/src/fs/virtfs/virtfsdirrwops.cpp index 6b8be6e30..bd8e2f594 100644 --- a/src/fs/virtfs/virtfsdirrwops.cpp +++ b/src/fs/virtfs/virtfsdirrwops.cpp @@ -181,20 +181,36 @@ namespace VirtFsDir RWOPSSIZE rwops_write(SDL_RWops *const rw, const void *const ptr, const RWOPSSIZE size, - const RWOPSSIZE num) + const RWOPSSIZE maxnum) { if (!rw) return 0; VirtFile *const handle = static_cast( rw->hidden.unknown.data1); - const int64_t rc = VirtFs::write(handle, ptr, - CAST_U32(size), - CAST_U32(num)); - if (rc != static_cast(num)) + FILEHTYPE fd = handle->mFd; + +#ifdef USE_FILE_FOPEN + const int64_t rc = fwrite(ptr, size, maxnum, fd); +#else // USE_FILE_FOPEN + int max = size * maxnum; + int cnt = ::write(fd, ptr, max); + if (cnt <= 0) + return cnt; + const int64_t rc = cnt / size; +#endif // USE_FILE_FOPEN + + if (rc != static_cast(maxnum)) { - logger->assertLog("VirtFs::rwops_seek: write error."); +#ifndef USE_FILE_FOPEN + const int64_t pos = lseek(fd, 0, SEEK_CUR); + struct stat statbuf; + if (fstat(fd, &statbuf) == -1) + { + reportAlways("VirtFsDir::fileLength error."); + return CAST_S32(rc); + } +#endif // USE_FILE_FOPEN } - return CAST_S32(rc); } diff --git a/src/fs/virtfs/virtfsdirrwops.h b/src/fs/virtfs/virtfsdirrwops.h index d8f5c7d15..6751694d1 100644 --- a/src/fs/virtfs/virtfsdirrwops.h +++ b/src/fs/virtfs/virtfsdirrwops.h @@ -39,7 +39,7 @@ namespace VirtFsDir RWOPSSIZE rwops_write(SDL_RWops *const rw, const void *const ptr, const RWOPSSIZE size, - const RWOPSSIZE num); + const RWOPSSIZE maxnum); int rwops_close(SDL_RWops *const rw); #ifdef USE_SDL2 RWOPSINT rwops_size(SDL_RWops *const rw); -- cgit v1.2.3-60-g2f50