summaryrefslogtreecommitdiffstats
path: root/contrib/less/ttyin.c
diff options
context:
space:
mode:
authorps <ps@FreeBSD.org>2000-05-22 09:53:22 +0000
committerps <ps@FreeBSD.org>2000-05-22 09:53:22 +0000
commit1b28029810e9c377087ea5a45acc8767cf0196b3 (patch)
tree27b16fc210b9a302c9e74f90e36a9b5ed21e6300 /contrib/less/ttyin.c
downloadFreeBSD-src-1b28029810e9c377087ea5a45acc8767cf0196b3.zip
FreeBSD-src-1b28029810e9c377087ea5a45acc8767cf0196b3.tar.gz
Import the [now] dual licensed version 3.5.4 of less. It is
distributed under your choice of the GPL or a BSD style license. Reviewed by: peter Obtained from: http://home.flash.net/~marknu/less/
Diffstat (limited to 'contrib/less/ttyin.c')
-rw-r--r--contrib/less/ttyin.c161
1 files changed, 161 insertions, 0 deletions
diff --git a/contrib/less/ttyin.c b/contrib/less/ttyin.c
new file mode 100644
index 0000000..ef87e25
--- /dev/null
+++ b/contrib/less/ttyin.c
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 1984-2000 Mark Nudelman
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Less License, as specified in the README file.
+ *
+ * For more information about less, or for information on how to
+ * contact the author, see the README file.
+ */
+
+
+/*
+ * Routines dealing with getting input from the keyboard (i.e. from the user).
+ */
+
+#include "less.h"
+#if MSDOS_COMPILER==WIN32C
+#include "windows.h"
+extern char WIN32getch();
+static DWORD console_mode;
+#endif
+
+static int tty;
+extern int sigs;
+
+/*
+ * Open keyboard for input.
+ */
+ public void
+open_getchr()
+{
+#if MSDOS_COMPILER==WIN32C
+ /* Need this to let child processes inherit our console handle */
+ SECURITY_ATTRIBUTES sa;
+ memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES));
+ sa.nLength = sizeof(SECURITY_ATTRIBUTES);
+ sa.bInheritHandle = TRUE;
+ tty = (int) CreateFile("CONIN$", GENERIC_READ,
+ FILE_SHARE_READ, &sa,
+ OPEN_EXISTING, 0L, NULL);
+ GetConsoleMode((HANDLE)tty, &console_mode);
+ /* Make sure we get Ctrl+C events. */
+ SetConsoleMode((HANDLE)tty, ENABLE_PROCESSED_INPUT);
+#else
+#if MSDOS_COMPILER || OS2
+ extern int fd0;
+ /*
+ * Open a new handle to CON: in binary mode
+ * for unbuffered keyboard read.
+ */
+ fd0 = dup(0);
+ close(0);
+ tty = open("CON", OPEN_READ);
+#if MSDOS_COMPILER==DJGPPC
+ /*
+ * Setting stdin to binary causes Ctrl-C to not
+ * raise SIGINT. We must undo that side-effect.
+ */
+ (void) __djgpp_set_ctrl_c(1);
+#endif
+#else
+ /*
+ * Try /dev/tty.
+ * If that doesn't work, use file descriptor 2,
+ * which in Unix is usually attached to the screen,
+ * but also usually lets you read from the keyboard.
+ */
+ tty = open("/dev/tty", OPEN_READ);
+ if (tty < 0)
+ tty = 2;
+#endif
+#endif
+}
+
+/*
+ * Close the keyboard.
+ */
+ public void
+close_getchr()
+{
+#if MSDOS_COMPILER==WIN32C
+ SetConsoleMode((HANDLE)tty, console_mode);
+ CloseHandle((HANDLE)tty);
+#endif
+}
+
+/*
+ * Get a character from the keyboard.
+ */
+ public int
+getchr()
+{
+ char c;
+ int result;
+
+ do
+ {
+#if MSDOS_COMPILER && MSDOS_COMPILER != DJGPPC
+ /*
+ * In raw read, we don't see ^C so look here for it.
+ */
+ flush();
+#if MSDOS_COMPILER==WIN32C
+ if (ABORT_SIGS())
+ return (READ_INTR);
+ c = WIN32getch(tty);
+#else
+ c = getch();
+#endif
+ result = 1;
+ if (c == '\003')
+ return (READ_INTR);
+#else
+#if OS2
+ {
+ static int scan = -1;
+ flush();
+ if (scan >= 0)
+ {
+ c = scan;
+ scan = -1;
+ } else
+ {
+ if ((c = _read_kbd(0, 1, 0)) == -1)
+ return (READ_INTR);
+ if (c == '\0')
+ {
+ /*
+ * Zero is usually followed by another byte,
+ * since certain keys send two bytes.
+ */
+ scan = _read_kbd(0, 0, 0);
+ }
+ }
+ result = 1;
+ }
+#else
+ result = iread(tty, &c, sizeof(char));
+ if (result == READ_INTR)
+ return (READ_INTR);
+ if (result < 0)
+ {
+ /*
+ * Don't call error() here,
+ * because error calls getchr!
+ */
+ quit(QUIT_ERROR);
+ }
+#endif
+#endif
+ /*
+ * Various parts of the program cannot handle
+ * an input character of '\0'.
+ * If a '\0' was actually typed, convert it to '\340' here.
+ */
+ if (c == '\0')
+ c = '\340';
+ } while (result != 1);
+
+ return (c & 0377);
+}
OpenPOWER on IntegriCloud