Fix for missing prompt on Windows
authorTed Woodward <ted.woodward@codeaurora.org>
Thu, 24 Mar 2016 20:35:03 +0000 (20:35 +0000)
committerTed Woodward <ted.woodward@codeaurora.org>
Thu, 24 Mar 2016 20:35:03 +0000 (20:35 +0000)
Summary: On Windows (and possibly other hosts with LLDB_DISABLE_LIBEDIT defined), the (lldb) prompt won't print after async output, like from a breakpoint hit or a step. This patch forces the prompt to be printed out after async output.

Reviewers: zturner, clayborg

Subscribers: amccarth, lldb-commits

Differential Revision: http://reviews.llvm.org/D18335

llvm-svn: 264332

lldb/source/Core/IOHandler.cpp

index 130fa02..a73fce8 100644 (file)
 #include "lldb/Target/StackFrame.h"
 #endif
 
+#ifdef _MSC_VER
+#include <Windows.h>
+#endif
+
 using namespace lldb;
 using namespace lldb_private;
 
@@ -773,7 +777,26 @@ IOHandlerEditline::PrintAsync (Stream *stream, const char *s, size_t len)
         m_editline_ap->PrintAsync(stream, s, len);
     else
 #endif
+    {
+        const char *prompt = GetPrompt();
+#ifdef _MSC_VER
+        if (prompt)
+        {
+            // Back up over previous prompt using Windows API
+            CONSOLE_SCREEN_BUFFER_INFO screen_buffer_info;
+            HANDLE console_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+            GetConsoleScreenBufferInfo(console_handle, &screen_buffer_info);
+            COORD coord = screen_buffer_info.dwCursorPosition;
+            coord.X -= strlen(prompt);
+            if (coord.X < 0)
+                coord.X = 0;
+            SetConsoleCursorPosition(console_handle, coord);
+        }
+#endif
         IOHandler::PrintAsync(stream, s, len);
+        if (prompt)
+            IOHandler::PrintAsync(GetOutputStreamFile().get(), prompt, strlen(prompt));
+    }
 }
 
 // we may want curses to be disabled for some builds