This is tcaphelp.c in view mode; [Download] [Up]
/* tcaphelp.c */
char id_tcaphelp[] = "$Id: tcaphelp.c,v 2.13 1996/09/10 14:59:03 steve Exp $";
#include "elvis.h"
#if defined(GUI_TERMCAP) || defined(GUI_OPEN)
# include <unistd.h>
# ifdef NEED_WINSIZE
# include <sys/types.h>
# include <sys/stream.h>
# include <sys/ptem.h>
# endif
#ifdef linux
# include <sys/ioctl.h>
#endif
#if defined(ultrix) || defined(__osf__)
extern int ioctl P_((int d, int request, void *argp));
#endif
/* This file includes one of three three versions of low-level tty control
* functions: one for POSIX, one for BSD, and one for SysV. If _POSIX_SOURCE
* is defined, then the POSIX versions are used; else if bsd is defined, then
* the BSD versions are used; else SYSV is used.
*
* The version-specific functions in the included file are:
* ttyinit() - remember the initial serial line configuration
* ttyraw() - switch to the mode that elvis runs it
* ttynormal() - switch back to the mode saved by ttyinit()
* ttyread(buf,len,timeout)- read characters, possibly with timeout
*
* The generic UNIXish functions in this file:
* ttywrite(buf,len) - write characters
* ttytermtype() - return the name of the terminal type
* ttysize() - determine the terminal size
*/
/* This variable is used by all versions to indicate which signals have
* been caught.
*/
static long caught;
/* include the version-specific functions */
#ifdef USE_SGTTY
# include "tcapbsd.h"
#else
# ifdef USE_TERMIO
# include "tcapsysv.h"
# else
# include "tcaposix.h" /* this is the preferred version */
# endif
#endif
/* write characters out to the screen */
void ttywrite(buf, len)
char *buf; /* buffer, holds characters to be written */
int len; /* number of characters in buf */
{
write(1, buf, (size_t)len);
}
/* determine the terminal type */
char *ttytermtype()
{
char *type;
type = getenv("TERM");
if (!type)
{
type = TTY_DEFAULT;
}
return type;
}
/* This function gets the window size. */
BOOLEAN ttysize(linesptr, colsptr)
int *linesptr; /* where to store the number of rows */
int *colsptr; /* where to store the number of columns */
{
#ifdef TIOCGWINSZ
struct winsize size;
/* try using the TIOCGWINSZ call, if defined */
if (ioctl(0, TIOCGWINSZ, &size) >= 0)
{
*linesptr = size.ws_row;
*colsptr = size.ws_col;
return True;
}
#endif
/* no special way to detect screen size */
return False;
}
/* Check for signs of boredom from user, so we can abort a time-consuming
* operation. Here we check to see if SIGINT has been caught recently.
*/
BOOLEAN ttypoll(reset)
BOOLEAN reset;
{
return (caught & (1L << SIGINT)) ? True : False;
}
#ifdef SIGSTOP
/* Send SIGSTOP if the shell supports it, and return */
RESULT ttystop()
{
/* the Bourne shell can't handle ^Z, but BASH can */
if (!CHARcmp(o_shell, toCHAR("/bin/sh")) &&
!getenv("BASH_VERSION") && !getenv("BASH"))
{
return RESULT_MORE;
}
else
{
/* save user buffers, if necessary */
eventsuspend();
/* switch the tty out of raw mode */
ttysuspend();
/* stop and wait for a SIGCONT */
kill(0, SIGSTOP);
/* switch back to raw mode */
ttyresume(True);
return RESULT_COMPLETE;
}
}
#endif
#endif /* GUI_TERMCAP */
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.