From 5bce2c0cef96120e32d03054b0fd1dbda7c1afdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Sch=C3=B6nle?= Date: Fri, 5 May 2017 14:58:09 +0200 Subject: [PATCH] Allow compiling and using as DLL in windows (#502) * fix warnings and errors in test compiles with BUILD_SHARED_LIBS * did requested changes and added one change to allow all tests to succeed in windows DLL (cherry picked from commit 79f11dbaa7fcb5525f572ea3a9bdec12c0886bc8) --- fmt/format.h | 3 ++- fmt/posix.h | 30 +++++++++++++++--------------- test/format-impl-test.cc | 1 + test/time-test.cc | 3 +++ 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/fmt/format.h b/fmt/format.h index 68892d80..76292ab4 100644 --- a/fmt/format.h +++ b/fmt/format.h @@ -699,7 +699,8 @@ class Buffer { template template void Buffer::append(const U *begin, const U *end) { - std::size_t new_size = size_ + internal::to_unsigned(end - begin); + FMT_ASSERT(end >= begin, "negative value"); + std::size_t new_size = size_ + (end - begin); if (new_size > capacity_) grow(new_size); std::uninitialized_copy(begin, end, diff --git a/fmt/posix.h b/fmt/posix.h index d79988c4..477d33c8 100644 --- a/fmt/posix.h +++ b/fmt/posix.h @@ -110,7 +110,7 @@ class BufferedFile { BufferedFile() FMT_NOEXCEPT : file_(FMT_NULL) {} // Destroys the object closing the file it represents if any. - ~BufferedFile() FMT_NOEXCEPT; + FMT_API ~BufferedFile() FMT_NOEXCEPT; #if !FMT_USE_RVALUE_REFERENCES // Emulate a move constructor and a move assignment operator if rvalue @@ -173,17 +173,17 @@ public: #endif // Opens a file. - BufferedFile(CStringRef filename, CStringRef mode); + FMT_API BufferedFile(CStringRef filename, CStringRef mode); // Closes the file. - void close(); + FMT_API void close(); // Returns the pointer to a FILE object representing this file. FILE *get() const FMT_NOEXCEPT { return file_; } // We place parentheses around fileno to workaround a bug in some versions // of MinGW that define fileno as a macro. - int (fileno)() const; + FMT_API int (fileno)() const; void print(CStringRef format_str, const ArgList &args) { fmt::print(file_, format_str, args); @@ -216,7 +216,7 @@ class File { File() FMT_NOEXCEPT : fd_(-1) {} // Opens a file and constructs a File object representing this file. - File(CStringRef path, int oflag); + FMT_API File(CStringRef path, int oflag); #if !FMT_USE_RVALUE_REFERENCES // Emulate a move constructor and a move assignment operator if rvalue @@ -279,43 +279,43 @@ class File { #endif // Destroys the object closing the file it represents if any. - ~File() FMT_NOEXCEPT; + FMT_API ~File() FMT_NOEXCEPT; // Returns the file descriptor. int descriptor() const FMT_NOEXCEPT { return fd_; } // Closes the file. - void close(); + FMT_API void close(); // Returns the file size. The size has signed type for consistency with // stat::st_size. - LongLong size() const; + FMT_API LongLong size() const; // Attempts to read count bytes from the file into the specified buffer. - std::size_t read(void *buffer, std::size_t count); + FMT_API std::size_t read(void *buffer, std::size_t count); // Attempts to write count bytes from the specified buffer to the file. - std::size_t write(const void *buffer, std::size_t count); + FMT_API std::size_t write(const void *buffer, std::size_t count); // Duplicates a file descriptor with the dup function and returns // the duplicate as a file object. - static File dup(int fd); + FMT_API static File dup(int fd); // Makes fd be the copy of this file descriptor, closing fd first if // necessary. - void dup2(int fd); + FMT_API void dup2(int fd); // Makes fd be the copy of this file descriptor, closing fd first if // necessary. - void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT; + FMT_API void dup2(int fd, ErrorCode &ec) FMT_NOEXCEPT; // Creates a pipe setting up read_end and write_end file objects for reading // and writing respectively. - static void pipe(File &read_end, File &write_end); + FMT_API static void pipe(File &read_end, File &write_end); // Creates a BufferedFile object associated with this file and detaches // this File object from the file. - BufferedFile fdopen(const char *mode); + FMT_API BufferedFile fdopen(const char *mode); }; // Returns the memory page size. diff --git a/test/format-impl-test.cc b/test/format-impl-test.cc index aff9ea54..292a2f56 100644 --- a/test/format-impl-test.cc +++ b/test/format-impl-test.cc @@ -26,6 +26,7 @@ */ #define FMT_NOEXCEPT +#undef FMT_SHARED #include "test-assert.h" // Include format.cc instead of format.h to test implementation-specific stuff. diff --git a/test/time-test.cc b/test/time-test.cc index 48df56a0..bf42d20f 100644 --- a/test/time-test.cc +++ b/test/time-test.cc @@ -6,6 +6,9 @@ For the license information refer to format.h. */ +#ifdef WIN32 +#define _CRT_SECURE_NO_WARNINGS +#endif #include "gmock/gmock.h" #include "fmt/time.h"