2.11BSD/src/new/jove/term.c
/***************************************************************************
* This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne. JOVE *
* is provided to you without charge, and with no warranty. You may give *
* away copies of JOVE, including sources, provided that this notice is *
* included in all the files. *
***************************************************************************/
#include "jove.h"
#include <ctype.h>
#include <errno.h>
#ifndef MAC /* most of the file... */
#ifndef MSDOS
# ifdef SYSV
# include <termio.h>
# else
# include <sgtty.h>
# endif /* SYSV */
#endif /* MSDOS */
#ifdef IPROCS
# include <signal.h>
#endif
#define _TERM
#include "termcap.h"
/* Termcap definitions */
#ifndef IBMPC
char *CS,
*SO,
*SE,
*CM,
*CL,
*CE,
*HO,
*AL,
*DL,
*VS,
*VE,
*KS,
*KE,
*TI,
*TE,
*IC,
*DC,
*IM,
*EI,
*LL,
*M_IC, /* Insert char with arg */
*M_DC, /* Delete char with arg */
*M_AL, /* Insert line with arg */
*M_DL, /* Delete line with arg */
*SF, /* Scroll forward */
*SR,
*SP, /* Send Cursor Position */
*VB,
*BL,
*IP, /* insert pad after character inserted */
*lPC,
*NL;
#endif
int LI,
ILI, /* Internal lines, i.e., 23 of LI is 24. */
CO,
UL,
MI,
SG, /* number of magic cookies left by SO and SE */
XS, /* whether standout is braindamaged */
TABS,
UPlen,
HOlen,
LLlen;
extern char PC,
*BC,
*UP;
#ifdef notdef
/*
* Are you sure about this one Jon? On the SYSV system I tried this
* on I got a multiple definition of PC because it was already
* defined in -ltermcap. Similarly for BC and UP ...
*/
# ifdef SYSVR2 /* release 2, at least */
char PC;
# else
extern char PC;
# endif /* SYSVR2 */
#endif
#ifndef IBMPC
static char tspace[256];
/* The ordering of ts and meas must agree !! */
static char *ts="vsvealdlspcssosecmclcehoupbcicimdceillsfsrvbksketiteALDLICDCpcipblnl";
static char **meas[] = {
&VS, &VE, &AL, &DL, &SP, &CS, &SO, &SE,
&CM, &CL, &CE, &HO, &UP, &BC, &IC, &IM,
&DC, &EI, &LL, &SF, &SR, &VB, &KS, &KE,
&TI, &TE, &M_AL, &M_DL, &M_IC, &M_DC,
&lPC, &IP, &BL, &NL, 0
};
static void
gets(buf)
char *buf;
{
buf[read(0, buf, 12) - 1] = 0;
}
/* VARARGS1 */
static void
TermError(fmt, a)
char *fmt;
{
printf(fmt, a);
flusho();
_exit(1);
}
void
getTERM()
{
char *getenv(), *tgetstr() ;
char termbuf[13],
*termname = NULL,
*termp = tspace,
tbuff[2048]; /* Good grief! */
int i;
termname = getenv("TERM");
if ((termname == NULL) || (*termname == '\0') ||
(strcmp(termname, "dumb") == 0) ||
(strcmp(termname, "unknown") == 0) ||
(strcmp(termname, "network") == 0)) {
putstr("Enter terminal type (e.g, vt100): ");
flusho();
gets(termbuf);
if (termbuf[0] == 0)
TermError(NullStr);
termname = termbuf;
}
if (tgetent(tbuff, termname) < 1)
TermError("[\"%s\" unknown terminal type?]", termname);
if ((CO = tgetnum("co")) == -1)
wimperr: TermError("You can't run JOVE on a %s terminal.\n", termname);
else if (CO > MAXCOLS)
CO = MAXCOLS;
if ((LI = tgetnum("li")) == -1)
goto wimperr;
if ((SG = tgetnum("sg")) == -1)
SG = 0; /* Used for mode line only */
if ((XS = tgetflag("xs")) == -1)
XS = 0; /* Used for mode line only */
for (i = 0; meas[i]; i++) {
*(meas[i]) = (char *) tgetstr(ts, &termp);
ts += 2;
}
if (lPC)
PC = *lPC;
if (XS)
SO = SE = 0;
if (CS && !SR)
CS = SR = SF = 0;
if (CS && !SF)
SF = "\n";
if (IM && (*IM == 0))
IM = 0;
else
MI = tgetflag("mi");
UL = tgetflag("ul");
if (NL == 0)
NL = "\n";
else { /* strip stupid padding information */
while (isdigit(*NL))
NL += 1;
if (*NL == '*')
NL += 1;
}
if (BL == 0)
BL = "\007";
#ifdef ID_CHAR
disp_opt_init();
#endif
if (CanScroll = ((AL && DL) || CS))
IDline_setup(termname);
}
#else
void
InitCM()
{
}
int EGA;
void
getTERM()
{
char *getenv(), *tgetstr() ;
char *termname;
void init_43(), init_term();
unsigned char lpp(), chpl();
if (getenv("EGA") || (!stricmp(getenv("TERM"), "EGA"))) {
termname = "ega";
init_43();
EGA = 1;
}
else {
termname = "ibmpc";
init_term();
EGA = 0;
}
CO = chpl();
LI = lpp();
SG = 0; /* Used for mode line only */
XS = 0; /* Used for mode line only */
CanScroll = 1;
}
#endif /* IBMPC */
#else /* MAC */
int LI,
ILI, /* Internal lines, i.e., 23 of LI is 24. */
CO,
TABS,
SG;
void getTERM()
{
SG = 0;
CanScroll = 1;
}
#endif /* MAC */