[project @ 2002-07-18 22:01:07 by sof]
[ghc-base.git] / cbits / consUtils.c
diff --git a/cbits/consUtils.c b/cbits/consUtils.c
new file mode 100644 (file)
index 0000000..fd51440
--- /dev/null
@@ -0,0 +1,67 @@
+/* 
+ * (c) The University of Glasgow 2002
+ *
+ * Win32 Console API support
+ */
+#include "config.h"
+#if defined(mingw32_TARGET_OS) || defined(cygwin32_TARGET_OS)
+/* to the end */
+
+#include "consUtils.h"
+#include <windows.h>
+#include <io.h>
+
+#if defined(cygwin32_TARGET_OS)
+#define _get_osfhandle get_osfhandle
+#endif
+
+int
+set_console_buffering__(int fd, int cooked)
+{
+    HANDLE h;
+    DWORD  st;
+    /* According to GetConsoleMode() docs, it is not possible to
+       leave ECHO_INPUT enabled without also having LINE_INPUT,
+       so we have to turn both off here. */
+    DWORD flgs = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT;
+    
+    if ( (h = (HANDLE)_get_osfhandle(fd)) != INVALID_HANDLE_VALUE ) {
+       if ( GetConsoleMode(h,&st) &&
+            SetConsoleMode(h, cooked ? (st | ENABLE_LINE_INPUT) : st & ~flgs)  ) {
+           return 0;
+       }
+    }
+    return -1;
+}
+
+int
+set_console_echo__(int fd, int on)
+{
+    HANDLE h;
+    DWORD  st;
+    DWORD flgs = ENABLE_LINE_INPUT | ENABLE_ECHO_INPUT;
+    
+    if ( (h = (HANDLE)_get_osfhandle(fd)) != INVALID_HANDLE_VALUE ) {
+       if ( GetConsoleMode(h,&st) && 
+            SetConsoleMode(h,( on ? (st | flgs) : (st & ~ENABLE_ECHO_INPUT))) ) {
+           return 0;
+       }
+    }
+    return -1;
+}
+
+int
+get_console_echo__(int fd)
+{
+    HANDLE h;
+    DWORD  st;
+    
+    if ( (h = (HANDLE)_get_osfhandle(fd)) != INVALID_HANDLE_VALUE ) {
+       if ( GetConsoleMode(h,&st) ) {
+           return (st & ENABLE_ECHO_INPUT ? 1 : 0);
+       }
+    }
+    return -1;
+}
+
+#endif /* defined(mingw32_TARGET_OS) || defined(cygwin32_TARGET_OS) */