BSD 3 development
[unix-history] / usr / src / cmd / stty.c
CommitLineData
264df08f
BJ
1/*
2 * set teletype modes
3 */
4
5#include <stdio.h>
6#include <sgtty.h>
7
8struct
9{
10 char *string;
11 int speed;
12} speeds[] = {
13 "0", B0,
14 "50", B50,
15 "75", B75,
16 "110", B110,
17 "134", B134,
18 "134.5",B134,
19 "150", B150,
20 "200", B200,
21 "300", B300,
22 "600", B600,
23 "1200", B1200,
24 "1800", B1800,
25 "2400", B2400,
26 "4800", B4800,
27 "9600", B9600,
28 "exta", EXTA,
29 "extb", EXTB,
30 0,
31};
32struct
33{
34 char *string;
35 int set;
36 int reset;
37} modes[] = {
38 "even",
39 EVENP, 0,
40
41 "-even",
42 0, EVENP,
43
44 "odd",
45 ODDP, 0,
46
47 "-odd",
48 0, ODDP,
49
50 "raw",
51 RAW, 0,
52
53 "-raw",
54 0, RAW,
55
56 "cooked",
57 0, RAW,
58
59 "-nl",
60 CRMOD, 0,
61
62 "nl",
63 0, CRMOD,
64
65 "echo",
66 ECHO, 0,
67
68 "-echo",
69 0, ECHO,
70
71 "LCASE",
72 LCASE, 0,
73
74 "lcase",
75 LCASE, 0,
76
77 "-LCASE",
78 0, LCASE,
79
80 "-lcase",
81 0, LCASE,
82
83 "-tabs",
84 XTABS, 0,
85
86 "tabs",
87 0, XTABS,
88
89
90 "cbreak",
91 CBREAK, 0,
92
93 "-cbreak",
94 0, CBREAK,
95
96 "cr0",
97 CR0, CR3,
98
99 "cr1",
100 CR1, CR3,
101
102 "cr2",
103 CR2, CR3,
104
105 "cr3",
106 CR3, CR3,
107
108 "tab0",
109 TAB0, XTABS,
110
111 "tab1",
112 TAB1, XTABS,
113
114 "tab2",
115 TAB2, XTABS,
116
117 "nl0",
118 NL0, NL3,
119
120 "nl1",
121 NL1, NL3,
122
123 "nl2",
124 NL2, NL3,
125
126 "nl3",
127 NL3, NL3,
128
129 "ff0",
130 FF0, FF1,
131
132 "ff1",
133 FF1, FF1,
134
135 "bs0",
136 BS0, BS1,
137
138 "bs1",
139 BS1, BS1,
140
141 "33",
142 CR1, ALLDELAY,
143
144 "tty33",
145 CR1, ALLDELAY,
146
147 "37",
148 FF1+CR2+TAB1+NL1, ALLDELAY,
149
150 "tty37",
151 FF1+CR2+TAB1+NL1, ALLDELAY,
152
153 "05",
154 NL2, ALLDELAY,
155
156 "vt05",
157 NL2, ALLDELAY,
158
159 "tn",
160 CR1, ALLDELAY,
161
162 "tn300",
163 CR1, ALLDELAY,
164
165 "ti",
166 CR2, ALLDELAY,
167
168 "ti700",
169 CR2, ALLDELAY,
170
171 "tek",
172 FF1, ALLDELAY,
173
174 0,
175 };
176
177char *arg;
178struct tchars tc;
179struct sgttyb mode;
180
181main(argc, argv)
182char *argv[];
183{
184 int i;
185
186 gtty(1, &mode);
187 ioctl(1, TIOCGETC, &tc);
188 if(argc == 1) {
189 prmodes();
190 exit(0);
191 }
192 while(--argc > 0) {
193
194 arg = *++argv;
195 if (eq("ek")){
196 mode.sg_erase = '#';
197 mode.sg_kill = '@';
198 }
199 if (eq("erase") && --argc) {
200 if (**++argv == '^')
201 mode.sg_erase = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
202 else
203 mode.sg_erase = **argv;
204 }
205 if (eq("intr") && --argc) {
206 if (**++argv == '^')
207 tc.t_intrc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
208 else
209 tc.t_intrc = **argv;
210 }
211 if (eq("quit") && --argc) {
212 if (**++argv == '^')
213 tc.t_quitc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
214 else
215 tc.t_quitc = **argv;
216 }
217 if (eq("start") && --argc) {
218 if (**++argv == '^')
219 tc.t_startc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
220 else
221 tc.t_startc = **argv;
222 }
223 if (eq("stop") && --argc) {
224 if (**++argv == '^')
225 tc.t_stopc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
226 else
227 tc.t_stopc = **argv;
228 }
229 if (eq("eof") && --argc) {
230 if (**++argv == '^')
231 tc.t_eofc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
232 else
233 tc.t_eofc = **argv;
234 }
235 if (eq("brk") && --argc) {
236 if (**++argv == '^')
237 tc.t_brkc = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
238 else
239 tc.t_brkc = **argv;
240 }
241 if (eq("kill") && --argc) {
242 if (**++argv == '^')
243 mode.sg_kill = (*(argv[1]) == '?') ? 0177 : (*argv)[1] & 037;
244 else
245 mode.sg_kill = **argv;
246 }
247 if (eq("gspeed")) {
248 mode.sg_ispeed = B300;
249 mode.sg_ospeed = B9600;
250 }
251 if (eq("hup")) {
252 ioctl(1, TIOCHPCL, NULL);
253 } else
254 for(i=0; speeds[i].string; i++)
255 if(eq(speeds[i].string))
256 mode.sg_ispeed = mode.sg_ospeed = speeds[i].speed;
257 for(i=0; modes[i].string; i++)
258 if(eq(modes[i].string)) {
259 mode.sg_flags &= ~modes[i].reset;
260 mode.sg_flags |= modes[i].set;
261 }
262 if(arg)
263 fprintf(stderr,"unknown mode: %s\n", arg);
264 }
265 stty(1,&mode);
266 ioctl(1, TIOCSETC, &tc);
267}
268
269eq(string)
270char *string;
271{
272 int i;
273
274 if(!arg)
275 return(0);
276 i = 0;
277loop:
278 if(arg[i] != string[i])
279 return(0);
280 if(arg[i++] != '\0')
281 goto loop;
282 arg = 0;
283 return(1);
284}
285
286prmodes()
287{
288 register m;
289
290 if(mode.sg_ispeed != mode.sg_ospeed) {
291 prspeed("input speed ", mode.sg_ispeed);
292 prspeed("output speed ", mode.sg_ospeed);
293 } else
294 prspeed("speed ", mode.sg_ispeed);
295 pit(mode.sg_erase, "erase", "; ");
296 pit(mode.sg_kill, "kill", "; ");
297 pit(tc.t_intrc, "intr", "; ");
298 pit(tc.t_quitc, "quit", "\n");
299 pit(tc.t_startc, "start", "; ");
300 pit(tc.t_stopc, "stop", "; ");
301 pit(tc.t_eofc, "eof", "; ");
302 pit(tc.t_brkc, "brk", "\n");
303 m = mode.sg_flags;
304 if(m & EVENP) fprintf(stderr,"even ");
305 if(m & ODDP) fprintf(stderr,"odd ");
306 fprintf(stderr,"-raw "+((m&RAW)!=0));
307 fprintf(stderr,"-nl "+((m&CRMOD)==0));
308 fprintf(stderr,"-echo "+((m&ECHO)!=0));
309 fprintf(stderr,"-lcase "+((m&LCASE)!=0));
310 fprintf(stderr,"-tabs "+((m&XTABS)!=XTABS));
311 fprintf(stderr,"-cbreak "+((m&CBREAK)!=0));
312 delay((m&NLDELAY)/NL1, "nl");
313 if ((m&TBDELAY)!=XTABS)
314 delay((m&TBDELAY)/TAB1, "tab");
315 delay((m&CRDELAY)/CR1, "cr");
316 delay((m&VTDELAY)/FF1, "ff");
317 delay((m&BSDELAY)/BS1, "bs");
318 fprintf(stderr,"\n");
319}
320
321pit(what, itsname, sep)
322 unsigned char what;
323 char *itsname, *sep;
324{
325
326 fprintf(stderr, "%s", itsname);
327 if (what == 0377) {
328 fprintf(stderr, " <undef>%s", sep);
329 return;
330 }
331 fprintf(stderr, " = ");
332 if (what & 0200) {
333 fprintf(stderr, "M-");
334 what &= ~ 0200;
335 }
336 if (what == 0177) {
337 fprintf(stderr, "^");
338 what = '?';
339 } else if (what < ' ') {
340 fprintf(stderr, "^");
341 what += '@';
342 }
343 fprintf(stderr, "%c%s", what, sep);
344}
345
346delay(m, s)
347char *s;
348{
349
350 if(m)
351 fprintf(stderr,"%s%d ", s, m);
352}
353
354int speed[] = {
355 0,50,75,110,134,150,200,300,600,1200,1800,2400,4800,9600,0,0
356};
357
358prspeed(c, s)
359char *c;
360{
361
362 fprintf(stderr,"%s%d baud\n", c, speed[s]);
363}