#define index strchr
#define rindex strrchr
#define curerase modes.c_cc[VERASE]
#define curkill modes.c_cc[VKILL]
#define curintr modes.c_cc[VINTR]
#define olderase oldmodes.c_cc[VERASE]
#define oldkill oldmodes.c_cc[VKILL]
#define oldintr oldmodes.c_cc[VINTR]
#include <stdio.h>
#include <stdlib.h>
#include <termio.h>
#include <signal.h>
#define YES 1
#define NO 0
#undef CNTL
#define CNTL(c) ((c)&037)
#define BACKSPACE (CNTL('H'))
#define isdigit(c) (c >= '0' && c <= '9')
#define isalnum(c) (c > ' ' && (index("<@=>!:|\177", c) == NULL))
#define OLDERASE '#'
#ifndef CERASE
#define CERASE '\177'
#endif
#ifndef CKILL
#define CKILL CNTL('U')
#endif
#ifndef CINTR
#define CINTR CNTL('C')
#endif
#ifndef CDSUSP
#define CQUIT 034
#define CSTART CNTL('Q')
#define CSTOP CNTL('S')
#define CEOF CNTL('D')
#define CEOT CEOF
#define CBRK 0377
#define CSUSP CNTL('Z')
#define CDSUSP CNTL('Y')
#define CRPRNT CNTL('R')
#define CFLUSH CNTL('O')
#define CWERASE CNTL('W')
#define CLNEXT CNTL('V')
#endif
#define FILEDES 2
#define STDOUT 1
#define UIDMASK -1
#define USAGE "usage: tset [-] [-rsIQS] [-eC] [-kC] " \
"[-iC] [-m [ident][test speed]:type] [type]\n"
#define OLDFLAGS
#define DIALUP "dialup"
#define OLDDIALUP "sd"
#define PLUGBOARD "plugboard"
#define OLDPLUGBOARD "sp"
#define DEFTYPE "unknown"
#define ANY 0
#define GT 1
#define EQ 2
#define LT 4
#define GE (GT|EQ)
#define LE (LT|EQ)
#define NE (GT|LT)
#define ALL (GT|EQ|LT)
#define NMAP 10
struct map {
char *Ident;
char Test;
char Speed;
char *Type;
} map[NMAP];
struct map *Map = map;
struct {
char *string;
int speed;
int baudrate;
} speeds[] = {
"0", B0, 0,
"50", B50, 50,
"75", B75, 75,
"110", B110, 110,
"134", B134, 134,
"134.5", B134, 134,
"150", B150, 150,
"200", B200, 200,
"300", B300, 300,
"600", B600, 600,
"1200", B1200, 1200,
"1800", B1800, 1800,
"2400", B2400, 2400,
"4800", B4800, 4800,
"9600", B9600, 9600,
"19200", EXTA, 19200,
"exta", EXTA, 19200,
"extb", EXTB, 38400,
"57600", B57600, 57600,
"76800", B76800, 76800,
"115200", B115200, 115200,
"153600", B153600, 153600,
"230400", B230400, 230400,
"307200", B307200, 307200,
"460800", B460800, 460800,
"921600", B921600, 921600,
"1000000", B1000000, 1000000,
"1152000", B1152000, 1152000,
"1500000", B1500000, 1500000,
"2000000", B2000000, 2000000,
"2500000", B2500000, 2500000,
"3000000", B3000000, 3000000,
"3500000", B3500000, 3500000,
"4000000", B4000000, 4000000,
0,
};
signed char Erase_char;
char Kill_char;
char Intr_char;
char Specialerase;
char *TtyType;
char *DefType;
char *NewType;
int Mapped;
int Dash_u;
int Dash_h;
int DoSetenv;
int BeQuiet;
int NoInit;
int IsReset;
int Report;
int Ureport;
int RepOnly;
int CmndLine;
int Ask;
int DoVirtTerm = YES;
int PadBaud;
#define CAPBUFSIZ 1024
char Capbuf[CAPBUFSIZ];
char *Ttycap;
char Aliasbuf[128];
char *Alias[16];
extern char *strcpy();
extern char *index();
struct delay
{
int d_delay;
int d_bits;
};
#include "tset.delays.h"
struct termio mode;
struct termio oldmode;
struct termios modes;
struct termios oldmodes;
int istermios;
void reportek(char *, char, char, char);
void setdelay(char *, struct delay [], tcflag_t, tcflag_t *);
void prs(char *);
void prc(char);
void flush(void);
void cat(char *);
void bmove(char *, char *, int);
void makealias(char *);
void wrtermcap(char *);
void fatal(char *, char *);
char reset();
int
main(int argc, char *argv[])
{
char buf[CAPBUFSIZ];
char termbuf[32];
auto char *bufp;
char *p;
char *command;
int i;
int Break;
int Not;
char *nextarg();
char *mapped();
extern char *rindex();
struct winsize win;
extern char *getenv();
extern char *tgetstr();
char bs_char;
int csh;
int settle = NO;
void setmode();
extern char PC;
extern short ospeed;
if ((istermios = ioctl(FILEDES, TCGETS, (char *)&modes)) < 0) {
if (ioctl(FILEDES, TCGETA, (char *)&mode) < 0) {
prs("Not a terminal\n");
exit(1);
}
bmove((char *)&mode, (char *)&oldmode, sizeof (mode));
modes.c_lflag = oldmodes.c_lflag = mode.c_lflag;
modes.c_oflag = oldmodes.c_oflag = mode.c_oflag;
modes.c_iflag = oldmodes.c_iflag = mode.c_iflag;
modes.c_cflag = oldmodes.c_cflag = mode.c_cflag;
for (i = 0; i < NCC; i++)
modes.c_cc[i] = oldmodes.c_cc[i] = mode.c_cc[i];
} else
bmove((char *)&modes, (char *)&oldmodes, sizeof (modes));
ospeed = cfgetospeed(&modes);
(void) signal(SIGINT, setmode);
(void) signal(SIGQUIT, setmode);
(void) signal(SIGTERM, setmode);
if (command = rindex(argv[0], '/'))
command++;
else
command = argv[0];
if (sequal(command, "reset")) {
if ((istermios = ioctl(FILEDES, TCGETS, (char *)&modes)) < 0) {
(void) ioctl(FILEDES, TCGETA, (char *)&mode);
modes.c_lflag = mode.c_lflag;
modes.c_oflag = mode.c_oflag;
modes.c_iflag = mode.c_iflag;
modes.c_cflag = mode.c_cflag;
for (i = 0; i < NCC; i++)
modes.c_cc[i] = mode.c_cc[i];
}
curerase = reset(curerase, CERASE);
curkill = reset(curkill, CKILL);
curintr = reset(curintr, CINTR);
modes.c_cc[VQUIT] = reset(modes.c_cc[VQUIT], CQUIT);
modes.c_cc[VEOF] = reset(modes.c_cc[VEOF], CEOF);
modes.c_iflag |= (BRKINT|ISTRIP|ICRNL|IXON);
modes.c_iflag &= ~(IGNBRK|PARMRK|INPCK|INLCR|IGNCR|IUCLC|IXOFF);
modes.c_oflag |= (OPOST|ONLCR);
modes.c_oflag &= ~(OLCUC|OCRNL|ONOCR|ONLRET|OFILL|OFDEL|
NLDLY|CRDLY|TABDLY|BSDLY|VTDLY|FFDLY);
modes.c_cflag |= (CS7|CREAD);
modes.c_cflag &= ~(PARODD|CLOCAL);
modes.c_lflag |= (ISIG|ICANON|ECHO|ECHOK);
modes.c_lflag &= ~(XCASE|ECHONL|NOFLSH);
if (istermios < 0) {
mode.c_lflag = modes.c_lflag;
mode.c_oflag = modes.c_oflag;
mode.c_iflag = modes.c_iflag;
mode.c_cflag = modes.c_cflag;
for (i = 0; i < NCC; i++)
mode.c_cc[i] = modes.c_cc[i];
(void) ioctl(FILEDES, TCSETAW, (char *)&mode);
} else
(void) ioctl(FILEDES, TCSETSW, (char *)&modes);
Dash_u = YES;
BeQuiet = YES;
IsReset = YES;
} else if (argc == 2 && sequal(argv[1], "-")) {
RepOnly = YES;
Dash_u = YES;
}
argc--;
while (--argc >= 0) {
p = *++argv;
if (*p == '-') {
if (*++p == '\0')
Report = YES;
else
while (*p)
switch (*p++) {
case 'r':
Ureport = YES;
continue;
case 'E':
Specialerase = YES;
case 'e':
if (*p == '\0')
Erase_char = -1;
else {
if (*p == '^' && p[1] != '\0')
if (*++p == '?')
Erase_char = '\177';
else
Erase_char = CNTL(*p);
else
Erase_char = *p;
p++;
}
continue;
case 'i':
if (*p == '\0')
Intr_char = CNTL('C');
else {
if (*p == '^' && p[1] != '\0')
if (*++p == '?')
Intr_char = '\177';
else
Intr_char = CNTL(*p);
else
Intr_char = *p;
p++;
}
continue;
case 'k':
if (*p == '\0')
Kill_char = CNTL('U');
else {
if (*p == '^' && p[1] != '\0')
if (*++p == '?')
Kill_char = '\177';
else
Kill_char = CNTL(*p);
else
Kill_char = *p;
p++;
}
continue;
#ifdef OLDFLAGS
#ifdef OLDDIALUP
case 'd':
NewType = DIALUP;
goto mapold;
#endif
#ifdef OLDPLUGBOARD
case 'p':
NewType = PLUGBOARD;
goto mapold;
#endif
#ifdef OLDARPANET
case 'a':
Newtype = ARPANET;
goto mapold;
#endif
mapold: Map->Ident = NewType;
Map->Test = ALL;
if (*p == '\0') {
p = nextarg(argc--, argv++);
}
Map->Type = p;
Map++;
Mapped = YES;
p = "";
continue;
#endif
case 'm':
if (*p == '\0') {
p = nextarg(argc--, argv++);
}
if (isalnum(*p)) {
Map->Ident = p;
while (isalnum(*p)) p++;
}
else
Map->Ident = "";
Break = NO;
Not = NO;
while (!Break)
switch (*p) {
case '\0':
p = nextarg(argc--, argv++);
continue;
case ':':
*p++ = '\0';
Break = YES;
continue;
case '>':
Map->Test |= GT;
*p++ = '\0';
continue;
case '<':
Map->Test |= LT;
*p++ = '\0';
continue;
case '=':
case '@':
Map->Test |= EQ;
*p++ = '\0';
continue;
case '!':
Not = ~Not;
*p++ = '\0';
continue;
case 'B':
p++;
default:
if (isdigit(*p) || *p == 'e') {
Map->Speed =
baudrate(p);
while (isalnum(*p) ||
*p == '.')
p++;
} else
Break = YES;
continue;
}
if (Not) {
Map->Test = (~(Map->Test))&ALL;
}
if (*p == '\0') {
p = nextarg(argc--, argv++);
}
Map->Type = p;
p = "";
Map++;
Mapped = YES;
continue;
case 'h':
Dash_h = YES;
continue;
case 'u':
Dash_u = YES;
continue;
case 's':
DoSetenv = YES;
CmndLine = YES;
continue;
case 'S':
DoSetenv = YES;
CmndLine = NO;
continue;
case 'Q':
BeQuiet = YES;
continue;
case 'I':
NoInit = YES;
continue;
case 'A':
Ask = YES;
continue;
case 'v':
DoVirtTerm = NO;
continue;
default:
*p-- = '\0';
fatal("Bad flag -", p);
}
} else {
DefType = p;
}
}
if (DefType) {
if (Mapped) {
Map->Ident = "";
Map->Test = ALL;
Map->Type = DefType;
} else
TtyType = DefType;
}
bufp = getenv("TERMCAP");
if (bufp && *bufp != '/')
(void) strcpy(bufp-8, "NOTHING");
if (!Dash_h && TtyType == NULL)
TtyType = getenv("TERM");
if (TtyType == NULL) {
TtyType = DEFTYPE;
}
if (Mapped) {
if (!(Alias[0] && isalias(TtyType)))
if (tgetent(Capbuf, TtyType) > 0)
makealias(Capbuf);
TtyType = mapped(TtyType);
}
if (TtyType[0] == '?') {
Ask = YES;
TtyType++;
if (TtyType[0] == '\0')
TtyType = DEFTYPE;
}
if (Ask) {
ask:
prs("TERM = (");
prs(TtyType);
prs(") ");
flush();
i = read(2, termbuf, sizeof (termbuf) - 1);
if (i > 0) {
if (termbuf[i - 1] == '\n')
i--;
termbuf[i] = '\0';
if (termbuf[0] != '\0')
TtyType = termbuf;
}
}
if (!(Alias[0] && isalias(TtyType))) {
switch (tgetent(Capbuf, TtyType)) {
case -1:
prs("Cannot find termcap\n");
flush();
exit(-1);
case 0:
prs("Type ");
prs(TtyType);
prs(" unknown\n");
flush();
if (DoSetenv) {
TtyType = DEFTYPE;
Alias[0] = '\0';
goto ask;
} else
exit(1);
}
}
Ttycap = Capbuf;
if (!RepOnly) {
if (Specialerase && !tgetflag("bs"))
Erase_char = 0;
bufp = buf;
p = tgetstr("kb", &bufp);
if (p == NULL || p[1] != '\0')
p = tgetstr("bc", &bufp);
if (p != NULL && p[1] == '\0')
bs_char = p[0];
else if (tgetflag("bs"))
bs_char = BACKSPACE;
else
bs_char = 0;
if (Erase_char == 0 && !tgetflag("os") &&
curerase == OLDERASE) {
if (tgetflag("bs") || bs_char != 0)
Erase_char = -1;
}
if (Erase_char < 0)
Erase_char = (bs_char != 0) ? bs_char : BACKSPACE;
if (curerase == 0)
curerase = CERASE;
if (Erase_char != 0)
curerase = Erase_char;
if (curintr == 0)
curintr = CINTR;
if (Intr_char != 0)
curintr = Intr_char;
if (curkill == 0)
curkill = CKILL;
if (Kill_char != 0)
curkill = Kill_char;
PadBaud = tgetnum("pb");
for (i = 0; speeds[i].string; i++)
if (speeds[i].baudrate == PadBaud) {
PadBaud = speeds[i].speed;
break;
}
setdelay("dC", CRdelay, CRbits, &modes.c_oflag);
setdelay("dN", NLdelay, NLbits, &modes.c_oflag);
setdelay("dB", BSdelay, BSbits, &modes.c_oflag);
setdelay("dF", FFdelay, FFbits, &modes.c_oflag);
setdelay("dT", TBdelay, TBbits, &modes.c_oflag);
setdelay("dV", VTdelay, VTbits, &modes.c_oflag);
if (tgetflag("UC") || (command[0] & 0140) == 0100) {
modes.c_iflag |= IUCLC;
modes.c_oflag |= OLCUC;
modes.c_cflag |= XCASE;
} else if (tgetflag("LC")) {
modes.c_iflag &= ~IUCLC;
modes.c_oflag &= ~OLCUC;
modes.c_cflag &= ~XCASE;
}
modes.c_iflag &= ~(PARMRK|INPCK);
modes.c_lflag |= ICANON;
if (tgetflag("EP")) {
modes.c_iflag |= INPCK;
modes.c_cflag |= PARENB;
modes.c_cflag &= ~PARODD;
}
if (tgetflag("OP")) {
modes.c_iflag |= INPCK;
modes.c_cflag |= PARENB;
modes.c_cflag |= PARODD;
}
modes.c_oflag |= ONLCR;
modes.c_iflag |= ICRNL;
modes.c_lflag |= ECHO;
modes.c_oflag |= TAB3;
if (tgetflag("NL")) {
modes.c_oflag &= ~ONLCR;
modes.c_iflag &= ~ICRNL;
}
if (tgetflag("HD"))
modes.c_lflag &= ~ECHO;
if (tgetflag("pt"))
modes.c_oflag &= ~TAB3;
modes.c_lflag |= (ECHOE|ECHOK);
if (tgetflag("hc")) {
modes.c_lflag &= ~ECHOE;
}
bufp = buf;
if (tgetstr("pc", &bufp) != 0)
PC = buf[0];
if (!NoInit) {
if (oldmodes.c_oflag&(TAB3|ONLCR|OCRNL|ONLRET)) {
oldmodes.c_oflag &= (TAB3|ONLCR|OCRNL|ONLRET);
setmode(-1);
}
if (settabs()) {
settle = YES;
flush();
}
bufp = buf;
if (IsReset && tgetstr("rs", &bufp) != 0 ||
tgetstr("is", &bufp) != 0) {
tputs(buf, 0, prc);
settle = YES;
flush();
}
bufp = buf;
if (IsReset && tgetstr("rf", &bufp) != 0 ||
tgetstr("if", &bufp) != 0) {
cat(buf);
settle = YES;
}
if (settle) {
prc('\r');
if (IsReset)
prc('\n');
flush();
sleep(1);
}
}
setmode(0);
csh = NO;
if (DoSetenv) {
char *sh;
if ((sh = getenv("SHELL")) && (i = strlen(sh)) >= 3) {
if ((csh = sequal(&sh[i-3], "csh")) && CmndLine)
(void) write(STDOUT,
"set noglob;\n", 12);
}
if (!csh) {
(void) write(STDOUT,
"export TERMCAP TERM;\n", 21);
}
}
}
if (DoSetenv || Report || Ureport) {
makealias(Ttycap);
if (sequal(TtyType, Alias[0]) && Alias[1]) {
TtyType = Alias[1];
}
if (DoSetenv) {
if (csh) {
if (CmndLine)
(void) write(STDOUT,
"setenv TERM ", 12);
(void) write(STDOUT, TtyType, strlen(TtyType));
(void) write(STDOUT, " ", 1);
if (CmndLine)
(void) write(STDOUT, ";\n", 2);
} else {
(void) write(STDOUT, "TERM=", 5);
(void) write(STDOUT, TtyType, strlen(TtyType));
(void) write(STDOUT, ";\n", 2);
}
} else if (Report) {
(void) write(STDOUT, TtyType, strlen(TtyType));
(void) write(STDOUT, "\n", 1);
}
if (Ureport) {
prs("Terminal type is ");
prs(TtyType);
prs("\n");
flush();
}
if (DoSetenv) {
if (csh) {
if (CmndLine)
(void) write(STDOUT,
"setenv TERMCAP '", 16);
} else
(void) write(STDOUT, "TERMCAP='", 9);
wrtermcap(Ttycap);
if (csh) {
if (CmndLine) {
(void) write(STDOUT, "';\n", 3);
(void) write(STDOUT,
"unset noglob;\n", 14);
}
} else
(void) write(STDOUT, "';\n", 3);
}
}
if (RepOnly)
exit(0);
reportek("Erase", curerase, olderase, CERASE);
reportek("Kill", curkill, oldkill, CKILL);
reportek("Interrupt", curintr, oldintr, CINTR);
return (0);
}
int
settabs(void)
{
char caps[100];
char *capsp = caps;
char *clear_tabs, *set_tab, *set_column, *set_pos;
char *tg_out, *tgoto();
int c;
extern char *tgetstr();
int lines, columns;
clear_tabs = tgetstr("ct", &capsp);
set_tab = tgetstr("st", &capsp);
set_column = tgetstr("ch", &capsp);
if (set_column == 0)
set_pos = tgetstr("cm", &capsp);
if (clear_tabs && set_tab) {
prc('\r');
tputs(clear_tabs, 0, prc);
}
if (set_tab) {
columns = tgetnum("co");
lines = tgetnum("li");
for (c = 0; c < columns; c += 8) {
tg_out = "OOPS";
if (set_column)
tg_out = tgoto(set_column, 0, c);
if (*tg_out == 'O' && set_pos)
tg_out = tgoto(set_pos, c, lines-1);
if (*tg_out != 'O')
tputs(tg_out, 1, prc);
else if (c != 0) {
prc(' '); prc(' '); prc(' '); prc(' ');
prc(' '); prc(' '); prc(' '); prc(' ');
}
tputs(set_tab, 0, prc);
}
prc('\r');
return (1);
}
return (0);
}
void
setmode(int flag)
{
struct termio *ttymode;
struct termios *ttymodes;
int i;
ttymode = (struct termio *)0;
ttymodes = (struct termios *)0;
if (flag < 0) {
if (istermios < 0) {
oldmode.c_lflag = oldmodes.c_lflag;
oldmode.c_oflag = oldmodes.c_oflag;
oldmode.c_iflag = oldmodes.c_iflag;
oldmode.c_cflag = oldmodes.c_cflag;
for (i = 0; i < NCC; i++)
oldmode.c_cc[i] = oldmodes.c_cc[i];
ttymode = &oldmode;
} else
ttymodes = &oldmodes;
} else {
if (istermios < 0) {
oldmode.c_lflag = oldmodes.c_lflag;
oldmode.c_oflag = oldmodes.c_oflag;
oldmode.c_iflag = oldmodes.c_iflag;
oldmode.c_cflag = oldmodes.c_cflag;
for (i = 0; i < NCC; i++)
oldmode.c_cc[i] = oldmodes.c_cc[i];
mode.c_lflag = modes.c_lflag;
mode.c_oflag = modes.c_oflag;
mode.c_iflag = modes.c_iflag;
mode.c_cflag = modes.c_cflag;
for (i = 0; i < NCC; i++)
mode.c_cc[i] = modes.c_cc[i];
if (!bequal((char *)&mode, (char *)&oldmode,
sizeof (mode)))
ttymode = &mode;
} else if (!bequal((char *)&modes, (char *)&oldmodes,
sizeof (modes)))
ttymodes = &modes;
}
if (ttymode) {
(void) ioctl(FILEDES, TCSETAW, (char *)ttymode);
} else if (ttymodes) {
(void) ioctl(FILEDES, TCSETSW, (char *)ttymodes);
}
if (flag > 0)
exit(1);
}
void
reportek(char *name, char new, char old, char def)
{
char o;
char n;
char *p;
char buf[32];
char *bufp;
extern char *tgetstr();
if (BeQuiet)
return;
o = old;
n = new;
if (o == n && n == def)
return;
prs(name);
if (o == n)
prs(" is ");
else
prs(" set to ");
bufp = buf;
if (tgetstr("kb", &bufp) > (char *)0 && n == buf[0] && buf[1] == '\0')
prs("Backspace\n");
else if (n == 0177)
prs("Delete\n");
else {
if (n < 040) {
prs("Ctrl-");
n ^= 0100;
}
p = "x\n";
p[0] = n;
prs(p);
}
flush();
}
void
setdelay(char *cap, struct delay dtab[], tcflag_t bits, tcflag_t *flags)
{
int i;
struct delay *p;
extern short ospeed;
i = tgetnum(cap);
if (i < 0)
i = 0;
if (PadBaud > ospeed)
i = 0;
*flags &= ~bits;
for (p = dtab; p->d_delay >= 0; p++) {
if (p->d_delay >= i) {
p++;
break;
}
}
*flags |= (tcflag_t)((--p)->d_bits);
}
void
prs(char *s)
{
while (*s != '\0')
prc(*s++);
}
char OutBuf[256];
int OutPtr;
void
prc(char c)
{
OutBuf[OutPtr++] = c;
if (OutPtr >= sizeof (OutBuf))
flush();
}
void
flush(void)
{
if (OutPtr > 0)
(void) write(2, OutBuf, OutPtr);
OutPtr = 0;
}
void
cat(char *file)
{
int fd;
int i;
char buf[BUFSIZ];
fd = open(file, 0);
if (fd < 0) {
prs("Cannot open ");
prs(file);
prs("\n");
flush();
return;
}
while ((i = read(fd, buf, BUFSIZ)) > 0)
(void) write(FILEDES, buf, i);
(void) close(fd);
}
void
bmove(char *from, char *to, int length)
{
char *p, *q;
int i;
i = length;
p = from;
q = to;
while (i-- > 0)
*q++ = *p++;
}
int
bequal(char *a, char *b, int len)
{
char *p, *q;
int i;
i = len;
p = a;
q = b;
while ((*p == *q) && --i > 0) {
p++; q++;
}
return ((*p == *q) && i >= 0);
}
int
sequal(char *a, char *b)
{
char *p = a, *q = b;
while (*p && *q && (*p == *q)) {
p++; q++;
}
return (*p == *q);
}
void
makealias(char *buf)
{
int i;
char *a;
char *b;
Alias[0] = a = Aliasbuf;
b = buf;
i = 1;
while (*b && *b != ':') {
if (*b == '|') {
*a++ = '\0';
Alias[i++] = a;
b++;
} else
*a++ = *b++;
}
*a = '\0';
Alias[i] = NULL;
#ifdef DEB
for (i = 0; Alias[i]; printf("A:%s\n", Alias[i++]))
;
#endif
}
int
isalias(char *ident)
{
char **a = Alias;
if (*a)
while (*a)
if (sequal(ident, *a))
return (YES);
else
a++;
return (NO);
}
#define WHITE(c) (c == ' ' || c == '\t')
char delcap[128][2];
int ncap = 0;
void
wrtermcap(char *bp)
{
char buf[CAPBUFSIZ];
char *p = buf;
char *tp;
char *putbuf();
int space, empty;
while (*bp && *bp != ':') {
if (*bp == '|') {
tp = bp+1;
space = NO;
while (*tp && *tp != '|' && *tp != ':') {
space = (space || WHITE(*tp));
tp++;
}
if (space) {
bp = tp;
continue;
}
}
*p++ = *bp++;
}
while (*bp) {
switch (*bp) {
case ':':
tp = bp + 1;
empty = YES;
while (*tp && *tp != ':') {
empty = (empty && WHITE(*tp));
tp++;
}
if (empty || cancelled(bp+1)) {
bp = tp;
continue;
}
break;
case ' ':
p = putbuf(p, "\\040");
bp++;
continue;
case '!':
p = putbuf(p, "\\041");
bp++;
continue;
case ',':
p = putbuf(p, "\\054");
bp++;
continue;
case '"':
p = putbuf(p, "\\042");
bp++;
continue;
case '\'':
p = putbuf(p, "\\047");
bp++;
continue;
case '`':
p = putbuf(p, "\\140");
bp++;
continue;
case '\\':
case '^':
*p++ = *bp++;
}
*p++ = *bp++;
}
*p++ = ':';
(void) write(STDOUT, buf, p-buf);
}
int
cancelled(char *cap)
{
int i;
for (i = 0; i < ncap; i++) {
if (cap[0] == delcap[i][0] && cap[1] == delcap[i][1])
return (YES);
}
delcap[ncap][0] = cap[0];
delcap[ncap][1] = cap[1];
ncap++;
return (cap[2] == '@');
}
char *
putbuf(ptr, str)
char *ptr;
char *str;
{
char buf[20];
while (*str) {
switch (*str) {
case '\033':
ptr = putbuf(ptr, "\\E");
str++;
break;
default:
if (*str <= ' ') {
(void) sprintf(buf, "\\%03o", *str);
ptr = putbuf(ptr, buf);
str++;
} else
*ptr++ = *str++;
}
}
return (ptr);
}
int
baudrate(char *p)
{
char buf[8];
int i = 0;
while (i < 7 && (isalnum(*p) || *p == '.'))
buf[i++] = *p++;
buf[i] = '\0';
for (i = 0; speeds[i].string; i++)
if (sequal(speeds[i].string, buf))
return (speeds[i].speed);
return (-1);
}
char *
mapped(type)
char *type;
{
extern short ospeed;
int match;
#ifdef DEB
printf("spd:%d\n", ospeed);
prmap();
#endif
Map = map;
while (Map->Ident) {
if (*(Map->Ident) == '\0' ||
sequal(Map->Ident, type) || isalias(Map->Ident)) {
match = NO;
switch (Map->Test) {
case ANY:
case ALL:
match = YES;
break;
case GT:
match = (ospeed > Map->Speed);
break;
case GE:
match = (ospeed >= Map->Speed);
break;
case EQ:
match = (ospeed == Map->Speed);
break;
case LE:
match = (ospeed <= Map->Speed);
break;
case LT:
match = (ospeed < Map->Speed);
break;
case NE:
match = (ospeed != Map->Speed);
break;
}
if (match)
return (Map->Type);
}
Map++;
}
return (type);
}
#ifdef DEB
prmap()
{
Map = map;
while (Map->Ident) {
printf("%s t:%d s:%d %s\n",
Map->Ident, Map->Test, Map->Speed, Map->Type);
Map++;
}
}
#endif
char *
nextarg(argc, argv)
int argc;
char *argv[];
{
if (argc <= 0)
fatal("Too few args: ", *argv);
if (*(*++argv) == '-')
fatal("Unexpected arg: ", *argv);
return (*argv);
}
void
fatal(char *mesg, char *obj)
{
prs(mesg);
prs(obj);
prc('\n');
prs(USAGE);
flush();
exit(1);
}
char
reset(ch, def)
char ch;
int def;
{
if (ch == 0 || (ch&0377) == 0377)
return (def);
return (ch);
}