Merge 06eb3c107b into 8d07db0e0e
This commit is contained in:
commit
2e996bced6
@ -487,6 +487,11 @@ FMT_FUNC int fmt::internal::UTF16ToUTF8::convert(fmt::WStringRef s) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifdef __GNUC__
|
||||||
|
# pragma GCC diagnostic push
|
||||||
|
# pragma GCC diagnostic ignored "-Wshadow"
|
||||||
|
# endif
|
||||||
|
|
||||||
FMT_FUNC void fmt::WindowsError::init(
|
FMT_FUNC void fmt::WindowsError::init(
|
||||||
int error_code, StringRef format_str, ArgList args) {
|
int error_code, StringRef format_str, ArgList args) {
|
||||||
error_code_ = error_code;
|
error_code_ = error_code;
|
||||||
@ -496,6 +501,10 @@ FMT_FUNC void fmt::WindowsError::init(
|
|||||||
base = std::runtime_error(w.str());
|
base = std::runtime_error(w.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ifdef __GNUC__
|
||||||
|
# pragma GCC diagnostic pop
|
||||||
|
# endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
FMT_FUNC void fmt::internal::format_system_error(
|
FMT_FUNC void fmt::internal::format_system_error(
|
||||||
|
|||||||
35
posix.cc
35
posix.cc
@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#include "posix.h"
|
#include "posix.h"
|
||||||
|
|
||||||
#include <limits.h>
|
#include <climits>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
@ -96,12 +96,35 @@ void fmt::BufferedFile::close() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int fmt::BufferedFile::fileno() const {
|
int fmt::BufferedFile::fileno() const {
|
||||||
|
assert(file_ && "File has been closed");
|
||||||
int fd = FMT_POSIX_CALL(fileno(file_));
|
int fd = FMT_POSIX_CALL(fileno(file_));
|
||||||
if (fd == -1)
|
if (fd == -1)
|
||||||
throw SystemError(errno, "cannot get file descriptor");
|
throw SystemError(errno, "cannot get file descriptor");
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void fmt::BufferedFile::flush() const {
|
||||||
|
assert(file_ && "File has been closed");
|
||||||
|
if (FMT_SYSTEM(fflush(file_)) != 0) {
|
||||||
|
throw SystemError(errno, "cannot flush file");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fmt::BufferedFile::write(fmt::StringRef str) {
|
||||||
|
assert(file_ && "File has been closed");
|
||||||
|
size_t result = FMT_SYSTEM(fwrite(str.c_str(), str.size(), 1, file_));
|
||||||
|
if (result < str.size()) {
|
||||||
|
// FIXME: Will fwrite set errno?
|
||||||
|
throw SystemError(errno, "failed to write raw string, only {} character(s) written", result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void fmt::BufferedFile::write(char c) {
|
||||||
|
assert(file_ && "File has been closed");
|
||||||
|
if (FMT_SYSTEM(fputc(c, file_)) == EOF)
|
||||||
|
throw SystemError(errno, "failed to write '{}'", c);
|
||||||
|
}
|
||||||
|
|
||||||
fmt::File::File(fmt::StringRef path, int oflag) {
|
fmt::File::File(fmt::StringRef path, int oflag) {
|
||||||
int mode = S_IRUSR | S_IWUSR;
|
int mode = S_IRUSR | S_IWUSR;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -134,13 +157,13 @@ void fmt::File::close() {
|
|||||||
|
|
||||||
fmt::LongLong fmt::File::size() const {
|
fmt::LongLong fmt::File::size() const {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
LARGE_INTEGER size = {};
|
LARGE_INTEGER filesize = {};
|
||||||
HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd_));
|
HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd_));
|
||||||
if (!FMT_SYSTEM(GetFileSizeEx(handle, &size)))
|
if (!FMT_SYSTEM(GetFileSizeEx(handle, &filesize)))
|
||||||
throw WindowsError(GetLastError(), "cannot get file size");
|
throw WindowsError(GetLastError(), "cannot get file size");
|
||||||
FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(size.QuadPart),
|
FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(filesize.QuadPart),
|
||||||
"return type of File::size is not large enough");
|
"return type of File::size is not large enough");
|
||||||
return size.QuadPart;
|
return filesize.QuadPart;
|
||||||
#else
|
#else
|
||||||
typedef struct stat Stat;
|
typedef struct stat Stat;
|
||||||
Stat file_stat = Stat();
|
Stat file_stat = Stat();
|
||||||
@ -228,7 +251,7 @@ fmt::BufferedFile fmt::File::fdopen(const char *mode) {
|
|||||||
|
|
||||||
long fmt::getpagesize() {
|
long fmt::getpagesize() {
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
SYSTEM_INFO si = {};
|
SYSTEM_INFO si;
|
||||||
GetSystemInfo(&si);
|
GetSystemInfo(&si);
|
||||||
return si.dwPageSize;
|
return si.dwPageSize;
|
||||||
#else
|
#else
|
||||||
|
|||||||
29
posix.h
29
posix.h
@ -33,6 +33,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
#include "format.h"
|
#include "format.h"
|
||||||
|
|
||||||
@ -43,9 +44,9 @@
|
|||||||
#ifndef FMT_POSIX
|
#ifndef FMT_POSIX
|
||||||
# ifdef _WIN32
|
# ifdef _WIN32
|
||||||
// Fix warnings about deprecated symbols.
|
// Fix warnings about deprecated symbols.
|
||||||
# define FMT_POSIX(call) _##call
|
# define FMT_POSIX(symbol) _##symbol
|
||||||
# else
|
# else
|
||||||
# define FMT_POSIX(call) call
|
# define FMT_POSIX(symbol) symbol
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -53,7 +54,7 @@
|
|||||||
#ifdef FMT_SYSTEM
|
#ifdef FMT_SYSTEM
|
||||||
# define FMT_POSIX_CALL(call) FMT_SYSTEM(call)
|
# define FMT_POSIX_CALL(call) FMT_SYSTEM(call)
|
||||||
#else
|
#else
|
||||||
# define FMT_SYSTEM(call) call
|
# define FMT_SYSTEM(call) ::call
|
||||||
# ifdef _WIN32
|
# ifdef _WIN32
|
||||||
// Fix warnings about deprecated symbols.
|
// Fix warnings about deprecated symbols.
|
||||||
# define FMT_POSIX_CALL(call) ::_##call
|
# define FMT_POSIX_CALL(call) ::_##call
|
||||||
@ -188,12 +189,34 @@ public:
|
|||||||
// Returns the pointer to a FILE object representing this file.
|
// Returns the pointer to a FILE object representing this file.
|
||||||
FILE *get() const FMT_NOEXCEPT { return file_; }
|
FILE *get() const FMT_NOEXCEPT { return file_; }
|
||||||
|
|
||||||
|
// Returns the system file number of this file
|
||||||
int fileno() const;
|
int fileno() const;
|
||||||
|
|
||||||
|
// Flushes the buffer of this file
|
||||||
|
void flush() const;
|
||||||
|
|
||||||
|
// Writes raw string without formatting
|
||||||
|
void write(fmt::StringRef str);
|
||||||
|
|
||||||
|
// Writes a single charactor without formatting
|
||||||
|
void write(char c);
|
||||||
|
|
||||||
|
// Writes a new line
|
||||||
|
void writeln() {
|
||||||
|
write('\n');
|
||||||
|
}
|
||||||
|
|
||||||
void print(fmt::StringRef format_str, const ArgList &args) {
|
void print(fmt::StringRef format_str, const ArgList &args) {
|
||||||
|
assert(file_ && "File has been closed");
|
||||||
fmt::print(file_, format_str, args);
|
fmt::print(file_, format_str, args);
|
||||||
}
|
}
|
||||||
|
void printf(fmt::StringRef format_str, const ArgList &args) {
|
||||||
|
assert(file_ && "File has been closed");
|
||||||
|
fmt::fprintf(file_, format_str, args);
|
||||||
|
}
|
||||||
|
|
||||||
FMT_VARIADIC(void, print, fmt::StringRef)
|
FMT_VARIADIC(void, print, fmt::StringRef)
|
||||||
|
FMT_VARIADIC(void, printf, fmt::StringRef)
|
||||||
};
|
};
|
||||||
|
|
||||||
// A file. Closed file is represented by a File object with descriptor -1.
|
// A file. Closed file is represented by a File object with descriptor -1.
|
||||||
|
|||||||
@ -178,6 +178,18 @@ int test::fileno(FILE *stream) {
|
|||||||
return ::FMT_POSIX(fileno(stream));
|
return ::FMT_POSIX(fileno(stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int test::fflush(FILE *stream) {
|
||||||
|
return ::fflush(stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test::fwrite(const void *str, size_t size, size_t count, FILE *stream) {
|
||||||
|
return ::fwrite(str, size, count, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
int test::fputc(int ch, FILE *stream) {
|
||||||
|
return ::fputc(ch, stream);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
# define EXPECT_RETRY(statement, func, message) \
|
# define EXPECT_RETRY(statement, func, message) \
|
||||||
func##_count = 1; \
|
func##_count = 1; \
|
||||||
|
|||||||
@ -73,7 +73,10 @@ int pipe(int *pfds, unsigned psize, int textmode);
|
|||||||
FILE *fopen(const char *filename, const char *mode);
|
FILE *fopen(const char *filename, const char *mode);
|
||||||
int fclose(FILE *stream);
|
int fclose(FILE *stream);
|
||||||
int fileno(FILE *stream);
|
int fileno(FILE *stream);
|
||||||
|
int fflush(FILE *stream);
|
||||||
|
|
||||||
|
int fwrite(const void *str, size_t size, size_t count, FILE *stream);
|
||||||
|
int fputc(int ch, FILE *stream);
|
||||||
} // namespace test
|
} // namespace test
|
||||||
|
|
||||||
#define FMT_SYSTEM(call) test::call
|
#define FMT_SYSTEM(call) test::call
|
||||||
|
|||||||
@ -699,9 +699,8 @@ void test_count_digits() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST(UtilTest, StringRef) {
|
TEST(UtilTest, StringRef) {
|
||||||
char space[100];
|
char space[100] = "some string";
|
||||||
std::strcpy(space, "some string");
|
EXPECT_EQ(std::strlen(space), StringRef(space).size());
|
||||||
EXPECT_EQ(sizeof("some string") - 1, StringRef(space).size());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(UtilTest, CountDigits) {
|
TEST(UtilTest, CountDigits) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user