MiniUnix/usr/source/s2/stty.c
#
/*
* set teletype modes
*/
/*
* tty flags
*/
#define HUPCL 01
#define XTABS 02
#define LCASE 04
#define ECHO 010
#define CRMOD 020
#define RAW 040
#define ODDP 0100
#define EVENP 0200
#define ANYP 0300
/*
* Delay algorithms
*/
#define CR0 0
#define CR1 010000
#define CR2 020000
#define CR3 030000
#define NL0 0
#define NL1 000400
#define NL2 001000
#define NL3 001400
#define TAB0 0
#define TAB1 002000
#define TAB2 004000
#define TAB3 006000
#define FF0 0
#define FF1 040000
#define BS0 0
#define BS1 0100000
#define ALL 0177400
struct
{
char *string;
int speed;
} speeds[]
{
"0", (0<<8)|0,
"50", (1<<8)|1,
"75", (2<<8)|2,
"110", (3<<8)|3,
"134", (4<<8)|4,
"134.5",(4<<8)|4,
"150", (5<<8)|5,
"200", (6<<8)|6,
"300", (7<<8)|7,
"600", (8<<8)|8,
"1200", (9<<8)|9,
"1800", (10<<8)|10,
"2400", (11<<8)|11,
"4800", (12<<8)|12,
"9600", (13<<8)|13,
"exta", (14<<8)|14,
"extb", (15<<8)|15,
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,
"hup",
HUPCL, 0,
"-hup",
0, HUPCL,
"cr0",
CR0, CR3,
"cr1",
CR1, CR3,
"cr2",
CR2, CR3,
"cr3",
CR3, CR3,
"tab0",
TAB0, TAB3,
"tab1",
TAB1, TAB3,
"tab2",
TAB2, TAB3,
"tab3",
TAB3, TAB3,
"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, ALL,
"tty33",
CR1, ALL,
"37",
FF1+CR2+TAB1+NL1, ALL,
"tty37",
FF1+CR2+TAB1+NL1, ALL,
"05",
NL2, ALL,
"vt05",
NL2, ALL,
"tn",
CR1, ALL,
"tn300",
CR1, ALL,
"ti",
CR2, ALL,
"ti700",
CR2, ALL,
"tek",
FF1, ALL,
0,
};
char *arg;
int mode[3];
struct { char lobyte, hibyte; };
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[1] = '#@';
if (eq("erase")) {
mode[1].lobyte = **++argv;
argc--;
}
if (eq("kill")) {
mode[1].hibyte = **++argv;
argc--;
}
for(i=0; speeds[i].string; i++)
if(eq(speeds[i].string))
mode[0] = speeds[i].speed;
for(i=0; modes[i].string; i++)
if(eq(modes[i].string)) {
mode[2] =& ~modes[i].reset;
mode[2] =| modes[i].set;
}
if(arg)
printf("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[0].lobyte != mode[0].hibyte) {
prspeed("input speed ", mode[0].lobyte);
prspeed("output speed ", mode[0].hibyte);
} else
prspeed("speed ", mode[0].lobyte);
printf("erase = '%c'; kill = '%c'\n", mode[1].lobyte, mode[1].hibyte);
m = mode[2];
if(m & 0200) printf("even ");
if(m & 0100) printf("odd ");
if(m & 040) printf("raw ");
if(m & 020) printf("-nl ");
if(m & 010) printf("echo ");
if(m & 04) printf("lcase ");
if(m & 02) printf("-tabs ");
if(m & 01) printf("hup ");
delay(m>>8, "nl");
delay(m>>10, "tab");
delay(m>>12, "cr");
delay((m>>14)&1, "ff");
delay((m>>15)&1, "bs");
printf("\n");
}
delay(m, s)
char *s;
{
if(m =& 3)
printf("%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)
{
printf("%s%d baud\n", c, speed[s]);
}
putchar(c)
{
write(2, &c, 1);
}