diff options
Diffstat (limited to 'lib/libcurses/lib_kernel.c')
-rw-r--r-- | lib/libcurses/lib_kernel.c | 309 |
1 files changed, 309 insertions, 0 deletions
diff --git a/lib/libcurses/lib_kernel.c b/lib/libcurses/lib_kernel.c new file mode 100644 index 00000000000..622c549acea --- /dev/null +++ b/lib/libcurses/lib_kernel.c @@ -0,0 +1,309 @@ + +/*************************************************************************** +* COPYRIGHT NOTICE * +**************************************************************************** +* ncurses is copyright (C) 1992-1995 * +* Zeyd M. Ben-Halim * +* zmbenhal@netcom.com * +* Eric S. Raymond * +* esr@snark.thyrsus.com * +* * +* Permission is hereby granted to reproduce and distribute ncurses * +* by any means and for any fee, whether alone or as part of a * +* larger distribution, in source or in binary form, PROVIDED * +* this notice is included with any such distribution, and is not * +* removed from any of its header files. Mention of ncurses in any * +* applications linked with it is highly appreciated. * +* * +* ncurses comes AS IS with no warranty, implied or expressed. * +* * +***************************************************************************/ + + +/* + * lib_kernel.c + * + * Misc. low-level routines: + * napms() + * reset_prog_mode() + * reset_shell_mode() + * baudrate() + * delay_output() + * erasechar() + * killchar() + * flushinp() + * savetty() + * resetty() + * + * + */ + +#include "curses.priv.h" +#include "term.h" /* cur_term, pad_char */ +#include <errno.h> +#if !HAVE_EXTERN_ERRNO +extern int errno; +#endif + +int napms(int ms) +{ + T(("napms(%d) called", ms)); + + usleep(1000*(unsigned)ms); + return OK; +} + +#ifndef EXTERN_TERMINFO +int reset_prog_mode(void) +{ + T(("reset_prog_mode() called")); + +#ifdef TERMIOS + tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Nttyb); +#else + stty(cur_term->Filedes, &cur_term->Nttyb); +#endif + if (SP && stdscr && stdscr->_use_keypad) + _nc_keypad(TRUE); + + return OK; +} + + +int reset_shell_mode(void) +{ + T(("reset_shell_mode() called")); + + if (SP) + { + fflush(SP->_ofp); + _nc_keypad(FALSE); + } + +#ifdef TERMIOS + tcsetattr(cur_term->Filedes, TCSANOW, &cur_term->Ottyb); +#else + stty(cur_term->Filedes, &cur_term->Ottyb); +#endif + return OK; +} +#endif /* EXTERN_TERMINFO */ + +int delay_output(float ms) +{ + T(("delay_output(%f) called", ms)); + + if (SP == 0 || SP->_baudrate == ERR) + return(ERR); +#ifdef no_pad_char + else if (no_pad_char) + _nc_timed_wait(0, (int)ms, (int *)NULL); +#endif /* no_pad_char */ + else { + register int nullcount; + char null = '\0'; + +#ifdef pad_char + if (pad_char) + null = pad_char[0]; +#endif /* pad_char */ + + for (nullcount = ms * 1000 / SP->_baudrate; nullcount > 0; nullcount--) + putc(null, SP->_ofp); + (void) fflush(SP->_ofp); + } + + return OK; +} + +/* + * erasechar() + * + * Return erase character as given in cur_term->Ottyb. + * + */ + +char +erasechar(void) +{ + T(("erasechar() called")); + +#ifdef TERMIOS + return(cur_term->Ottyb.c_cc[VERASE]); +#else + return(cur_term->Ottyb.sg_erase); +#endif + +} + + + +/* + * killchar() + * + * Return kill character as given in cur_term->Ottyb. + * + */ + +char +killchar(void) +{ + T(("killchar() called")); + +#ifdef TERMIOS + return(cur_term->Ottyb.c_cc[VKILL]); +#else + return(cur_term->Ottyb.sg_kill); +#endif +} + + + +/* + * flushinp() + * + * Flush any input on cur_term->Filedes + * + */ + +int flushinp(void) +{ + T(("flushinp() called")); + +#ifdef TERMIOS + tcflush(cur_term->Filedes, TCIFLUSH); +#else + errno = 0; + do { + ioctl(cur_term->Filedes, TIOCFLUSH, 0); + } while + (errno == EINTR); +#endif + if (SP) { + SP->_fifohead = -1; + SP->_fifotail = 0; + SP->_fifopeek = 0; + } + return OK; + +} + + + +/* + * int + * baudrate() + * + * Returns the current terminal's baud rate. + * + */ + +struct speed { + speed_t s; + int sp; +}; + +static struct speed const speeds[] = { + {B0, 0}, + {B50, 50}, + {B75, 75}, + {B110, 110}, + {B134, 134}, + {B150, 150}, + {B200, 200}, + {B300, 300}, + {B600, 600}, + {B1200, 1200}, + {B1800, 1800}, + {B2400, 2400}, + {B4800, 4800}, + {B9600, 9600}, +#define MAX_BAUD B9600 +#ifdef B19200 +#undef MAX_BAUD +#define MAX_BAUD B19200 + {B19200, 19200}, +#else +#ifdef EXTA +#define MAX_BAUD EXTA + {EXTA, 19200}, +#endif +#endif +#ifdef B38400 +#undef MAX_BAUD +#define MAX_BAUD B38400 + {B38400, 38400}, +#else +#ifdef EXTB +#define MAX_BAUD EXTB + {EXTB, 38400}, +#endif +#endif +#ifdef B57600 +#undef MAX_BAUD +#define MAX_BAUD B57600 + {B57600, 57600}, +#endif +#ifdef B115200 +#undef MAX_BAUD +#define MAX_BAUD B115200 + {B115200, 115200}, +#endif +}; + +int +baudrate(void) +{ +int i, ret; + + T(("baudrate() called")); + +#ifdef TERMIOS + ret = cfgetospeed(&cur_term->Nttyb); +#else + ret = cur_term->Nttyb.sg_ospeed; +#endif + if(ret < 0 || ret > MAX_BAUD) + return ERR; + SP->_baudrate = ERR; + for (i = 0; i < (sizeof(speeds) / sizeof(struct speed)); i++) + if (speeds[i].s == ret) + { + SP->_baudrate = speeds[i].sp; + break; + } + return(SP->_baudrate); +} + + +/* +** savetty() and resetty() +** +*/ + +static TTY buf; + +int savetty(void) +{ + T(("savetty() called")); + +#ifdef TERMIOS + tcgetattr(cur_term->Filedes, &buf); +#else + gtty(cur_term->Filedes, &buf); +#endif + return OK; +} + +int resetty(void) +{ + T(("resetty() called")); + +#ifdef TERMIOS + tcsetattr(cur_term->Filedes, TCSANOW, &buf); +#else + stty(cur_term->Filedes, &buf); +#endif + return OK; +} + |