diff --git a/SystemTools.cxx b/SystemTools.cxx
index a389d601daced5ac0b46e15b7783584accdcc34d..7f0fe1293038784580482f307b7e9b4d1f51054b 100644
--- a/SystemTools.cxx
+++ b/SystemTools.cxx
@@ -35,6 +35,8 @@
 #include <stdlib.h>
 #include <sys/param.h>
 #include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
 #endif
 
 #if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__))
@@ -1846,6 +1848,38 @@ bool SystemTools::GetLineFromStream(kwsys_ios::istream& is, kwsys_stl::string& l
   return haveData;
 }
 
+int SystemTools::GetTerminalWidth()
+{
+  int width = -1;
+#ifndef _WIN32
+  struct winsize ws;
+  char *columns; /* Unix98 environment variable */
+  if(ioctl(1, TIOCGWINSZ, &ws) != -1 && ws.ws_col>0 && ws.ws_row>0)
+    {
+    width = ws.ws_col;
+    }
+  if(!isatty(STDOUT_FILENO))
+    {
+    width = -1;
+    }
+  columns = getenv("COLUMNS");
+  if(columns && *columns)
+    {
+    long t;
+    char *endptr;
+    t = strtol(columns, &endptr, 0);
+    if(endptr && !*endptr && (t>0) && (t<1000))
+      {
+      width = (int)t;
+      }
+    }
+  if ( width < 9 )
+    {
+    width = -1;
+    }
+#endif
+  return width;
+}
 } // namespace KWSYS_NAMESPACE
 
 #if defined(_MSC_VER) && defined(_DEBUG)
diff --git a/SystemTools.hxx.in b/SystemTools.hxx.in
index f0a5e3224724c77386e6df0bf9ac949736dcb09e..db8f6d6fea0dbe9cab40b7cae2395619e61b44fe 100644
--- a/SystemTools.hxx.in
+++ b/SystemTools.hxx.in
@@ -276,6 +276,13 @@ public:
    */
   static bool GetLineFromStream(kwsys_ios::istream& istr, kwsys_stl::string& line,
                                 bool* has_newline=0);
+
+  /**
+   * Get the width of the terminal window. The code may or may not work, so
+   * make sure you have some resonable defaults prepared if the code returns
+   * some bogus size.
+   */
+  static int GetTerminalWidth();
   
 protected:
   // these two functions can be called from ConvertToOutputPath