mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-30 10:47:35 +02:00
handle fwrite results #1098
This commit is contained in:
committed by
Victor Zverovich
parent
e979c782d3
commit
a6d1ad741d
@ -181,13 +181,21 @@ void format_error_code(internal::buffer& out, int error_code,
|
|||||||
assert(out.size() <= inline_buffer_size);
|
assert(out.size() <= inline_buffer_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// try an fwrite, FMT_THROW on failure
|
||||||
|
void fwrite_fully(const void *ptr, size_t size, size_t count, FILE *stream) {
|
||||||
|
size_t written = std::fwrite(ptr, size, count, stream);
|
||||||
|
if (written < count) {
|
||||||
|
FMT_THROW(system_error(errno, "cannot write to file"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void report_error(FormatFunc func, int error_code,
|
void report_error(FormatFunc func, int error_code,
|
||||||
string_view message) FMT_NOEXCEPT {
|
string_view message) FMT_NOEXCEPT {
|
||||||
memory_buffer full_message;
|
memory_buffer full_message;
|
||||||
func(full_message, error_code, message);
|
func(full_message, error_code, message);
|
||||||
// Use Writer::data instead of Writer::c_str to avoid potential memory
|
// Use Writer::data instead of Writer::c_str to avoid potential memory
|
||||||
// allocation.
|
// allocation.
|
||||||
std::fwrite(full_message.data(), full_message.size(), 1, stderr);
|
fwrite_fully(full_message.data(), 1, full_message.size(), stderr);
|
||||||
std::fputc('\n', stderr);
|
std::fputc('\n', stderr);
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -907,13 +915,13 @@ FMT_FUNC void vprint(std::FILE* f, string_view format_str, format_args args) {
|
|||||||
memory_buffer buffer;
|
memory_buffer buffer;
|
||||||
internal::vformat_to(buffer, format_str,
|
internal::vformat_to(buffer, format_str,
|
||||||
basic_format_args<buffer_context<char>::type>(args));
|
basic_format_args<buffer_context<char>::type>(args));
|
||||||
std::fwrite(buffer.data(), 1, buffer.size(), f);
|
fwrite_fully(buffer.data(), 1, buffer.size(), f);
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_FUNC void vprint(std::FILE* f, wstring_view format_str, wformat_args args) {
|
FMT_FUNC void vprint(std::FILE* f, wstring_view format_str, wformat_args args) {
|
||||||
wmemory_buffer buffer;
|
wmemory_buffer buffer;
|
||||||
internal::vformat_to(buffer, format_str, args);
|
internal::vformat_to(buffer, format_str, args);
|
||||||
std::fwrite(buffer.data(), sizeof(wchar_t), buffer.size(), f);
|
fwrite_fully(buffer.data(), sizeof(wchar_t), buffer.size(), f);
|
||||||
}
|
}
|
||||||
|
|
||||||
FMT_FUNC void vprint(string_view format_str, format_args args) {
|
FMT_FUNC void vprint(string_view format_str, format_args args) {
|
||||||
|
Reference in New Issue
Block a user