When -fmessage-length=N is not specified, and if standard error is
going to a terminal, word-wrap to the length of the terminal.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70611 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/clang-cc/clang-cc.cpp b/tools/clang-cc/clang-cc.cpp
index 12a537b..e26a1d9 100644
--- a/tools/clang-cc/clang-cc.cpp
+++ b/tools/clang-cc/clang-cc.cpp
@@ -62,6 +62,11 @@
#include "llvm/System/Path.h"
#include "llvm/System/Signals.h"
#include <cstdlib>
+#if HAVE_UNISTD_H
+# include <unistd.h>
+# include <sys/ioctl.h>
+# include <sys/types.h>
+#endif
using namespace clang;
@@ -1865,6 +1870,33 @@
static llvm::cl::list<std::string>
InputFilenames(llvm::cl::Positional, llvm::cl::desc("<input files>"));
+/// \brief Determine the width of the terminal we'll be printing to,
+/// if any.
+///
+/// \returns the width of the terminal (in characters), if there is a
+/// terminal. If there is no terminal, returns 0.
+static unsigned getTerminalWidth() {
+#if HAVE_UNISTD_H
+ // Is this a terminal? If not, don't wrap by default.
+ if (!isatty(/* Standard Error=*/2))
+ return 0;
+
+ // Try to determine the width of the terminal.
+ struct winsize ws;
+ unsigned Columns = 80; // A guess, in case the ioctl fails.
+ if (ioctl(2, TIOCGWINSZ, &ws) == 0)
+ Columns = ws.ws_col;
+
+ // Give ourselves just a little extra room, since printing to the
+ // end of the terminal will make it wrap when we don't want it to.
+ if (Columns)
+ --Columns;
+ return Columns;
+#endif
+
+ return 0;
+}
+
int main(int argc, char **argv) {
llvm::sys::PrintStackTraceOnErrorSignal();
llvm::PrettyStackTraceProgram X(argc, argv);
@@ -1877,7 +1909,7 @@
// If no input was specified, read from stdin.
if (InputFilenames.empty())
InputFilenames.push_back("-");
-
+
// Create the diagnostic client for reporting errors or for
// implementing -verify.
llvm::OwningPtr<DiagnosticClient> DiagClient;
@@ -1894,6 +1926,13 @@
}
} else if (HTMLDiag.empty()) {
// Print diagnostics to stderr by default.
+
+ // If -fmessage-length=N was not specified, determine whether this
+ // is a terminal and, if so, implicitly define -fmessage-length
+ // appropriately.
+ if (MessageLength.getNumOccurrences() == 0)
+ MessageLength.setValue(getTerminalWidth());
+
DiagClient.reset(new TextDiagnosticPrinter(llvm::errs(),
!NoShowColumn,
!NoCaretDiagnostics,