xref: /csrg-svn/bin/stty/key.c (revision 50008)
1*50008Sbostic /*-
2*50008Sbostic  * Copyright (c) 1991 The Regents of the University of California.
3*50008Sbostic  * All rights reserved.
4*50008Sbostic  *
5*50008Sbostic  * %sccs.include.redist.c%
6*50008Sbostic  */
7*50008Sbostic 
8*50008Sbostic #ifndef lint
9*50008Sbostic static char sccsid[] = "@(#)key.c	5.1 (Berkeley) 06/05/91";
10*50008Sbostic #endif /* not lint */
11*50008Sbostic 
12*50008Sbostic #include <sys/types.h>
13*50008Sbostic #include <errno.h>
14*50008Sbostic #include <stdlib.h>
15*50008Sbostic #include <stdio.h>
16*50008Sbostic #include <string.h>
17*50008Sbostic #include "stty.h"
18*50008Sbostic #include "extern.h"
19*50008Sbostic 
20*50008Sbostic __BEGIN_DECLS
21*50008Sbostic int	c_key __P((const void *, const void *));
22*50008Sbostic void	f_all __P((struct info *));
23*50008Sbostic void	f_cbreak __P((struct info *));
24*50008Sbostic void	f_columns __P((struct info *));
25*50008Sbostic void	f_dec __P((struct info *));
26*50008Sbostic void	f_everything __P((struct info *));
27*50008Sbostic void	f_extproc __P((struct info *));
28*50008Sbostic void	f_ispeed __P((struct info *));
29*50008Sbostic void	f_nl __P((struct info *));
30*50008Sbostic void	f_ospeed __P((struct info *));
31*50008Sbostic void	f_raw __P((struct info *));
32*50008Sbostic void	f_rows __P((struct info *));
33*50008Sbostic void	f_sane __P((struct info *));
34*50008Sbostic void	f_size __P((struct info *));
35*50008Sbostic void	f_speed __P((struct info *));
36*50008Sbostic void	f_tty __P((struct info *));
37*50008Sbostic __END_DECLS
38*50008Sbostic 
39*50008Sbostic static struct key keys[] = {
40*50008Sbostic 	"all",		f_all,		0,
41*50008Sbostic 	"cbreak",	f_cbreak,	F_OFFOK,
42*50008Sbostic 	"cols",		f_columns,	F_NEEDARG,
43*50008Sbostic 	"columns",	f_columns,	F_NEEDARG,
44*50008Sbostic 	"cooked", 	f_sane,		0,
45*50008Sbostic 	"dec",		f_dec,		0,
46*50008Sbostic 	"everything",	f_everything,	0,
47*50008Sbostic 	"extproc",	f_extproc,	F_OFFOK,
48*50008Sbostic 	"ispeed",	f_ispeed,	0,
49*50008Sbostic 	"new",		f_tty,		0,
50*50008Sbostic 	"nl",		f_nl,		F_OFFOK,
51*50008Sbostic 	"old",		f_tty,		0,
52*50008Sbostic 	"ospeed",	f_ospeed,	F_NEEDARG,
53*50008Sbostic 	"raw",		f_raw,		F_OFFOK,
54*50008Sbostic 	"rows",		f_rows,		F_NEEDARG,
55*50008Sbostic 	"sane",		f_sane,		0,
56*50008Sbostic 	"size",		f_size,		0,
57*50008Sbostic 	"speed",	f_speed,	0,
58*50008Sbostic 	"tty",		f_tty,		0,
59*50008Sbostic };
60*50008Sbostic 
61*50008Sbostic struct key *
62*50008Sbostic ksearch(name)
63*50008Sbostic 	char *name;
64*50008Sbostic {
65*50008Sbostic 	struct key tmp;
66*50008Sbostic 	int c_key __P((const void *, const void *));
67*50008Sbostic 
68*50008Sbostic 	tmp.name = name;
69*50008Sbostic 	return((struct key *)bsearch(&tmp, keys,
70*50008Sbostic 	    sizeof(keys)/sizeof(struct key), sizeof(struct key), c_key));
71*50008Sbostic }
72*50008Sbostic 
73*50008Sbostic static
74*50008Sbostic c_key(a, b)
75*50008Sbostic         const void *a, *b;
76*50008Sbostic {
77*50008Sbostic         return(strcmp(((struct key *)a)->name, ((struct key *)b)->name));
78*50008Sbostic }
79*50008Sbostic 
80*50008Sbostic void
81*50008Sbostic f_all(ip)
82*50008Sbostic 	struct info *ip;
83*50008Sbostic {
84*50008Sbostic 	print(&ip->t, &ip->win, ip->ldisc, BSD);
85*50008Sbostic }
86*50008Sbostic 
87*50008Sbostic void
88*50008Sbostic f_cbreak(ip)
89*50008Sbostic 	struct info *ip;
90*50008Sbostic {
91*50008Sbostic 	if (ip->off)
92*50008Sbostic 		f_sane(ip);
93*50008Sbostic 	else {
94*50008Sbostic 		ip->t.c_iflag |= BRKINT|IXON|IMAXBEL;
95*50008Sbostic 		ip->t.c_oflag |= OPOST;
96*50008Sbostic 		ip->t.c_lflag |= ISIG|IEXTEN;
97*50008Sbostic 		ip->t.c_lflag &= ~ICANON;
98*50008Sbostic 		ip->set = 1;
99*50008Sbostic 	}
100*50008Sbostic }
101*50008Sbostic 
102*50008Sbostic void
103*50008Sbostic f_columns(ip)
104*50008Sbostic 	struct info *ip;
105*50008Sbostic {
106*50008Sbostic 	ip->win.ws_col = atoi(ip->arg);
107*50008Sbostic 	ip->wset = 1;
108*50008Sbostic }
109*50008Sbostic 
110*50008Sbostic void
111*50008Sbostic f_dec(ip)
112*50008Sbostic 	struct info *ip;
113*50008Sbostic {
114*50008Sbostic 	ip->t.c_cc[VERASE] = (u_char)0177;
115*50008Sbostic 	ip->t.c_cc[VKILL] = CTRL('u');
116*50008Sbostic 	ip->t.c_cc[VINTR] = CTRL('c');
117*50008Sbostic 	ip->t.c_lflag &= ~ECHOPRT;
118*50008Sbostic 	ip->t.c_lflag |= ECHOE|ECHOKE|ECHOCTL;
119*50008Sbostic 	ip->t.c_iflag &= ~IXANY;
120*50008Sbostic 	ip->set = 1;
121*50008Sbostic }
122*50008Sbostic 
123*50008Sbostic void
124*50008Sbostic f_everything(ip)
125*50008Sbostic 	struct info *ip;
126*50008Sbostic {
127*50008Sbostic 	print(&ip->t, &ip->win, ip->ldisc, BSD);
128*50008Sbostic }
129*50008Sbostic 
130*50008Sbostic void
131*50008Sbostic f_extproc(ip)
132*50008Sbostic 	struct info *ip;
133*50008Sbostic {
134*50008Sbostic 	int tmp;
135*50008Sbostic 
136*50008Sbostic 	if (ip->set) {
137*50008Sbostic 		tmp = 1;
138*50008Sbostic 		(void)ioctl(ip->fd, TIOCEXT, &tmp);
139*50008Sbostic 	} else {
140*50008Sbostic 		tmp = 0;
141*50008Sbostic 		(void)ioctl(ip->fd, TIOCEXT, &tmp);
142*50008Sbostic 	}
143*50008Sbostic }
144*50008Sbostic 
145*50008Sbostic void
146*50008Sbostic f_ispeed(ip)
147*50008Sbostic 	struct info *ip;
148*50008Sbostic {
149*50008Sbostic 	cfsetispeed(&ip->t, atoi(ip->arg));
150*50008Sbostic 	ip->set = 1;
151*50008Sbostic }
152*50008Sbostic 
153*50008Sbostic void
154*50008Sbostic f_nl(ip)
155*50008Sbostic 	struct info *ip;
156*50008Sbostic {
157*50008Sbostic 	if (ip->off) {
158*50008Sbostic 		ip->t.c_iflag |= ICRNL;
159*50008Sbostic 		ip->t.c_oflag |= ONLCR;
160*50008Sbostic 	} else {
161*50008Sbostic 		ip->t.c_iflag &= ~ICRNL;
162*50008Sbostic 		ip->t.c_oflag &= ~ONLCR;
163*50008Sbostic 	}
164*50008Sbostic 	ip->set = 1;
165*50008Sbostic }
166*50008Sbostic 
167*50008Sbostic void
168*50008Sbostic f_ospeed(ip)
169*50008Sbostic 	struct info *ip;
170*50008Sbostic {
171*50008Sbostic 	cfsetospeed(&ip->t, atoi(ip->arg));
172*50008Sbostic 	ip->set = 1;
173*50008Sbostic }
174*50008Sbostic 
175*50008Sbostic void
176*50008Sbostic f_raw(ip)
177*50008Sbostic 	struct info *ip;
178*50008Sbostic {
179*50008Sbostic 	if (ip->off)
180*50008Sbostic 		f_sane(ip);
181*50008Sbostic 	else {
182*50008Sbostic 		cfmakeraw(&ip->t);
183*50008Sbostic 		ip->t.c_cflag &= ~(CSIZE|PARENB);
184*50008Sbostic 		ip->t.c_cflag |= CS8;
185*50008Sbostic 		ip->set = 1;
186*50008Sbostic 	}
187*50008Sbostic }
188*50008Sbostic 
189*50008Sbostic void
190*50008Sbostic f_rows(ip)
191*50008Sbostic 	struct info *ip;
192*50008Sbostic {
193*50008Sbostic 	ip->win.ws_row = atoi(ip->arg);
194*50008Sbostic 	ip->wset = 1;
195*50008Sbostic }
196*50008Sbostic 
197*50008Sbostic void
198*50008Sbostic f_sane(ip)
199*50008Sbostic 	struct info *ip;
200*50008Sbostic {
201*50008Sbostic 	ip->t.c_cflag = TTYDEF_CFLAG | (ip->t.c_cflag & CLOCAL);
202*50008Sbostic 	ip->t.c_iflag = TTYDEF_IFLAG;
203*50008Sbostic 	ip->t.c_iflag |= ICRNL;
204*50008Sbostic 	/* preserve user-preference flags in lflag */
205*50008Sbostic #define	LKEEP	(ECHOKE|ECHOE|ECHOK|ECHOPRT|ECHOCTL|ALTWERASE|TOSTOP|NOFLSH)
206*50008Sbostic 	ip->t.c_lflag = TTYDEF_LFLAG | (ip->t.c_lflag & LKEEP);
207*50008Sbostic 	ip->t.c_oflag = TTYDEF_OFLAG;
208*50008Sbostic 	ip->set = 1;
209*50008Sbostic }
210*50008Sbostic 
211*50008Sbostic void
212*50008Sbostic f_size(ip)
213*50008Sbostic 	struct info *ip;
214*50008Sbostic {
215*50008Sbostic 	(void)printf("%d %d\n", ip->win.ws_row, ip->win.ws_col);
216*50008Sbostic }
217*50008Sbostic 
218*50008Sbostic void
219*50008Sbostic f_speed(ip)
220*50008Sbostic 	struct info *ip;
221*50008Sbostic {
222*50008Sbostic 	(void)printf("%d\n", cfgetospeed(&ip->t));
223*50008Sbostic }
224*50008Sbostic 
225*50008Sbostic void
226*50008Sbostic f_tty(ip)
227*50008Sbostic 	struct info *ip;
228*50008Sbostic {
229*50008Sbostic 	int tmp;
230*50008Sbostic 
231*50008Sbostic 	tmp = TTYDISC;
232*50008Sbostic 	if (ioctl(0, TIOCSETD, &tmp) < 0)
233*50008Sbostic 		err("TIOCSETD: %s", strerror(errno));
234*50008Sbostic }
235