diff options
Diffstat (limited to 'mdk-stage1/slang/slutty.c')
-rw-r--r-- | mdk-stage1/slang/slutty.c | 596 |
1 files changed, 0 insertions, 596 deletions
diff --git a/mdk-stage1/slang/slutty.c b/mdk-stage1/slang/slutty.c deleted file mode 100644 index 636c1bb90..000000000 --- a/mdk-stage1/slang/slutty.c +++ /dev/null @@ -1,596 +0,0 @@ -/* slutty.c --- Unix Low level terminal (tty) functions for S-Lang */ -/* Copyright (c) 1992, 1999, 2001 John E. Davis - * This file is part of the S-Lang library. - * - * You may distribute under the terms of either the GNU General Public - * License or the Perl Artistic License. - */ - -#include "slinclud.h" - -#include <signal.h> -/* sequent support thanks to Kenneth Lorber <keni@oasys.dt.navy.mil> */ -/* SYSV (SYSV ISC R3.2 v3.0) provided by iain.lea@erlm.siemens.de */ - -#if defined (_AIX) && !defined (_ALL_SOURCE) -# define _ALL_SOURCE /* so NBBY is defined in <sys/types.h> */ -#endif - -#include <sys/time.h> -#include <sys/types.h> - -#ifdef SYSV -# include <fcntl.h> -# ifndef CRAY -# include <sys/termio.h> -# include <sys/stream.h> -# include <sys/ptem.h> -# include <sys/tty.h> -# endif -#endif - -#ifdef __BEOS__ -/* Prototype for select */ -# include <net/socket.h> -#endif - -#include <sys/file.h> - -#ifndef sun -# include <sys/ioctl.h> -#endif - -#ifdef __QNX__ -# include <sys/select.h> -#endif - -#include <sys/stat.h> -#include <errno.h> - -#if defined (_AIX) && !defined (FD_SET) -# include <sys/select.h> /* for FD_ISSET, FD_SET, FD_ZERO */ -#endif - -#ifndef O_RDWR -# include <fcntl.h> -#endif - -#include "slang.h" -#include "_slang.h" - -int SLang_TT_Read_FD = -1; -int SLang_TT_Baud_Rate; - -#ifdef HAVE_TERMIOS_H -# if !defined(HAVE_TCGETATTR) || !defined(HAVE_TCSETATTR) -# undef HAVE_TERMIOS_H -# endif -#endif - -#ifndef HAVE_TERMIOS_H - -# if !defined(CBREAK) && defined(sun) -# ifndef BSD_COMP -# define BSD_COMP 1 -# endif -# include <sys/ioctl.h> -# endif - -typedef struct - { - struct tchars t; - struct ltchars lt; - struct sgttyb s; - } -TTY_Termio_Type; -#else -# include <termios.h> -typedef struct termios TTY_Termio_Type; -#endif - -static TTY_Termio_Type Old_TTY; - -#ifdef HAVE_TERMIOS_H -typedef struct -{ - unsigned int key; - unsigned int value; -} Baud_Rate_Type; - -static Baud_Rate_Type Baud_Rates [] = -{ -#ifdef B0 - {B0, 0}, -#endif -#ifdef B50 - {B50, 50}, -#endif -#ifdef B75 - {B75, 75}, -#endif -#ifdef B110 - {B110, 110}, -#endif -#ifdef B134 - {B134, 134}, -#endif -#ifdef B150 - {B150, 150}, -#endif -#ifdef B200 - {B200, 200}, -#endif -#ifdef B300 - {B300, 300}, -#endif -#ifdef B600 - {B600, 600}, -#endif -#ifdef B1200 - {B1200, 1200}, -#endif -#ifdef B1800 - {B1800, 1800}, -#endif -#ifdef B2400 - {B2400, 2400}, -#endif -#ifdef B4800 - {B4800, 4800}, -#endif -#ifdef B9600 - {B9600, 9600}, -#endif -#ifdef B19200 - {B19200, 19200}, -#endif -#ifdef B38400 - {B38400, 38400}, -#endif -#ifdef B57600 - {B57600, 57600}, -#endif -#ifdef B115200 - {B115200, 115200}, -#endif -#ifdef B230400 - {B230400, 230400}, -#endif - {0, 0} -}; - -static void -set_baud_rate (TTY_Termio_Type *tty) -{ -#ifdef HAVE_CFGETOSPEED - unsigned int speed; - Baud_Rate_Type *b, *bmax; - - if (SLang_TT_Baud_Rate) - return; /* already set */ - - speed = (unsigned int) cfgetospeed (tty); - - b = Baud_Rates; - bmax = b + (sizeof (Baud_Rates)/sizeof(Baud_Rates[0])); - while (b < bmax) - { - if (b->key == speed) - { - SLang_TT_Baud_Rate = b->value; - return; - } - b++; - } -#else - (void) tty; -#endif -} - -#endif /* HAVE_TERMIOS_H */ - -#ifdef HAVE_TERMIOS_H -# define GET_TERMIOS(fd, x) tcgetattr(fd, x) -# define SET_TERMIOS(fd, x) tcsetattr(fd, TCSADRAIN, x) -#else -# ifdef TCGETS -# define GET_TERMIOS(fd, x) ioctl(fd, TCGETS, x) -# define SET_TERMIOS(fd, x) ioctl(fd, TCSETS, x) -# else -# define X(x,m) &(((TTY_Termio_Type *)(x))->m) -# define GET_TERMIOS(fd, x) \ - ((ioctl(fd, TIOCGETC, X(x,t)) || \ - ioctl(fd, TIOCGLTC, X(x,lt)) || \ - ioctl(fd, TIOCGETP, X(x,s))) ? -1 : 0) -# define SET_TERMIOS(fd, x) \ - ((ioctl(fd, TIOCSETC, X(x,t)) ||\ - ioctl(fd, TIOCSLTC, X(x,lt)) || \ - ioctl(fd, TIOCSETP, X(x,s))) ? -1 : 0) -# endif -#endif - -static int TTY_Inited = 0; -static int TTY_Open = 0; - -#ifdef ultrix /* Ultrix gets _POSIX_VDISABLE wrong! */ -# define NULL_VALUE -1 -#else -# ifdef _POSIX_VDISABLE -# define NULL_VALUE _POSIX_VDISABLE -# else -# define NULL_VALUE 255 -# endif -#endif - -int SLang_init_tty (int abort_char, int no_flow_control, int opost) -{ - TTY_Termio_Type newtty; - - SLsig_block_signals (); - - if (TTY_Inited) - { - SLsig_unblock_signals (); - return 0; - } - - TTY_Open = 0; - - if ((SLang_TT_Read_FD == -1) - || (1 != isatty (SLang_TT_Read_FD))) - { -#ifdef O_RDWR -# ifndef __BEOS__ /* I have been told that BEOS will HANG if passed /dev/tty */ - if ((SLang_TT_Read_FD = open("/dev/tty", O_RDWR)) >= 0) - { - TTY_Open = 1; - } -# endif -#endif - if (TTY_Open == 0) - { - SLang_TT_Read_FD = fileno (stderr); - if (1 != isatty (SLang_TT_Read_FD)) - { - SLang_TT_Read_FD = fileno (stdin); - if (1 != isatty (SLang_TT_Read_FD)) - { - fprintf (stderr, "Failed to open terminal."); - return -1; - } - } - } - } - - SLang_Abort_Char = abort_char; - - /* Some systems may not permit signals to be blocked. As a result, the - * return code must be checked. - */ - while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &Old_TTY)) - { - if (errno != EINTR) - { - SLsig_unblock_signals (); - return -1; - } - } - - while (-1 == GET_TERMIOS(SLang_TT_Read_FD, &newtty)) - { - if (errno != EINTR) - { - SLsig_unblock_signals (); - return -1; - } - } - -#ifndef HAVE_TERMIOS_H - newtty.s.sg_flags &= ~(ECHO); - newtty.s.sg_flags &= ~(CRMOD); - /* if (Flow_Control == 0) newtty.s.sg_flags &= ~IXON; */ - newtty.t.t_eofc = 1; - if (abort_char == -1) SLang_Abort_Char = newtty.t.t_intrc; - newtty.t.t_intrc = SLang_Abort_Char; /* ^G */ - newtty.t.t_quitc = 255; - newtty.lt.t_suspc = 255; /* to ignore ^Z */ - newtty.lt.t_dsuspc = 255; /* to ignore ^Y */ - newtty.lt.t_lnextc = 255; - newtty.s.sg_flags |= CBREAK; /* do I want cbreak or raw????? */ -#else - - /* get baud rate */ - - newtty.c_iflag &= ~(ECHO | INLCR | ICRNL); -#ifdef ISTRIP - /* newtty.c_iflag &= ~ISTRIP; */ -#endif - if (opost == 0) newtty.c_oflag &= ~OPOST; - - set_baud_rate (&newtty); - - if (no_flow_control) newtty.c_iflag &= ~IXON; else newtty.c_iflag |= IXON; - - newtty.c_cc[VEOF] = 1; - newtty.c_cc[VMIN] = 1; - newtty.c_cc[VTIME] = 0; - newtty.c_lflag = ISIG | NOFLSH; - if (abort_char == -1) SLang_Abort_Char = newtty.c_cc[VINTR]; - newtty.c_cc[VINTR] = SLang_Abort_Char; /* ^G */ - newtty.c_cc[VQUIT] = NULL_VALUE; - newtty.c_cc[VSUSP] = NULL_VALUE; /* to ignore ^Z */ -#ifdef VDSUSP - newtty.c_cc[VDSUSP] = NULL_VALUE; /* to ignore ^Y */ -#endif -#ifdef VLNEXT - newtty.c_cc[VLNEXT] = NULL_VALUE; /* to ignore ^V ? */ -#endif -#ifdef VSWTCH - newtty.c_cc[VSWTCH] = NULL_VALUE; /* to ignore who knows what */ -#endif -#endif /* NOT HAVE_TERMIOS_H */ - - while (-1 == SET_TERMIOS(SLang_TT_Read_FD, &newtty)) - { - if (errno != EINTR) - { - SLsig_unblock_signals (); - return -1; - } - } - - TTY_Inited = 1; - SLsig_unblock_signals (); - return 0; -} - -void SLtty_set_suspend_state (int mode) -{ - TTY_Termio_Type newtty; - - SLsig_block_signals (); - - if (TTY_Inited == 0) - { - SLsig_unblock_signals (); - return; - } - - while ((-1 == GET_TERMIOS (SLang_TT_Read_FD, &newtty)) - && (errno == EINTR)) - ; - -#ifndef HAVE_TERMIOS_H - /* I do not know if all systems define the t_dsuspc field */ - if (mode == 0) - { - newtty.lt.t_suspc = 255; - newtty.lt.t_dsuspc = 255; - } - else - { - newtty.lt.t_suspc = Old_TTY.lt.t_suspc; - newtty.lt.t_dsuspc = Old_TTY.lt.t_dsuspc; - } -#else - if (mode == 0) - { - newtty.c_cc[VSUSP] = NULL_VALUE; -#ifdef VDSUSP - newtty.c_cc[VDSUSP] = NULL_VALUE; -#endif - } - else - { - newtty.c_cc[VSUSP] = Old_TTY.c_cc[VSUSP]; -#ifdef VDSUSP - newtty.c_cc[VDSUSP] = Old_TTY.c_cc[VDSUSP]; -#endif - } -#endif - - while ((-1 == SET_TERMIOS (SLang_TT_Read_FD, &newtty)) - && (errno == EINTR)) - ; - - SLsig_unblock_signals (); -} - -void SLang_reset_tty (void) -{ - SLsig_block_signals (); - - if (TTY_Inited == 0) - { - SLsig_unblock_signals (); - return; - } - - while ((-1 == SET_TERMIOS(SLang_TT_Read_FD, &Old_TTY)) - && (errno == EINTR)) - ; - - if (TTY_Open) - { - while ((-1 == close (SLang_TT_Read_FD)) - && (errno == EINTR)) - ; - - TTY_Open = 0; - SLang_TT_Read_FD = -1; - } - - TTY_Inited = 0; - SLsig_unblock_signals (); -} - -static void default_sigint (int sig) -{ - sig = errno; /* use parameter */ - - SLKeyBoard_Quit = 1; - if (SLang_Ignore_User_Abort == 0) SLang_Error = SL_USER_BREAK; - SLsignal_intr (SIGINT, default_sigint); - errno = sig; -} - -int SLang_set_abort_signal (void (*hand)(int)) -{ - int save_errno = errno; - SLSig_Fun_Type *f; - - if (hand == NULL) hand = default_sigint; - f = SLsignal_intr (SIGINT, hand); - - errno = save_errno; - - if (f == (SLSig_Fun_Type *) SIG_ERR) - return -1; - - return 0; -} - -#ifndef FD_SET -#define FD_SET(fd, tthis) *(tthis) = 1 << (fd) -#define FD_ZERO(tthis) *(tthis) = 0 -#define FD_ISSET(fd, tthis) (*(tthis) & (1 << fd)) -typedef int fd_set; -#endif - -static fd_set Read_FD_Set; - -/* HACK: If > 0, use 1/10 seconds. If < 0, use 1/1000 seconds */ - -int _SLsys_input_pending(int tsecs) -{ - struct timeval wait; - long usecs, secs; - - if (TTY_Inited == 0) return -1; - - if (tsecs >= 0) - { - secs = tsecs / 10; - usecs = (tsecs % 10) * 100000; - } - else - { - tsecs = -tsecs; - secs = tsecs / 1000; - usecs = (tsecs % 1000) * 1000; - } - - wait.tv_sec = secs; - wait.tv_usec = usecs; - - FD_ZERO(&Read_FD_Set); - FD_SET(SLang_TT_Read_FD, &Read_FD_Set); - - return select(SLang_TT_Read_FD + 1, &Read_FD_Set, NULL, NULL, &wait); -} - -int (*SLang_getkey_intr_hook) (void); - -static int handle_interrupt (void) -{ - if (SLang_getkey_intr_hook != NULL) - { - int save_tty_fd = SLang_TT_Read_FD; - - if (-1 == (*SLang_getkey_intr_hook) ()) - return -1; - - if (save_tty_fd != SLang_TT_Read_FD) - return -1; - } - - return 0; -} - -unsigned int _SLsys_getkey (void) -{ - unsigned char c; - - if (TTY_Inited == 0) - { - int ic = fgetc (stdin); - if (ic == EOF) return SLANG_GETKEY_ERROR; - return (unsigned int) ic; - } - - while (1) - { - int ret; - - if (SLKeyBoard_Quit) - return SLang_Abort_Char; - - if (0 == (ret = _SLsys_input_pending (100))) - continue; - - if (ret != -1) - break; - - if (SLKeyBoard_Quit) - return SLang_Abort_Char; - - if (errno == EINTR) - { - if (-1 == handle_interrupt ()) - return SLANG_GETKEY_ERROR; - - continue; - } - - break; /* let read handle it */ - } - - while (1) - { - int status = read(SLang_TT_Read_FD, (char *) &c, 1); - - if (status > 0) - break; - - if (status == 0) - { - /* We are at the end of a file. Let application handle it. */ - return SLANG_GETKEY_ERROR; - } - - if (errno == EINTR) - { - if (-1 == handle_interrupt ()) - return SLANG_GETKEY_ERROR; - - if (SLKeyBoard_Quit) - return SLang_Abort_Char; - - continue; - } -#ifdef EAGAIN - if (errno == EAGAIN) - { - sleep (1); - continue; - } -#endif -#ifdef EWOULDBLOCK - if (errno == EWOULDBLOCK) - { - sleep (1); - continue; - } -#endif -#ifdef EIO - if (errno == EIO) - { - SLang_exit_error ("_SLsys_getkey: EIO error."); - } -#endif - return SLANG_GETKEY_ERROR; - } - - return((unsigned int) c); -} - |