summaryrefslogtreecommitdiffstats
path: root/src/line_printer.cc
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2013-07-02 06:00:22 (GMT)
committerReid Kleckner <rnk@google.com>2013-07-02 06:06:54 (GMT)
commitad76e867f782e75e0fed620e7b39f7099af154a9 (patch)
tree5e5a80853123138bfffedbddb4ad9e776d15f166 /src/line_printer.cc
parentda06d2969039ad6a80b4d864fb6c432fef4de47f (diff)
downloadNinja-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.cc6
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';
}