diff options
author | Reid Kleckner <rnk@google.com> | 2013-07-02 06:00:22 (GMT) |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2013-07-02 06:06:54 (GMT) |
commit | ad76e867f782e75e0fed620e7b39f7099af154a9 (patch) | |
tree | 5e5a80853123138bfffedbddb4ad9e776d15f166 /src/line_printer.cc | |
parent | da06d2969039ad6a80b4d864fb6c432fef4de47f (diff) | |
download | Ninja-ad76e867f782e75e0fed620e7b39f7099af154a9.zip Ninja-ad76e867f782e75e0fed620e7b39f7099af154a9.tar.gz Ninja-ad76e867f782e75e0fed620e7b39f7099af154a9.tar.bz2 |
Use fwrite to print whatever the subcommand wrote
Subcommands can write things like UTF-16, which some terminals can
understand. printf() will interpret the null bytes as the end of the
string.
In particular, MSVC's assert() will print wide characters by default,
and I can't find a way to disable it, leading to clang assertion
failures looking like:
FAILED: ...clang.exe ...
Aninja: build stopped: subcommand failed.
With this fix, I get the desired:
FAILED: ...clang.exe ...
Assertion failed: SymbolMap...
ninja: build stopped: subcommand failed.
Diffstat (limited to 'src/line_printer.cc')
-rw-r--r-- | src/line_printer.cc | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/src/line_printer.cc b/src/line_printer.cc index a75eb05..3537e88 100644 --- a/src/line_printer.cc +++ b/src/line_printer.cc @@ -104,6 +104,10 @@ void LinePrinter::Print(string to_print, LineType type) { void LinePrinter::PrintOnNewLine(const string& to_print) { if (!have_blank_line_) printf("\n"); - printf("%s", to_print.c_str()); + if (!to_print.empty()) { + // Avoid printf and C strings, since the actual output might contain null + // bytes like UTF-16 does (yuck). + fwrite(&to_print[0], sizeof(char), to_print.size(), stdout); + } have_blank_line_ = to_print.empty() || *to_print.rbegin() == '\n'; } |