From 74aede0c662b9b91790aa888585518fe3813461d Mon Sep 17 00:00:00 2001 From: gabime Date: Sun, 31 Jul 2016 01:47:55 +0300 Subject: [PATCH] better support for file size in 64 bits --- include/spdlog/details/file_helper.h | 4 +--- include/spdlog/details/os.h | 36 +++++++++++++--------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/include/spdlog/details/file_helper.h b/include/spdlog/details/file_helper.h index c5923358..b2b9df30 100644 --- a/include/spdlog/details/file_helper.h +++ b/include/spdlog/details/file_helper.h @@ -100,9 +100,7 @@ public: { if (!_fd) throw spdlog_ex("Cannot use size() on closed file " + os::filename_to_str(_filename)); - - return os::filesize(_fd); - + return os::filesize(_fd); } const filename_t& filename() const diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index d2f7e5c8..2379f32d 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -186,43 +186,41 @@ inline bool file_exists(const filename_t& filename) #endif } + + + //Return file size according to open FILE* object inline size_t filesize(FILE *f) { + if (f == nullptr) + throw spdlog_ex("Failed getting file size. fd is null"); #ifdef _WIN32 -#if _WIN64 //64 bits int fd = _fileno(f); +#if _WIN64 //64 bits struct _stat64 st; if (_fstat64(fd, &st) == 0) return st.st_size; - else - throw spdlog_ex("Failed getting file size from fd", errno); -#else //windows 32 bits - int fd = _fileno(f); + +#else //windows 32 bits struct _stat st; if (_fstat(fd, &st) == 0) return st.st_size; - else - throw spdlog_ex("Failed getting file size from fd", errno); #endif -#else// common unix - #if __x86_64__ || __ppc64__ //64 bits - int fd = fileno(f) +#else // unix + int fd = fileno(f); + //64 bits(but not in osx, where fstat64 is deprecated) + #if !defined(__APPLE__) && (defined(__x86_64__) || defined(__ppc64__)) struct stat64 st; if (fstat64(fd, &st) == 0) - return st.st_size; - else - throw spdlog_ex("Failed getting file size from fd", errno); -#else //unix 32 bits - int fd = fileno(f) - struct stat st; + return st.st_size; +#else // unix 32 bits or osx + struct stat st; if (fstat(fd, &st) == 0) - return st.st_size; - else - throw spdlog_ex("Failed getting file size from fd", errno); + return st.st_size; #endif #endif + throw spdlog_ex("Failed getting file size from fd", errno); }