aboutsummaryrefslogtreecommitdiff
path: root/readline/input.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2016-09-17 11:50:37 +0300
committerEli Zaretskii <eliz@gnu.org>2016-09-17 11:50:37 +0300
commit7f3c5ec870943f7f32c946ff9459dfd04fcb8e07 (patch)
treec1249a2049135698e852cf637d29c70fd39ce537 /readline/input.c
parenta3fa21cadc29421553d2c956056f0a777dafd3d2 (diff)
downloadbinutils-7f3c5ec870943f7f32c946ff9459dfd04fcb8e07.zip
binutils-7f3c5ec870943f7f32c946ff9459dfd04fcb8e07.tar.gz
binutils-7f3c5ec870943f7f32c946ff9459dfd04fcb8e07.tar.bz2
Improve MinGW support in Readline
These changes were already accepted upstream in Readline, but GDB did not yet import a newer Readline version. readline/Changelog.gdb: * util.c: Include rlshell.h. (_rl_tropen) [_WIN32 && !__CYGWIN__]: Open the trace file in the user's temporary directory. * tcap.h [HAVE_NCURSES_TERMCAP_H]: Include ncurses/termcap.h. * input.c (w32_isatty) [_WIN32 && !__CYGWIN__]: New function, to replace isatty that is not reliable enough on MS-Windows. (isatty) [_WIN32 && !__CYGWIN__]: Redirect to w32_isatty. (rl_getc): Call _getch, not getch, which could be an ncurses function when linked with ncurses, in which case getch will return EOF for any keystroke, because there's no curses window. * tilde.c (tilde_expand_word) [_WIN32]: * histfile.c (history_filename) [_WIN32]: Windows-specific environment variable to replace HOME if that is undefined. * funmap.c (default_funmap): Compile rl_paste_from_clipboard on all Windows platforms, not just Cygwin. * readline.h (rl_paste_from_clipboard): Include declaration for all Windows platforms. * display.c (insert_some_chars, delete_chars): Don't use the MinGW-specific code if linked with ncurses. * configure.in: * config.h.in: Support ncurses/termcap.h. The configure script was updated accordingly. * complete.c [_WIN32 && !__CYGWIN__]: Initialize _rl_completion_case_fold to 1. (printable_part, rl_filename_completion_function) [_WIN32 && !__CYGWIN__]: Handle the drive letter.
Diffstat (limited to 'readline/input.c')
-rw-r--r--readline/input.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/readline/input.c b/readline/input.c
index 7c74c99..e35277f 100644
--- a/readline/input.c
+++ b/readline/input.c
@@ -86,6 +86,36 @@ static int ibuffer_space PARAMS((void));
static int rl_get_char PARAMS((int *));
static int rl_gather_tyi PARAMS((void));
+#if defined (_WIN32) && !defined (__CYGWIN__)
+
+/* 'isatty' in the Windows runtime returns non-zero for every
+ character device, including the null device. Repair that. */
+#include <io.h>
+#define WIN32_LEAN_AND_MEAN 1
+#include <windows.h>
+
+int w32_isatty (int fd)
+{
+ if (_isatty(fd))
+ {
+ HANDLE h = (HANDLE) _get_osfhandle (fd);
+ DWORD ignored;
+
+ if (h == INVALID_HANDLE_VALUE)
+ {
+ errno = EBADF;
+ return 0;
+ }
+ if (GetConsoleMode (h, &ignored) != 0)
+ return 1;
+ }
+ errno = ENOTTY;
+ return 0;
+}
+
+#define isatty(x) w32_isatty(x)
+#endif
+
/* **************************************************************** */
/* */
/* Character Input Buffering */
@@ -465,8 +495,10 @@ rl_getc (stream)
RL_CHECK_SIGNALS ();
#if defined (__MINGW32__)
+ /* Use _getch to make sure we call the function from MS runtime,
+ even if some curses library is linked in. */
if (isatty (fileno (stream)))
- return (getch ());
+ return (_getch ());
#endif
result = read (fileno (stream), &c, sizeof (unsigned char));