瀏覽代碼

ENH: Add method to retrieve the terminal width

Andy Cedilnik 21 年之前
父節點
當前提交
6a4071b5d2
共有 2 個文件被更改,包括 41 次插入0 次删除
  1. 34 0
      Source/kwsys/SystemTools.cxx
  2. 7 0
      Source/kwsys/SystemTools.hxx.in

+ 34 - 0
Source/kwsys/SystemTools.cxx

@@ -35,6 +35,8 @@
 #include <stdlib.h>
 #include <stdlib.h>
 #include <sys/param.h>
 #include <sys/param.h>
 #include <sys/wait.h>
 #include <sys/wait.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
 #endif
 #endif
 
 
 #if defined(_WIN32) && (defined(_MSC_VER) || defined(__BORLANDC__) || defined(__MINGW32__))
 #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;
   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
 } // namespace KWSYS_NAMESPACE
 
 
 #if defined(_MSC_VER) && defined(_DEBUG)
 #if defined(_MSC_VER) && defined(_DEBUG)

+ 7 - 0
Source/kwsys/SystemTools.hxx.in

@@ -276,6 +276,13 @@ public:
    */
    */
   static bool GetLineFromStream(kwsys_ios::istream& istr, kwsys_stl::string& line,
   static bool GetLineFromStream(kwsys_ios::istream& istr, kwsys_stl::string& line,
                                 bool* has_newline=0);
                                 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:
 protected:
   // these two functions can be called from ConvertToOutputPath
   // these two functions can be called from ConvertToOutputPath