V7/usr/src/cmd/stty.c
/*
* set teletype modes
*/
#include <stdio.h>
#include <sgtty.h>
struct
{
char *string;
int speed;
} speeds[] = {
"0", B0,
"50", B50,
"75", B75,
"110", B110,
"134", B134,
"134.5",B134,
"150", B150,
"200", B200,
"300", B300,
"600", B600,
"1200", B1200,
"1800", B1800,
"2400", B2400,
"4800", B4800,
"9600", B9600,
"exta", EXTA,
"extb", EXTB,
0,
};
struct
{
char *string;
int set;
int reset;
} modes[] = {
"even",
EVENP, 0,
"-even",
0, EVENP,
"odd",
ODDP, 0,
"-odd",
0, ODDP,
"raw",
RAW, 0,
"-raw",
0, RAW,
"cooked",
0, RAW,
"-nl",
CRMOD, 0,
"nl",
0, CRMOD,
"echo",
ECHO, 0,
"-echo",
0, ECHO,
"LCASE",
LCASE, 0,
"lcase",
LCASE, 0,
"-LCASE",
0, LCASE,
"-lcase",
0, LCASE,
"-tabs",
XTABS, 0,
"tabs",
0, XTABS,
"cbreak",
CBREAK, 0,
"-cbreak",
0, CBREAK,
"cr0",
CR0, CR3,
"cr1",
CR1, CR3,
"cr2",
CR2, CR3,
"cr3",
CR3, CR3,
"tab0",
TAB0, XTABS,
"tab1",
TAB1, XTABS,
"tab2",
TAB2, XTABS,
"nl0",
NL0, NL3,
"nl1",
NL1, NL3,
"nl2",
NL2, NL3,
"nl3",
NL3, NL3,
"ff0",
FF0, FF1,
"ff1",
FF1, FF1,
"bs0",
BS0, BS1,
"bs1",
BS1, BS1,
"33",
CR1, ALLDELAY,
"tty33",
CR1, ALLDELAY,
"37",
FF1+CR2+TAB1+NL1, ALLDELAY,
"tty37",
FF1+CR2+TAB1+NL1, ALLDELAY,
"05",
NL2, ALLDELAY,
"vt05",
NL2, ALLDELAY,
"tn",
CR1, ALLDELAY,
"tn300",
CR1, ALLDELAY,
"ti",
CR2, ALLDELAY,
"ti700",
CR2, ALLDELAY,
"tek",
FF1, ALLDELAY,
0,
};
char *arg;
struct sgttyb mode;
main(argc, argv)
char *argv[];
{
int i;
gtty(1, &mode);
if(argc == 1) {
prmodes();
exit(0);
}
while(--argc > 0) {
arg = *++argv;
if (eq("ek")){
mode.sg_erase = '#';
mode.sg_kill = '@';
}
if (eq("erase")) {
if (**++argv == '^')
mode.sg_erase = (*argv)[1] & 037;
else
mode.sg_erase = **argv;
argc--;
}
if (eq("kill")) {
if (**++argv == '^')
mode.sg_kill = (*argv)[1] & 037;
else
mode.sg_kill = **argv;
argc--;
}
if (eq("gspeed")) {
mode.sg_ispeed = B300;
mode.sg_ospeed = B9600;
}
if (eq("hup")) {
ioctl(1, TIOCHPCL, NULL);
} else
for(i=0; speeds[i].string; i++)
if(eq(speeds[i].string))
mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed;
for(i=0; modes[i].string; i++)
if(eq(modes[i].string)) {
mode.sg_flags &= ~modes[i].reset;
mode.sg_flags |= modes[i].set;
}
if(arg)
fprintf(stderr,"unknown mode: %s\n", arg);
}
stty(1,&mode);
}
eq(string)
char *string;
{
int i;
if(!arg)
return(0);
i = 0;
loop:
if(arg[i] != string[i])
return(0);
if(arg[i++] != '\0')
goto loop;
arg = 0;
return(1);
}
prmodes()
{
register m;
if(mode.sg_ispeed != mode.sg_ospeed) {
prspeed("input speed ", mode.sg_ispeed);
prspeed("output speed ", mode.sg_ospeed);
} else
prspeed("speed ", mode.sg_ispeed);
if (mode.sg_erase < ' ')
fprintf(stderr, "erase = '^%c'; ", '@' + mode.sg_erase);
else
fprintf(stderr, "erase = '%c'; ", mode.sg_erase);
if (mode.sg_kill < ' ')
fprintf(stderr, "kill = '^%c'\n", '@' + mode.sg_kill);
else
fprintf(stderr, "kill = '%c'\n", mode.sg_kill);
m = mode.sg_flags;
if(m & EVENP) fprintf(stderr,"even ");
if(m & ODDP) fprintf(stderr,"odd ");
if(m & RAW) fprintf(stderr,"raw ");
if(m & CRMOD) fprintf(stderr,"-nl ");
if(m & ECHO) fprintf(stderr,"echo ");
if(m & LCASE) fprintf(stderr,"lcase ");
if((m & XTABS)==XTABS) fprintf(stderr,"-tabs ");
if (m & CBREAK) fprintf(stderr,"cbreak ");
delay((m&NLDELAY)/NL1, "nl");
if ((m&TBDELAY)!=XTABS)
delay((m&TBDELAY)/TAB1, "tab");
delay((m&CRDELAY)/CR1, "cr");
delay((m&VTDELAY)/FF1, "ff");
delay((m&BSDELAY)/BS1, "bs");
fprintf(stderr,"\n");
}
delay(m, s)
char *s;
{
if(m)
fprintf(stderr,"%s%d ", s, m);
}
int speed[] = {
0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0
};
prspeed(c, s)
char *c;
{
fprintf(stderr,"%s%d baud\n", c, speed[s]);
}