diff options
author | Eli Zaretskii <eliz@gnu.org> | 2016-09-17 11:50:37 +0300 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2016-09-17 11:50:37 +0300 |
commit | 7f3c5ec870943f7f32c946ff9459dfd04fcb8e07 (patch) | |
tree | c1249a2049135698e852cf637d29c70fd39ce537 /readline/input.c | |
parent | a3fa21cadc29421553d2c956056f0a777dafd3d2 (diff) | |
download | gdb-7f3c5ec870943f7f32c946ff9459dfd04fcb8e07.zip gdb-7f3c5ec870943f7f32c946ff9459dfd04fcb8e07.tar.gz gdb-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.c | 34 |
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)); |