X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=cbits%2FconsUtils.c;h=b20eb7ae07c496c55b20c8943fc058b868863aab;hb=3a7e8de77666fab3f6d2a7fc5c813cbca77ad57d;hp=af29b599f4c7f3e5641a6be825031447f5c12a5c;hpb=ec3ba94b254bd444e7a1c560c1d91c4879948c69;p=ghc-base.git diff --git a/cbits/consUtils.c b/cbits/consUtils.c index af29b59..b20eb7a 100644 --- a/cbits/consUtils.c +++ b/cbits/consUtils.c @@ -3,18 +3,40 @@ * * Win32 Console API support */ -#include "ghcconfig.h" -#if defined(mingw32_HOST_OS) || defined(cygwin32_HOST_OS) || defined(__MINGW32__) || defined(_MSC_VER) +#if defined(_MSC_VER) || defined(__MINGW32__) || defined(_WIN32) || defined(__CYGWIN__) /* to the end */ #include "consUtils.h" #include #include -#if defined(cygwin32_HOST_OS) +#if defined(__CYGWIN__) #define _get_osfhandle get_osfhandle #endif +int is_console__(int fd) { + DWORD st; + HANDLE h; + if (!_isatty(fd)) { + /* TTY must be a character device */ + return 0; + } + h = (HANDLE)_get_osfhandle(fd); + if (h == INVALID_HANDLE_VALUE) { + /* Broken handle can't be terminal */ + return 0; + } + if (!GetConsoleMode(h, &st)) { + /* GetConsoleMode appears to fail when it's not a TTY. In + particular, it's what most of our terminal functions + assume works, so if it doesn't work for all intents + and purposes we're not dealing with a terminal. */ + return 0; + } + return 1; +} + + int set_console_buffering__(int fd, int cooked) { @@ -64,4 +86,26 @@ get_console_echo__(int fd) return -1; } -#endif /* defined(mingw32_HOST_OS) || ... */ +int +flush_input_console__(int fd) +{ + HANDLE h = (HANDLE)_get_osfhandle(fd); + + if ( h != INVALID_HANDLE_VALUE ) { + /* If the 'fd' isn't connected to a console; treat the flush + * operation as a NOP. + */ + DWORD unused; + if ( !GetConsoleMode(h,&unused) && + GetLastError() == ERROR_INVALID_HANDLE ) { + return 0; + } + if ( FlushConsoleInputBuffer(h) ) { + return 0; + } + } + /* ToDo: translate GetLastError() into something errno-friendly */ + return -1; +} + +#endif /* defined(__MINGW32__) || ... */