[Lldb-commits] [lldb] r226891 - Workaround for what looks like an OS X-specific libedit issue

Kate Stone katherine.stone at apple.com
Thu Jan 22 17:06:10 PST 2015


Author: kate
Date: Thu Jan 22 19:06:10 2015
New Revision: 226891

URL: http://llvm.org/viewvc/llvm-project?rev=226891&view=rev
Log:
Workaround for what looks like an OS X-specific libedit issue

Other platforms may benefit from something similar if issues arise.  The
libedit library doesn't explicitly initialize the curses termcap library,
which it gets away with until TERM is set to VT100 where it stumbles over
an implementation assumption that may not exist on other platforms.

<rdar://problem/17581929>

Modified:
    lldb/trunk/source/Host/common/Editline.cpp

Modified: lldb/trunk/source/Host/common/Editline.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Host/common/Editline.cpp?rev=226891&r1=226890&r2=226891&view=diff
==============================================================================
--- lldb/trunk/source/Host/common/Editline.cpp (original)
+++ lldb/trunk/source/Host/common/Editline.cpp Thu Jan 22 19:06:10 2015
@@ -24,6 +24,20 @@
 using namespace lldb_private;
 using namespace lldb_private::line_editor;
 
+// Workaround for what looks like an OS X-specific issue, but other platforms
+// may benefit from something similar if issues arise.  The libedit library
+// doesn't explicitly initialize the curses termcap library, which it gets away
+// with until TERM is set to VT100 where it stumbles over an implementation
+// assumption that may not exist on other platforms.  The setupterm() function
+// would normally require headers that don't work gracefully in this context, so
+// the function declaraction has been hoisted here.
+#if defined(__APPLE__)
+extern "C" {
+    int setupterm(char *term, int fildes, int *errret);
+}
+#define USE_SETUPTERM_WORKAROUND
+#endif
+
 // Editline uses careful cursor management to achieve the illusion of editing a multi-line block of text
 // with a single line editor.  Preserving this illusion requires fairly careful management of cursor
 // state.  Read and understand the relationship between DisplayInput(), MoveCursor(), SetCurrentLine(),
@@ -1313,6 +1327,10 @@ Editline::GetLine (std::string &line, bo
     m_editor_getting_char = false;
     m_revert_cursor_index = -1;
 
+#ifdef USE_SETUPTERM_WORKAROUND
+    setupterm((char *)0, fileno(m_output_file), (int *)0);
+#endif
+
     int count;
     auto input = el_wgets (m_editline, &count);
 
@@ -1359,6 +1377,9 @@ Editline::GetLines (int first_line_numbe
     m_revert_cursor_index = -1;
     while (m_editor_status == EditorStatus::Editing)
     {
+#ifdef USE_SETUPTERM_WORKAROUND
+        setupterm((char *)0, fileno(m_output_file), (int *)0);
+#endif
         int count;
         m_current_line_rows = -1;
         el_wpush (m_editline, EditLineConstString("\x1b[^")); // Revert to the existing line content





More information about the lldb-commits mailing list