tty.c revision 1.27 1 1.27 christos /* $NetBSD: tty.c,v 1.27 2008/09/10 15:45:37 christos Exp $ */
2 1.2 lukem
3 1.1 cgd /*-
4 1.1 cgd * Copyright (c) 1992, 1993
5 1.1 cgd * The Regents of the University of California. All rights reserved.
6 1.1 cgd *
7 1.1 cgd * This code is derived from software contributed to Berkeley by
8 1.1 cgd * Christos Zoulas of Cornell University.
9 1.1 cgd *
10 1.1 cgd * Redistribution and use in source and binary forms, with or without
11 1.1 cgd * modification, are permitted provided that the following conditions
12 1.1 cgd * are met:
13 1.1 cgd * 1. Redistributions of source code must retain the above copyright
14 1.1 cgd * notice, this list of conditions and the following disclaimer.
15 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright
16 1.1 cgd * notice, this list of conditions and the following disclaimer in the
17 1.1 cgd * documentation and/or other materials provided with the distribution.
18 1.18 agc * 3. Neither the name of the University nor the names of its contributors
19 1.1 cgd * may be used to endorse or promote products derived from this software
20 1.1 cgd * without specific prior written permission.
21 1.1 cgd *
22 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 1.1 cgd * SUCH DAMAGE.
33 1.1 cgd */
34 1.1 cgd
35 1.16 christos #include "config.h"
36 1.1 cgd #if !defined(lint) && !defined(SCCSID)
37 1.2 lukem #if 0
38 1.1 cgd static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
39 1.2 lukem #else
40 1.27 christos __RCSID("$NetBSD: tty.c,v 1.27 2008/09/10 15:45:37 christos Exp $");
41 1.2 lukem #endif
42 1.1 cgd #endif /* not lint && not SCCSID */
43 1.1 cgd
44 1.11 simonb /*
45 1.1 cgd * tty.c: tty interface stuff
46 1.1 cgd */
47 1.19 christos #include <assert.h>
48 1.1 cgd #include "tty.h"
49 1.1 cgd #include "el.h"
50 1.1 cgd
51 1.1 cgd typedef struct ttymodes_t {
52 1.14 jdolecek const char *m_name;
53 1.23 lukem unsigned int m_value;
54 1.13 lukem int m_type;
55 1.13 lukem } ttymodes_t;
56 1.1 cgd
57 1.1 cgd typedef struct ttymap_t {
58 1.13 lukem int nch, och; /* Internal and termio rep of chars */
59 1.13 lukem el_action_t bind[3]; /* emacs, vi, and vi-cmd */
60 1.16 christos } ttymap_t;
61 1.1 cgd
62 1.1 cgd
63 1.14 jdolecek private const ttyperm_t ttyperm = {
64 1.13 lukem {
65 1.13 lukem {"iflag:", ICRNL, (INLCR | IGNCR)},
66 1.13 lukem {"oflag:", (OPOST | ONLCR), ONLRET},
67 1.13 lukem {"cflag:", 0, 0},
68 1.13 lukem {"lflag:", (ISIG | ICANON | ECHO | ECHOE | ECHOCTL | IEXTEN),
69 1.13 lukem (NOFLSH | ECHONL | EXTPROC | FLUSHO)},
70 1.13 lukem {"chars:", 0, 0},
71 1.13 lukem },
72 1.13 lukem {
73 1.13 lukem {"iflag:", (INLCR | ICRNL), IGNCR},
74 1.13 lukem {"oflag:", (OPOST | ONLCR), ONLRET},
75 1.13 lukem {"cflag:", 0, 0},
76 1.13 lukem {"lflag:", ISIG,
77 1.13 lukem (NOFLSH | ICANON | ECHO | ECHOK | ECHONL | EXTPROC | IEXTEN | FLUSHO)},
78 1.13 lukem {"chars:", (C_SH(C_MIN) | C_SH(C_TIME) | C_SH(C_SWTCH) | C_SH(C_DSWTCH) |
79 1.13 lukem C_SH(C_SUSP) | C_SH(C_DSUSP) | C_SH(C_EOL) | C_SH(C_DISCARD) |
80 1.13 lukem C_SH(C_PGOFF) | C_SH(C_PAGE) | C_SH(C_STATUS)), 0}
81 1.13 lukem },
82 1.13 lukem {
83 1.13 lukem {"iflag:", 0, IXON | IXOFF | INLCR | ICRNL},
84 1.13 lukem {"oflag:", 0, 0},
85 1.13 lukem {"cflag:", 0, 0},
86 1.13 lukem {"lflag:", 0, ISIG | IEXTEN},
87 1.13 lukem {"chars:", 0, 0},
88 1.13 lukem }
89 1.1 cgd };
90 1.1 cgd
91 1.14 jdolecek private const ttychar_t ttychar = {
92 1.13 lukem {
93 1.13 lukem CINTR, CQUIT, CERASE, CKILL,
94 1.13 lukem CEOF, CEOL, CEOL2, CSWTCH,
95 1.13 lukem CDSWTCH, CERASE2, CSTART, CSTOP,
96 1.13 lukem CWERASE, CSUSP, CDSUSP, CREPRINT,
97 1.13 lukem CDISCARD, CLNEXT, CSTATUS, CPAGE,
98 1.13 lukem CPGOFF, CKILL2, CBRK, CMIN,
99 1.13 lukem CTIME
100 1.13 lukem },
101 1.13 lukem {
102 1.13 lukem CINTR, CQUIT, CERASE, CKILL,
103 1.13 lukem _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
104 1.13 lukem _POSIX_VDISABLE, CERASE2, CSTART, CSTOP,
105 1.13 lukem _POSIX_VDISABLE, CSUSP, _POSIX_VDISABLE, _POSIX_VDISABLE,
106 1.13 lukem CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
107 1.13 lukem _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1,
108 1.13 lukem 0
109 1.13 lukem },
110 1.13 lukem {
111 1.13 lukem 0, 0, 0, 0,
112 1.13 lukem 0, 0, 0, 0,
113 1.13 lukem 0, 0, 0, 0,
114 1.13 lukem 0, 0, 0, 0,
115 1.13 lukem 0, 0, 0, 0,
116 1.13 lukem 0, 0, 0, 0,
117 1.13 lukem 0
118 1.13 lukem }
119 1.1 cgd };
120 1.1 cgd
121 1.14 jdolecek private const ttymap_t tty_map[] = {
122 1.1 cgd #ifdef VERASE
123 1.13 lukem {C_ERASE, VERASE,
124 1.21 mycroft {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
125 1.1 cgd #endif /* VERASE */
126 1.1 cgd #ifdef VERASE2
127 1.13 lukem {C_ERASE2, VERASE2,
128 1.21 mycroft {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}},
129 1.1 cgd #endif /* VERASE2 */
130 1.1 cgd #ifdef VKILL
131 1.13 lukem {C_KILL, VKILL,
132 1.13 lukem {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}},
133 1.1 cgd #endif /* VKILL */
134 1.1 cgd #ifdef VKILL2
135 1.13 lukem {C_KILL2, VKILL2,
136 1.13 lukem {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}},
137 1.1 cgd #endif /* VKILL2 */
138 1.1 cgd #ifdef VEOF
139 1.13 lukem {C_EOF, VEOF,
140 1.13 lukem {EM_DELETE_OR_LIST, VI_LIST_OR_EOF, ED_UNASSIGNED}},
141 1.1 cgd #endif /* VEOF */
142 1.1 cgd #ifdef VWERASE
143 1.13 lukem {C_WERASE, VWERASE,
144 1.13 lukem {ED_DELETE_PREV_WORD, ED_DELETE_PREV_WORD, ED_PREV_WORD}},
145 1.1 cgd #endif /* VWERASE */
146 1.1 cgd #ifdef VREPRINT
147 1.13 lukem {C_REPRINT, VREPRINT,
148 1.13 lukem {ED_REDISPLAY, ED_INSERT, ED_REDISPLAY}},
149 1.1 cgd #endif /* VREPRINT */
150 1.1 cgd #ifdef VLNEXT
151 1.13 lukem {C_LNEXT, VLNEXT,
152 1.13 lukem {ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}},
153 1.1 cgd #endif /* VLNEXT */
154 1.13 lukem {-1, -1,
155 1.13 lukem {ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}}
156 1.13 lukem };
157 1.1 cgd
158 1.14 jdolecek private const ttymodes_t ttymodes[] = {
159 1.13 lukem #ifdef IGNBRK
160 1.13 lukem {"ignbrk", IGNBRK, MD_INP},
161 1.13 lukem #endif /* IGNBRK */
162 1.13 lukem #ifdef BRKINT
163 1.13 lukem {"brkint", BRKINT, MD_INP},
164 1.13 lukem #endif /* BRKINT */
165 1.13 lukem #ifdef IGNPAR
166 1.13 lukem {"ignpar", IGNPAR, MD_INP},
167 1.13 lukem #endif /* IGNPAR */
168 1.13 lukem #ifdef PARMRK
169 1.13 lukem {"parmrk", PARMRK, MD_INP},
170 1.13 lukem #endif /* PARMRK */
171 1.13 lukem #ifdef INPCK
172 1.13 lukem {"inpck", INPCK, MD_INP},
173 1.13 lukem #endif /* INPCK */
174 1.13 lukem #ifdef ISTRIP
175 1.13 lukem {"istrip", ISTRIP, MD_INP},
176 1.13 lukem #endif /* ISTRIP */
177 1.13 lukem #ifdef INLCR
178 1.13 lukem {"inlcr", INLCR, MD_INP},
179 1.13 lukem #endif /* INLCR */
180 1.13 lukem #ifdef IGNCR
181 1.13 lukem {"igncr", IGNCR, MD_INP},
182 1.13 lukem #endif /* IGNCR */
183 1.13 lukem #ifdef ICRNL
184 1.13 lukem {"icrnl", ICRNL, MD_INP},
185 1.13 lukem #endif /* ICRNL */
186 1.13 lukem #ifdef IUCLC
187 1.13 lukem {"iuclc", IUCLC, MD_INP},
188 1.13 lukem #endif /* IUCLC */
189 1.13 lukem #ifdef IXON
190 1.13 lukem {"ixon", IXON, MD_INP},
191 1.13 lukem #endif /* IXON */
192 1.13 lukem #ifdef IXANY
193 1.13 lukem {"ixany", IXANY, MD_INP},
194 1.13 lukem #endif /* IXANY */
195 1.13 lukem #ifdef IXOFF
196 1.13 lukem {"ixoff", IXOFF, MD_INP},
197 1.13 lukem #endif /* IXOFF */
198 1.13 lukem #ifdef IMAXBEL
199 1.13 lukem {"imaxbel", IMAXBEL, MD_INP},
200 1.13 lukem #endif /* IMAXBEL */
201 1.13 lukem
202 1.13 lukem #ifdef OPOST
203 1.13 lukem {"opost", OPOST, MD_OUT},
204 1.13 lukem #endif /* OPOST */
205 1.13 lukem #ifdef OLCUC
206 1.13 lukem {"olcuc", OLCUC, MD_OUT},
207 1.13 lukem #endif /* OLCUC */
208 1.13 lukem #ifdef ONLCR
209 1.13 lukem {"onlcr", ONLCR, MD_OUT},
210 1.13 lukem #endif /* ONLCR */
211 1.13 lukem #ifdef OCRNL
212 1.13 lukem {"ocrnl", OCRNL, MD_OUT},
213 1.13 lukem #endif /* OCRNL */
214 1.13 lukem #ifdef ONOCR
215 1.13 lukem {"onocr", ONOCR, MD_OUT},
216 1.13 lukem #endif /* ONOCR */
217 1.13 lukem #ifdef ONOEOT
218 1.13 lukem {"onoeot", ONOEOT, MD_OUT},
219 1.13 lukem #endif /* ONOEOT */
220 1.13 lukem #ifdef ONLRET
221 1.13 lukem {"onlret", ONLRET, MD_OUT},
222 1.13 lukem #endif /* ONLRET */
223 1.13 lukem #ifdef OFILL
224 1.13 lukem {"ofill", OFILL, MD_OUT},
225 1.13 lukem #endif /* OFILL */
226 1.13 lukem #ifdef OFDEL
227 1.13 lukem {"ofdel", OFDEL, MD_OUT},
228 1.13 lukem #endif /* OFDEL */
229 1.13 lukem #ifdef NLDLY
230 1.13 lukem {"nldly", NLDLY, MD_OUT},
231 1.13 lukem #endif /* NLDLY */
232 1.13 lukem #ifdef CRDLY
233 1.13 lukem {"crdly", CRDLY, MD_OUT},
234 1.13 lukem #endif /* CRDLY */
235 1.13 lukem #ifdef TABDLY
236 1.13 lukem {"tabdly", TABDLY, MD_OUT},
237 1.13 lukem #endif /* TABDLY */
238 1.13 lukem #ifdef XTABS
239 1.13 lukem {"xtabs", XTABS, MD_OUT},
240 1.13 lukem #endif /* XTABS */
241 1.13 lukem #ifdef BSDLY
242 1.13 lukem {"bsdly", BSDLY, MD_OUT},
243 1.13 lukem #endif /* BSDLY */
244 1.13 lukem #ifdef VTDLY
245 1.13 lukem {"vtdly", VTDLY, MD_OUT},
246 1.13 lukem #endif /* VTDLY */
247 1.13 lukem #ifdef FFDLY
248 1.13 lukem {"ffdly", FFDLY, MD_OUT},
249 1.13 lukem #endif /* FFDLY */
250 1.13 lukem #ifdef PAGEOUT
251 1.13 lukem {"pageout", PAGEOUT, MD_OUT},
252 1.13 lukem #endif /* PAGEOUT */
253 1.13 lukem #ifdef WRAP
254 1.13 lukem {"wrap", WRAP, MD_OUT},
255 1.13 lukem #endif /* WRAP */
256 1.13 lukem
257 1.13 lukem #ifdef CIGNORE
258 1.13 lukem {"cignore", CIGNORE, MD_CTL},
259 1.13 lukem #endif /* CBAUD */
260 1.13 lukem #ifdef CBAUD
261 1.13 lukem {"cbaud", CBAUD, MD_CTL},
262 1.13 lukem #endif /* CBAUD */
263 1.13 lukem #ifdef CSTOPB
264 1.13 lukem {"cstopb", CSTOPB, MD_CTL},
265 1.13 lukem #endif /* CSTOPB */
266 1.13 lukem #ifdef CREAD
267 1.13 lukem {"cread", CREAD, MD_CTL},
268 1.13 lukem #endif /* CREAD */
269 1.13 lukem #ifdef PARENB
270 1.13 lukem {"parenb", PARENB, MD_CTL},
271 1.13 lukem #endif /* PARENB */
272 1.13 lukem #ifdef PARODD
273 1.13 lukem {"parodd", PARODD, MD_CTL},
274 1.13 lukem #endif /* PARODD */
275 1.13 lukem #ifdef HUPCL
276 1.13 lukem {"hupcl", HUPCL, MD_CTL},
277 1.13 lukem #endif /* HUPCL */
278 1.13 lukem #ifdef CLOCAL
279 1.13 lukem {"clocal", CLOCAL, MD_CTL},
280 1.13 lukem #endif /* CLOCAL */
281 1.13 lukem #ifdef LOBLK
282 1.13 lukem {"loblk", LOBLK, MD_CTL},
283 1.13 lukem #endif /* LOBLK */
284 1.13 lukem #ifdef CIBAUD
285 1.13 lukem {"cibaud", CIBAUD, MD_CTL},
286 1.13 lukem #endif /* CIBAUD */
287 1.13 lukem #ifdef CRTSCTS
288 1.13 lukem #ifdef CCTS_OFLOW
289 1.13 lukem {"ccts_oflow", CCTS_OFLOW, MD_CTL},
290 1.13 lukem #else
291 1.13 lukem {"crtscts", CRTSCTS, MD_CTL},
292 1.13 lukem #endif /* CCTS_OFLOW */
293 1.13 lukem #endif /* CRTSCTS */
294 1.13 lukem #ifdef CRTS_IFLOW
295 1.13 lukem {"crts_iflow", CRTS_IFLOW, MD_CTL},
296 1.13 lukem #endif /* CRTS_IFLOW */
297 1.13 lukem #ifdef CDTRCTS
298 1.13 lukem {"cdtrcts", CDTRCTS, MD_CTL},
299 1.13 lukem #endif /* CDTRCTS */
300 1.13 lukem #ifdef MDMBUF
301 1.13 lukem {"mdmbuf", MDMBUF, MD_CTL},
302 1.13 lukem #endif /* MDMBUF */
303 1.13 lukem #ifdef RCV1EN
304 1.13 lukem {"rcv1en", RCV1EN, MD_CTL},
305 1.13 lukem #endif /* RCV1EN */
306 1.13 lukem #ifdef XMT1EN
307 1.13 lukem {"xmt1en", XMT1EN, MD_CTL},
308 1.13 lukem #endif /* XMT1EN */
309 1.13 lukem
310 1.13 lukem #ifdef ISIG
311 1.13 lukem {"isig", ISIG, MD_LIN},
312 1.13 lukem #endif /* ISIG */
313 1.13 lukem #ifdef ICANON
314 1.13 lukem {"icanon", ICANON, MD_LIN},
315 1.13 lukem #endif /* ICANON */
316 1.13 lukem #ifdef XCASE
317 1.13 lukem {"xcase", XCASE, MD_LIN},
318 1.13 lukem #endif /* XCASE */
319 1.13 lukem #ifdef ECHO
320 1.13 lukem {"echo", ECHO, MD_LIN},
321 1.13 lukem #endif /* ECHO */
322 1.13 lukem #ifdef ECHOE
323 1.13 lukem {"echoe", ECHOE, MD_LIN},
324 1.13 lukem #endif /* ECHOE */
325 1.13 lukem #ifdef ECHOK
326 1.13 lukem {"echok", ECHOK, MD_LIN},
327 1.13 lukem #endif /* ECHOK */
328 1.13 lukem #ifdef ECHONL
329 1.13 lukem {"echonl", ECHONL, MD_LIN},
330 1.13 lukem #endif /* ECHONL */
331 1.13 lukem #ifdef NOFLSH
332 1.13 lukem {"noflsh", NOFLSH, MD_LIN},
333 1.13 lukem #endif /* NOFLSH */
334 1.13 lukem #ifdef TOSTOP
335 1.13 lukem {"tostop", TOSTOP, MD_LIN},
336 1.13 lukem #endif /* TOSTOP */
337 1.13 lukem #ifdef ECHOCTL
338 1.13 lukem {"echoctl", ECHOCTL, MD_LIN},
339 1.13 lukem #endif /* ECHOCTL */
340 1.13 lukem #ifdef ECHOPRT
341 1.13 lukem {"echoprt", ECHOPRT, MD_LIN},
342 1.13 lukem #endif /* ECHOPRT */
343 1.13 lukem #ifdef ECHOKE
344 1.13 lukem {"echoke", ECHOKE, MD_LIN},
345 1.13 lukem #endif /* ECHOKE */
346 1.13 lukem #ifdef DEFECHO
347 1.13 lukem {"defecho", DEFECHO, MD_LIN},
348 1.13 lukem #endif /* DEFECHO */
349 1.13 lukem #ifdef FLUSHO
350 1.13 lukem {"flusho", FLUSHO, MD_LIN},
351 1.13 lukem #endif /* FLUSHO */
352 1.13 lukem #ifdef PENDIN
353 1.13 lukem {"pendin", PENDIN, MD_LIN},
354 1.13 lukem #endif /* PENDIN */
355 1.13 lukem #ifdef IEXTEN
356 1.13 lukem {"iexten", IEXTEN, MD_LIN},
357 1.13 lukem #endif /* IEXTEN */
358 1.13 lukem #ifdef NOKERNINFO
359 1.13 lukem {"nokerninfo", NOKERNINFO, MD_LIN},
360 1.13 lukem #endif /* NOKERNINFO */
361 1.13 lukem #ifdef ALTWERASE
362 1.13 lukem {"altwerase", ALTWERASE, MD_LIN},
363 1.13 lukem #endif /* ALTWERASE */
364 1.13 lukem #ifdef EXTPROC
365 1.13 lukem {"extproc", EXTPROC, MD_LIN},
366 1.13 lukem #endif /* EXTPROC */
367 1.13 lukem
368 1.13 lukem #if defined(VINTR)
369 1.13 lukem {"intr", C_SH(C_INTR), MD_CHAR},
370 1.13 lukem #endif /* VINTR */
371 1.13 lukem #if defined(VQUIT)
372 1.13 lukem {"quit", C_SH(C_QUIT), MD_CHAR},
373 1.13 lukem #endif /* VQUIT */
374 1.13 lukem #if defined(VERASE)
375 1.13 lukem {"erase", C_SH(C_ERASE), MD_CHAR},
376 1.13 lukem #endif /* VERASE */
377 1.13 lukem #if defined(VKILL)
378 1.13 lukem {"kill", C_SH(C_KILL), MD_CHAR},
379 1.13 lukem #endif /* VKILL */
380 1.13 lukem #if defined(VEOF)
381 1.13 lukem {"eof", C_SH(C_EOF), MD_CHAR},
382 1.13 lukem #endif /* VEOF */
383 1.13 lukem #if defined(VEOL)
384 1.13 lukem {"eol", C_SH(C_EOL), MD_CHAR},
385 1.13 lukem #endif /* VEOL */
386 1.13 lukem #if defined(VEOL2)
387 1.13 lukem {"eol2", C_SH(C_EOL2), MD_CHAR},
388 1.13 lukem #endif /* VEOL2 */
389 1.13 lukem #if defined(VSWTCH)
390 1.13 lukem {"swtch", C_SH(C_SWTCH), MD_CHAR},
391 1.13 lukem #endif /* VSWTCH */
392 1.13 lukem #if defined(VDSWTCH)
393 1.13 lukem {"dswtch", C_SH(C_DSWTCH), MD_CHAR},
394 1.13 lukem #endif /* VDSWTCH */
395 1.13 lukem #if defined(VERASE2)
396 1.13 lukem {"erase2", C_SH(C_ERASE2), MD_CHAR},
397 1.13 lukem #endif /* VERASE2 */
398 1.13 lukem #if defined(VSTART)
399 1.13 lukem {"start", C_SH(C_START), MD_CHAR},
400 1.13 lukem #endif /* VSTART */
401 1.13 lukem #if defined(VSTOP)
402 1.13 lukem {"stop", C_SH(C_STOP), MD_CHAR},
403 1.13 lukem #endif /* VSTOP */
404 1.13 lukem #if defined(VWERASE)
405 1.13 lukem {"werase", C_SH(C_WERASE), MD_CHAR},
406 1.13 lukem #endif /* VWERASE */
407 1.13 lukem #if defined(VSUSP)
408 1.13 lukem {"susp", C_SH(C_SUSP), MD_CHAR},
409 1.13 lukem #endif /* VSUSP */
410 1.13 lukem #if defined(VDSUSP)
411 1.13 lukem {"dsusp", C_SH(C_DSUSP), MD_CHAR},
412 1.13 lukem #endif /* VDSUSP */
413 1.13 lukem #if defined(VREPRINT)
414 1.13 lukem {"reprint", C_SH(C_REPRINT), MD_CHAR},
415 1.13 lukem #endif /* VREPRINT */
416 1.13 lukem #if defined(VDISCARD)
417 1.13 lukem {"discard", C_SH(C_DISCARD), MD_CHAR},
418 1.13 lukem #endif /* VDISCARD */
419 1.13 lukem #if defined(VLNEXT)
420 1.13 lukem {"lnext", C_SH(C_LNEXT), MD_CHAR},
421 1.13 lukem #endif /* VLNEXT */
422 1.13 lukem #if defined(VSTATUS)
423 1.13 lukem {"status", C_SH(C_STATUS), MD_CHAR},
424 1.13 lukem #endif /* VSTATUS */
425 1.13 lukem #if defined(VPAGE)
426 1.13 lukem {"page", C_SH(C_PAGE), MD_CHAR},
427 1.13 lukem #endif /* VPAGE */
428 1.13 lukem #if defined(VPGOFF)
429 1.13 lukem {"pgoff", C_SH(C_PGOFF), MD_CHAR},
430 1.13 lukem #endif /* VPGOFF */
431 1.13 lukem #if defined(VKILL2)
432 1.13 lukem {"kill2", C_SH(C_KILL2), MD_CHAR},
433 1.13 lukem #endif /* VKILL2 */
434 1.13 lukem #if defined(VBRK)
435 1.13 lukem {"brk", C_SH(C_BRK), MD_CHAR},
436 1.13 lukem #endif /* VBRK */
437 1.13 lukem #if defined(VMIN)
438 1.13 lukem {"min", C_SH(C_MIN), MD_CHAR},
439 1.13 lukem #endif /* VMIN */
440 1.13 lukem #if defined(VTIME)
441 1.13 lukem {"time", C_SH(C_TIME), MD_CHAR},
442 1.13 lukem #endif /* VTIME */
443 1.13 lukem {NULL, 0, -1},
444 1.1 cgd };
445 1.1 cgd
446 1.1 cgd
447 1.1 cgd
448 1.13 lukem #define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1)
449 1.13 lukem #define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
450 1.13 lukem #define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
451 1.13 lukem
452 1.26 christos private int tty_getty(EditLine *, struct termios *);
453 1.26 christos private int tty_setty(EditLine *, int, const struct termios *);
454 1.19 christos private int tty__getcharindex(int);
455 1.13 lukem private void tty__getchar(struct termios *, unsigned char *);
456 1.13 lukem private void tty__setchar(struct termios *, unsigned char *);
457 1.13 lukem private speed_t tty__getspeed(struct termios *);
458 1.13 lukem private int tty_setup(EditLine *);
459 1.1 cgd
460 1.13 lukem #define t_qu t_ts
461 1.1 cgd
462 1.26 christos /* tty_getty():
463 1.26 christos * Wrapper for tcgetattr to handle EINTR
464 1.26 christos */
465 1.26 christos private int
466 1.26 christos tty_getty(EditLine *el, struct termios *t)
467 1.26 christos {
468 1.26 christos int rv;
469 1.26 christos while ((rv = tcgetattr(el->el_infd, t)) == -1 && errno == EINTR)
470 1.26 christos continue;
471 1.26 christos return rv;
472 1.26 christos }
473 1.26 christos
474 1.26 christos /* tty_setty():
475 1.26 christos * Wrapper for tcsetattr to handle EINTR
476 1.26 christos */
477 1.26 christos private int
478 1.26 christos tty_setty(EditLine *el, int action, const struct termios *t)
479 1.26 christos {
480 1.26 christos int rv;
481 1.26 christos while ((rv = tcsetattr(el->el_infd, action, t)) == -1 && errno == EINTR)
482 1.26 christos continue;
483 1.26 christos return rv;
484 1.26 christos }
485 1.1 cgd
486 1.1 cgd /* tty_setup():
487 1.1 cgd * Get the tty parameters and initialize the editing state
488 1.1 cgd */
489 1.11 simonb private int
490 1.13 lukem tty_setup(EditLine *el)
491 1.1 cgd {
492 1.13 lukem int rst = 1;
493 1.12 sommerfe
494 1.13 lukem if (el->el_flags & EDIT_DISABLED)
495 1.13 lukem return (0);
496 1.13 lukem
497 1.13 lukem if (tty_getty(el, &el->el_tty.t_ed) == -1) {
498 1.1 cgd #ifdef DEBUG_TTY
499 1.13 lukem (void) fprintf(el->el_errfile,
500 1.13 lukem "tty_setup: tty_getty: %s\n", strerror(errno));
501 1.1 cgd #endif /* DEBUG_TTY */
502 1.13 lukem return (-1);
503 1.13 lukem }
504 1.13 lukem el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed;
505 1.13 lukem
506 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex);
507 1.13 lukem el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex);
508 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex);
509 1.13 lukem
510 1.13 lukem el->el_tty.t_ex.c_iflag &= ~el->el_tty.t_t[EX_IO][MD_INP].t_clrmask;
511 1.13 lukem el->el_tty.t_ex.c_iflag |= el->el_tty.t_t[EX_IO][MD_INP].t_setmask;
512 1.13 lukem
513 1.13 lukem el->el_tty.t_ex.c_oflag &= ~el->el_tty.t_t[EX_IO][MD_OUT].t_clrmask;
514 1.13 lukem el->el_tty.t_ex.c_oflag |= el->el_tty.t_t[EX_IO][MD_OUT].t_setmask;
515 1.13 lukem
516 1.13 lukem el->el_tty.t_ex.c_cflag &= ~el->el_tty.t_t[EX_IO][MD_CTL].t_clrmask;
517 1.13 lukem el->el_tty.t_ex.c_cflag |= el->el_tty.t_t[EX_IO][MD_CTL].t_setmask;
518 1.13 lukem
519 1.13 lukem el->el_tty.t_ex.c_lflag &= ~el->el_tty.t_t[EX_IO][MD_LIN].t_clrmask;
520 1.13 lukem el->el_tty.t_ex.c_lflag |= el->el_tty.t_t[EX_IO][MD_LIN].t_setmask;
521 1.13 lukem
522 1.13 lukem /*
523 1.13 lukem * Reset the tty chars to reasonable defaults
524 1.13 lukem * If they are disabled, then enable them.
525 1.13 lukem */
526 1.13 lukem if (rst) {
527 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) {
528 1.13 lukem tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
529 1.13 lukem /*
530 1.13 lukem * Don't affect CMIN and CTIME for the editor mode
531 1.13 lukem */
532 1.13 lukem for (rst = 0; rst < C_NCC - 2; rst++)
533 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] !=
534 1.13 lukem el->el_tty.t_vdisable
535 1.13 lukem && el->el_tty.t_c[ED_IO][rst] !=
536 1.13 lukem el->el_tty.t_vdisable)
537 1.13 lukem el->el_tty.t_c[ED_IO][rst] =
538 1.13 lukem el->el_tty.t_c[TS_IO][rst];
539 1.13 lukem for (rst = 0; rst < C_NCC; rst++)
540 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] !=
541 1.13 lukem el->el_tty.t_vdisable)
542 1.13 lukem el->el_tty.t_c[EX_IO][rst] =
543 1.13 lukem el->el_tty.t_c[TS_IO][rst];
544 1.13 lukem }
545 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
546 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
547 1.1 cgd #ifdef DEBUG_TTY
548 1.13 lukem (void) fprintf(el->el_errfile,
549 1.13 lukem "tty_setup: tty_setty: %s\n",
550 1.13 lukem strerror(errno));
551 1.1 cgd #endif /* DEBUG_TTY */
552 1.13 lukem return (-1);
553 1.13 lukem }
554 1.25 christos }
555 1.25 christos #ifdef notdef
556 1.25 christos else
557 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
558 1.25 christos #endif
559 1.13 lukem
560 1.13 lukem el->el_tty.t_ed.c_iflag &= ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask;
561 1.13 lukem el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][MD_INP].t_setmask;
562 1.13 lukem
563 1.13 lukem el->el_tty.t_ed.c_oflag &= ~el->el_tty.t_t[ED_IO][MD_OUT].t_clrmask;
564 1.13 lukem el->el_tty.t_ed.c_oflag |= el->el_tty.t_t[ED_IO][MD_OUT].t_setmask;
565 1.13 lukem
566 1.13 lukem el->el_tty.t_ed.c_cflag &= ~el->el_tty.t_t[ED_IO][MD_CTL].t_clrmask;
567 1.13 lukem el->el_tty.t_ed.c_cflag |= el->el_tty.t_t[ED_IO][MD_CTL].t_setmask;
568 1.13 lukem
569 1.13 lukem el->el_tty.t_ed.c_lflag &= ~el->el_tty.t_t[ED_IO][MD_LIN].t_clrmask;
570 1.13 lukem el->el_tty.t_ed.c_lflag |= el->el_tty.t_t[ED_IO][MD_LIN].t_setmask;
571 1.13 lukem
572 1.13 lukem tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
573 1.13 lukem tty_bind_char(el, 1);
574 1.13 lukem return (0);
575 1.1 cgd }
576 1.1 cgd
577 1.1 cgd protected int
578 1.13 lukem tty_init(EditLine *el)
579 1.1 cgd {
580 1.13 lukem
581 1.13 lukem el->el_tty.t_mode = EX_IO;
582 1.13 lukem el->el_tty.t_vdisable = _POSIX_VDISABLE;
583 1.13 lukem (void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t));
584 1.13 lukem (void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t));
585 1.13 lukem return (tty_setup(el));
586 1.13 lukem }
587 1.1 cgd
588 1.1 cgd
589 1.1 cgd /* tty_end():
590 1.1 cgd * Restore the tty to its original settings
591 1.1 cgd */
592 1.1 cgd protected void
593 1.1 cgd /*ARGSUSED*/
594 1.17 christos tty_end(EditLine *el __attribute__((__unused__)))
595 1.1 cgd {
596 1.13 lukem
597 1.13 lukem /* XXX: Maybe reset to an initial state? */
598 1.1 cgd }
599 1.1 cgd
600 1.1 cgd
601 1.1 cgd /* tty__getspeed():
602 1.1 cgd * Get the tty speed
603 1.1 cgd */
604 1.1 cgd private speed_t
605 1.13 lukem tty__getspeed(struct termios *td)
606 1.1 cgd {
607 1.13 lukem speed_t spd;
608 1.1 cgd
609 1.13 lukem if ((spd = cfgetispeed(td)) == 0)
610 1.13 lukem spd = cfgetospeed(td);
611 1.13 lukem return (spd);
612 1.13 lukem }
613 1.1 cgd
614 1.19 christos /* tty__getspeed():
615 1.19 christos * Return the index of the asked char in the c_cc array
616 1.19 christos */
617 1.19 christos private int
618 1.19 christos tty__getcharindex(int i)
619 1.19 christos {
620 1.19 christos switch (i) {
621 1.19 christos #ifdef VINTR
622 1.19 christos case C_INTR:
623 1.19 christos return VINTR;
624 1.19 christos #endif /* VINTR */
625 1.19 christos #ifdef VQUIT
626 1.19 christos case C_QUIT:
627 1.19 christos return VQUIT;
628 1.19 christos #endif /* VQUIT */
629 1.19 christos #ifdef VERASE
630 1.19 christos case C_ERASE:
631 1.19 christos return VERASE;
632 1.19 christos #endif /* VERASE */
633 1.19 christos #ifdef VKILL
634 1.19 christos case C_KILL:
635 1.19 christos return VKILL;
636 1.19 christos #endif /* VKILL */
637 1.19 christos #ifdef VEOF
638 1.19 christos case C_EOF:
639 1.19 christos return VEOF;
640 1.19 christos #endif /* VEOF */
641 1.19 christos #ifdef VEOL
642 1.19 christos case C_EOL:
643 1.19 christos return VEOL;
644 1.19 christos #endif /* VEOL */
645 1.19 christos #ifdef VEOL2
646 1.19 christos case C_EOL2:
647 1.19 christos return VEOL2;
648 1.19 christos #endif /* VEOL2 */
649 1.19 christos #ifdef VSWTCH
650 1.19 christos case C_SWTCH:
651 1.19 christos return VSWTCH;
652 1.19 christos #endif /* VSWTCH */
653 1.19 christos #ifdef VDSWTCH
654 1.19 christos case C_DSWTCH:
655 1.19 christos return VDSWTCH;
656 1.19 christos #endif /* VDSWTCH */
657 1.19 christos #ifdef VERASE2
658 1.19 christos case C_ERASE2:
659 1.19 christos return VERASE2;
660 1.19 christos #endif /* VERASE2 */
661 1.19 christos #ifdef VSTART
662 1.19 christos case C_START:
663 1.19 christos return VSTART;
664 1.19 christos #endif /* VSTART */
665 1.19 christos #ifdef VSTOP
666 1.19 christos case C_STOP:
667 1.19 christos return VSTOP;
668 1.19 christos #endif /* VSTOP */
669 1.19 christos #ifdef VWERASE
670 1.19 christos case C_WERASE:
671 1.19 christos return VWERASE;
672 1.19 christos #endif /* VWERASE */
673 1.19 christos #ifdef VSUSP
674 1.19 christos case C_SUSP:
675 1.19 christos return VSUSP;
676 1.19 christos #endif /* VSUSP */
677 1.19 christos #ifdef VDSUSP
678 1.19 christos case C_DSUSP:
679 1.19 christos return VDSUSP;
680 1.19 christos #endif /* VDSUSP */
681 1.19 christos #ifdef VREPRINT
682 1.19 christos case C_REPRINT:
683 1.19 christos return VREPRINT;
684 1.19 christos #endif /* VREPRINT */
685 1.19 christos #ifdef VDISCARD
686 1.19 christos case C_DISCARD:
687 1.19 christos return VDISCARD;
688 1.19 christos #endif /* VDISCARD */
689 1.19 christos #ifdef VLNEXT
690 1.19 christos case C_LNEXT:
691 1.19 christos return VLNEXT;
692 1.19 christos #endif /* VLNEXT */
693 1.19 christos #ifdef VSTATUS
694 1.19 christos case C_STATUS:
695 1.19 christos return VSTATUS;
696 1.19 christos #endif /* VSTATUS */
697 1.19 christos #ifdef VPAGE
698 1.19 christos case C_PAGE:
699 1.19 christos return VPAGE;
700 1.19 christos #endif /* VPAGE */
701 1.19 christos #ifdef VPGOFF
702 1.19 christos case C_PGOFF:
703 1.19 christos return VPGOFF;
704 1.19 christos #endif /* VPGOFF */
705 1.19 christos #ifdef VKILL2
706 1.19 christos case C_KILL2:
707 1.19 christos return VKILL2;
708 1.19 christos #endif /* KILL2 */
709 1.19 christos #ifdef VMIN
710 1.19 christos case C_MIN:
711 1.19 christos return VMIN;
712 1.19 christos #endif /* VMIN */
713 1.19 christos #ifdef VTIME
714 1.19 christos case C_TIME:
715 1.19 christos return VTIME;
716 1.19 christos #endif /* VTIME */
717 1.19 christos default:
718 1.19 christos return -1;
719 1.19 christos }
720 1.19 christos }
721 1.1 cgd
722 1.1 cgd /* tty__getchar():
723 1.1 cgd * Get the tty characters
724 1.1 cgd */
725 1.1 cgd private void
726 1.13 lukem tty__getchar(struct termios *td, unsigned char *s)
727 1.11 simonb {
728 1.13 lukem
729 1.13 lukem #ifdef VINTR
730 1.13 lukem s[C_INTR] = td->c_cc[VINTR];
731 1.13 lukem #endif /* VINTR */
732 1.13 lukem #ifdef VQUIT
733 1.13 lukem s[C_QUIT] = td->c_cc[VQUIT];
734 1.13 lukem #endif /* VQUIT */
735 1.13 lukem #ifdef VERASE
736 1.13 lukem s[C_ERASE] = td->c_cc[VERASE];
737 1.13 lukem #endif /* VERASE */
738 1.13 lukem #ifdef VKILL
739 1.13 lukem s[C_KILL] = td->c_cc[VKILL];
740 1.13 lukem #endif /* VKILL */
741 1.13 lukem #ifdef VEOF
742 1.13 lukem s[C_EOF] = td->c_cc[VEOF];
743 1.13 lukem #endif /* VEOF */
744 1.13 lukem #ifdef VEOL
745 1.13 lukem s[C_EOL] = td->c_cc[VEOL];
746 1.13 lukem #endif /* VEOL */
747 1.13 lukem #ifdef VEOL2
748 1.13 lukem s[C_EOL2] = td->c_cc[VEOL2];
749 1.13 lukem #endif /* VEOL2 */
750 1.13 lukem #ifdef VSWTCH
751 1.13 lukem s[C_SWTCH] = td->c_cc[VSWTCH];
752 1.13 lukem #endif /* VSWTCH */
753 1.13 lukem #ifdef VDSWTCH
754 1.13 lukem s[C_DSWTCH] = td->c_cc[VDSWTCH];
755 1.13 lukem #endif /* VDSWTCH */
756 1.13 lukem #ifdef VERASE2
757 1.13 lukem s[C_ERASE2] = td->c_cc[VERASE2];
758 1.13 lukem #endif /* VERASE2 */
759 1.13 lukem #ifdef VSTART
760 1.13 lukem s[C_START] = td->c_cc[VSTART];
761 1.13 lukem #endif /* VSTART */
762 1.13 lukem #ifdef VSTOP
763 1.13 lukem s[C_STOP] = td->c_cc[VSTOP];
764 1.13 lukem #endif /* VSTOP */
765 1.13 lukem #ifdef VWERASE
766 1.13 lukem s[C_WERASE] = td->c_cc[VWERASE];
767 1.13 lukem #endif /* VWERASE */
768 1.13 lukem #ifdef VSUSP
769 1.13 lukem s[C_SUSP] = td->c_cc[VSUSP];
770 1.13 lukem #endif /* VSUSP */
771 1.13 lukem #ifdef VDSUSP
772 1.13 lukem s[C_DSUSP] = td->c_cc[VDSUSP];
773 1.13 lukem #endif /* VDSUSP */
774 1.13 lukem #ifdef VREPRINT
775 1.13 lukem s[C_REPRINT] = td->c_cc[VREPRINT];
776 1.13 lukem #endif /* VREPRINT */
777 1.13 lukem #ifdef VDISCARD
778 1.13 lukem s[C_DISCARD] = td->c_cc[VDISCARD];
779 1.13 lukem #endif /* VDISCARD */
780 1.13 lukem #ifdef VLNEXT
781 1.13 lukem s[C_LNEXT] = td->c_cc[VLNEXT];
782 1.13 lukem #endif /* VLNEXT */
783 1.13 lukem #ifdef VSTATUS
784 1.13 lukem s[C_STATUS] = td->c_cc[VSTATUS];
785 1.13 lukem #endif /* VSTATUS */
786 1.13 lukem #ifdef VPAGE
787 1.13 lukem s[C_PAGE] = td->c_cc[VPAGE];
788 1.13 lukem #endif /* VPAGE */
789 1.13 lukem #ifdef VPGOFF
790 1.13 lukem s[C_PGOFF] = td->c_cc[VPGOFF];
791 1.13 lukem #endif /* VPGOFF */
792 1.13 lukem #ifdef VKILL2
793 1.13 lukem s[C_KILL2] = td->c_cc[VKILL2];
794 1.13 lukem #endif /* KILL2 */
795 1.13 lukem #ifdef VMIN
796 1.13 lukem s[C_MIN] = td->c_cc[VMIN];
797 1.13 lukem #endif /* VMIN */
798 1.13 lukem #ifdef VTIME
799 1.13 lukem s[C_TIME] = td->c_cc[VTIME];
800 1.13 lukem #endif /* VTIME */
801 1.13 lukem } /* tty__getchar */
802 1.1 cgd
803 1.1 cgd
804 1.1 cgd /* tty__setchar():
805 1.1 cgd * Set the tty characters
806 1.1 cgd */
807 1.1 cgd private void
808 1.13 lukem tty__setchar(struct termios *td, unsigned char *s)
809 1.11 simonb {
810 1.13 lukem
811 1.13 lukem #ifdef VINTR
812 1.13 lukem td->c_cc[VINTR] = s[C_INTR];
813 1.13 lukem #endif /* VINTR */
814 1.13 lukem #ifdef VQUIT
815 1.13 lukem td->c_cc[VQUIT] = s[C_QUIT];
816 1.13 lukem #endif /* VQUIT */
817 1.13 lukem #ifdef VERASE
818 1.13 lukem td->c_cc[VERASE] = s[C_ERASE];
819 1.13 lukem #endif /* VERASE */
820 1.13 lukem #ifdef VKILL
821 1.13 lukem td->c_cc[VKILL] = s[C_KILL];
822 1.13 lukem #endif /* VKILL */
823 1.13 lukem #ifdef VEOF
824 1.13 lukem td->c_cc[VEOF] = s[C_EOF];
825 1.13 lukem #endif /* VEOF */
826 1.13 lukem #ifdef VEOL
827 1.13 lukem td->c_cc[VEOL] = s[C_EOL];
828 1.13 lukem #endif /* VEOL */
829 1.13 lukem #ifdef VEOL2
830 1.13 lukem td->c_cc[VEOL2] = s[C_EOL2];
831 1.13 lukem #endif /* VEOL2 */
832 1.13 lukem #ifdef VSWTCH
833 1.13 lukem td->c_cc[VSWTCH] = s[C_SWTCH];
834 1.13 lukem #endif /* VSWTCH */
835 1.13 lukem #ifdef VDSWTCH
836 1.13 lukem td->c_cc[VDSWTCH] = s[C_DSWTCH];
837 1.13 lukem #endif /* VDSWTCH */
838 1.13 lukem #ifdef VERASE2
839 1.13 lukem td->c_cc[VERASE2] = s[C_ERASE2];
840 1.13 lukem #endif /* VERASE2 */
841 1.13 lukem #ifdef VSTART
842 1.13 lukem td->c_cc[VSTART] = s[C_START];
843 1.13 lukem #endif /* VSTART */
844 1.13 lukem #ifdef VSTOP
845 1.13 lukem td->c_cc[VSTOP] = s[C_STOP];
846 1.13 lukem #endif /* VSTOP */
847 1.13 lukem #ifdef VWERASE
848 1.13 lukem td->c_cc[VWERASE] = s[C_WERASE];
849 1.13 lukem #endif /* VWERASE */
850 1.13 lukem #ifdef VSUSP
851 1.13 lukem td->c_cc[VSUSP] = s[C_SUSP];
852 1.13 lukem #endif /* VSUSP */
853 1.13 lukem #ifdef VDSUSP
854 1.13 lukem td->c_cc[VDSUSP] = s[C_DSUSP];
855 1.13 lukem #endif /* VDSUSP */
856 1.13 lukem #ifdef VREPRINT
857 1.13 lukem td->c_cc[VREPRINT] = s[C_REPRINT];
858 1.13 lukem #endif /* VREPRINT */
859 1.13 lukem #ifdef VDISCARD
860 1.13 lukem td->c_cc[VDISCARD] = s[C_DISCARD];
861 1.13 lukem #endif /* VDISCARD */
862 1.13 lukem #ifdef VLNEXT
863 1.13 lukem td->c_cc[VLNEXT] = s[C_LNEXT];
864 1.13 lukem #endif /* VLNEXT */
865 1.13 lukem #ifdef VSTATUS
866 1.13 lukem td->c_cc[VSTATUS] = s[C_STATUS];
867 1.13 lukem #endif /* VSTATUS */
868 1.13 lukem #ifdef VPAGE
869 1.13 lukem td->c_cc[VPAGE] = s[C_PAGE];
870 1.13 lukem #endif /* VPAGE */
871 1.13 lukem #ifdef VPGOFF
872 1.13 lukem td->c_cc[VPGOFF] = s[C_PGOFF];
873 1.13 lukem #endif /* VPGOFF */
874 1.13 lukem #ifdef VKILL2
875 1.13 lukem td->c_cc[VKILL2] = s[C_KILL2];
876 1.13 lukem #endif /* VKILL2 */
877 1.13 lukem #ifdef VMIN
878 1.13 lukem td->c_cc[VMIN] = s[C_MIN];
879 1.13 lukem #endif /* VMIN */
880 1.13 lukem #ifdef VTIME
881 1.13 lukem td->c_cc[VTIME] = s[C_TIME];
882 1.13 lukem #endif /* VTIME */
883 1.13 lukem } /* tty__setchar */
884 1.1 cgd
885 1.1 cgd
886 1.1 cgd /* tty_bind_char():
887 1.1 cgd * Rebind the editline functions
888 1.1 cgd */
889 1.1 cgd protected void
890 1.13 lukem tty_bind_char(EditLine *el, int force)
891 1.1 cgd {
892 1.13 lukem
893 1.13 lukem unsigned char *t_n = el->el_tty.t_c[ED_IO];
894 1.13 lukem unsigned char *t_o = el->el_tty.t_ed.c_cc;
895 1.15 christos unsigned char new[2], old[2];
896 1.14 jdolecek const ttymap_t *tp;
897 1.14 jdolecek el_action_t *map, *alt;
898 1.14 jdolecek const el_action_t *dmap, *dalt;
899 1.13 lukem new[1] = old[1] = '\0';
900 1.13 lukem
901 1.13 lukem map = el->el_map.key;
902 1.13 lukem alt = el->el_map.alt;
903 1.13 lukem if (el->el_map.type == MAP_VI) {
904 1.13 lukem dmap = el->el_map.vii;
905 1.13 lukem dalt = el->el_map.vic;
906 1.13 lukem } else {
907 1.13 lukem dmap = el->el_map.emacs;
908 1.13 lukem dalt = NULL;
909 1.13 lukem }
910 1.13 lukem
911 1.13 lukem for (tp = tty_map; tp->nch != -1; tp++) {
912 1.13 lukem new[0] = t_n[tp->nch];
913 1.13 lukem old[0] = t_o[tp->och];
914 1.13 lukem if (new[0] == old[0] && !force)
915 1.13 lukem continue;
916 1.13 lukem /* Put the old default binding back, and set the new binding */
917 1.15 christos key_clear(el, map, (char *)old);
918 1.15 christos map[old[0]] = dmap[old[0]];
919 1.15 christos key_clear(el, map, (char *)new);
920 1.13 lukem /* MAP_VI == 1, MAP_EMACS == 0... */
921 1.15 christos map[new[0]] = tp->bind[el->el_map.type];
922 1.13 lukem if (dalt) {
923 1.15 christos key_clear(el, alt, (char *)old);
924 1.15 christos alt[old[0]] = dalt[old[0]];
925 1.15 christos key_clear(el, alt, (char *)new);
926 1.15 christos alt[new[0]] = tp->bind[el->el_map.type + 1];
927 1.13 lukem }
928 1.1 cgd }
929 1.1 cgd }
930 1.1 cgd
931 1.13 lukem
932 1.1 cgd /* tty_rawmode():
933 1.1 cgd * Set terminal into 1 character at a time mode.
934 1.1 cgd */
935 1.1 cgd protected int
936 1.13 lukem tty_rawmode(EditLine *el)
937 1.1 cgd {
938 1.1 cgd
939 1.13 lukem if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO)
940 1.13 lukem return (0);
941 1.13 lukem
942 1.13 lukem if (el->el_flags & EDIT_DISABLED)
943 1.13 lukem return (0);
944 1.12 sommerfe
945 1.13 lukem if (tty_getty(el, &el->el_tty.t_ts) == -1) {
946 1.1 cgd #ifdef DEBUG_TTY
947 1.13 lukem (void) fprintf(el->el_errfile, "tty_rawmode: tty_getty: %s\n",
948 1.13 lukem strerror(errno));
949 1.1 cgd #endif /* DEBUG_TTY */
950 1.13 lukem return (-1);
951 1.1 cgd }
952 1.13 lukem /*
953 1.13 lukem * We always keep up with the eight bit setting and the speed of the
954 1.13 lukem * tty. But only we only believe changes that are made to cooked mode!
955 1.13 lukem */
956 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts);
957 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts);
958 1.13 lukem
959 1.13 lukem if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed ||
960 1.13 lukem tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) {
961 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed);
962 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed);
963 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed);
964 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed);
965 1.1 cgd }
966 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) {
967 1.13 lukem if (el->el_tty.t_ts.c_cflag != el->el_tty.t_ex.c_cflag) {
968 1.13 lukem el->el_tty.t_ex.c_cflag =
969 1.13 lukem el->el_tty.t_ts.c_cflag;
970 1.13 lukem el->el_tty.t_ex.c_cflag &=
971 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_CTL].t_clrmask;
972 1.13 lukem el->el_tty.t_ex.c_cflag |=
973 1.13 lukem el->el_tty.t_t[EX_IO][MD_CTL].t_setmask;
974 1.13 lukem
975 1.13 lukem el->el_tty.t_ed.c_cflag =
976 1.13 lukem el->el_tty.t_ts.c_cflag;
977 1.13 lukem el->el_tty.t_ed.c_cflag &=
978 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_CTL].t_clrmask;
979 1.13 lukem el->el_tty.t_ed.c_cflag |=
980 1.13 lukem el->el_tty.t_t[ED_IO][MD_CTL].t_setmask;
981 1.13 lukem }
982 1.13 lukem if ((el->el_tty.t_ts.c_lflag != el->el_tty.t_ex.c_lflag) &&
983 1.13 lukem (el->el_tty.t_ts.c_lflag != el->el_tty.t_ed.c_lflag)) {
984 1.13 lukem el->el_tty.t_ex.c_lflag =
985 1.13 lukem el->el_tty.t_ts.c_lflag;
986 1.13 lukem el->el_tty.t_ex.c_lflag &=
987 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_LIN].t_clrmask;
988 1.13 lukem el->el_tty.t_ex.c_lflag |=
989 1.13 lukem el->el_tty.t_t[EX_IO][MD_LIN].t_setmask;
990 1.13 lukem
991 1.13 lukem el->el_tty.t_ed.c_lflag =
992 1.13 lukem el->el_tty.t_ts.c_lflag;
993 1.13 lukem el->el_tty.t_ed.c_lflag &=
994 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_LIN].t_clrmask;
995 1.13 lukem el->el_tty.t_ed.c_lflag |=
996 1.13 lukem el->el_tty.t_t[ED_IO][MD_LIN].t_setmask;
997 1.13 lukem }
998 1.13 lukem if ((el->el_tty.t_ts.c_iflag != el->el_tty.t_ex.c_iflag) &&
999 1.13 lukem (el->el_tty.t_ts.c_iflag != el->el_tty.t_ed.c_iflag)) {
1000 1.13 lukem el->el_tty.t_ex.c_iflag =
1001 1.13 lukem el->el_tty.t_ts.c_iflag;
1002 1.13 lukem el->el_tty.t_ex.c_iflag &=
1003 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_INP].t_clrmask;
1004 1.13 lukem el->el_tty.t_ex.c_iflag |=
1005 1.13 lukem el->el_tty.t_t[EX_IO][MD_INP].t_setmask;
1006 1.13 lukem
1007 1.13 lukem el->el_tty.t_ed.c_iflag =
1008 1.13 lukem el->el_tty.t_ts.c_iflag;
1009 1.13 lukem el->el_tty.t_ed.c_iflag &=
1010 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask;
1011 1.13 lukem el->el_tty.t_ed.c_iflag |=
1012 1.13 lukem el->el_tty.t_t[ED_IO][MD_INP].t_setmask;
1013 1.13 lukem }
1014 1.13 lukem if ((el->el_tty.t_ts.c_oflag != el->el_tty.t_ex.c_oflag) &&
1015 1.13 lukem (el->el_tty.t_ts.c_oflag != el->el_tty.t_ed.c_oflag)) {
1016 1.13 lukem el->el_tty.t_ex.c_oflag =
1017 1.13 lukem el->el_tty.t_ts.c_oflag;
1018 1.13 lukem el->el_tty.t_ex.c_oflag &=
1019 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_OUT].t_clrmask;
1020 1.13 lukem el->el_tty.t_ex.c_oflag |=
1021 1.13 lukem el->el_tty.t_t[EX_IO][MD_OUT].t_setmask;
1022 1.13 lukem
1023 1.13 lukem el->el_tty.t_ed.c_oflag =
1024 1.13 lukem el->el_tty.t_ts.c_oflag;
1025 1.13 lukem el->el_tty.t_ed.c_oflag &=
1026 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_OUT].t_clrmask;
1027 1.13 lukem el->el_tty.t_ed.c_oflag |=
1028 1.13 lukem el->el_tty.t_t[ED_IO][MD_OUT].t_setmask;
1029 1.13 lukem }
1030 1.13 lukem if (tty__gettabs(&el->el_tty.t_ex) == 0)
1031 1.13 lukem el->el_tty.t_tabs = 0;
1032 1.13 lukem else
1033 1.13 lukem el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0;
1034 1.1 cgd
1035 1.13 lukem {
1036 1.13 lukem int i;
1037 1.1 cgd
1038 1.13 lukem tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
1039 1.13 lukem /*
1040 1.13 lukem * Check if the user made any changes.
1041 1.13 lukem * If he did, then propagate the changes to the
1042 1.13 lukem * edit and execute data structures.
1043 1.13 lukem */
1044 1.13 lukem for (i = 0; i < C_NCC; i++)
1045 1.13 lukem if (el->el_tty.t_c[TS_IO][i] !=
1046 1.13 lukem el->el_tty.t_c[EX_IO][i])
1047 1.13 lukem break;
1048 1.13 lukem
1049 1.13 lukem if (i != C_NCC) {
1050 1.13 lukem /*
1051 1.13 lukem * Propagate changes only to the unprotected
1052 1.13 lukem * chars that have been modified just now.
1053 1.13 lukem */
1054 1.13 lukem for (i = 0; i < C_NCC; i++) {
1055 1.13 lukem if (!((el->el_tty.t_t[ED_IO][MD_CHAR].t_setmask & C_SH(i)))
1056 1.13 lukem && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i]))
1057 1.13 lukem el->el_tty.t_c[ED_IO][i] = el->el_tty.t_c[TS_IO][i];
1058 1.13 lukem if (el->el_tty.t_t[ED_IO][MD_CHAR].t_clrmask & C_SH(i))
1059 1.13 lukem el->el_tty.t_c[ED_IO][i] = el->el_tty.t_vdisable;
1060 1.13 lukem }
1061 1.13 lukem tty_bind_char(el, 0);
1062 1.13 lukem tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
1063 1.13 lukem
1064 1.13 lukem for (i = 0; i < C_NCC; i++) {
1065 1.13 lukem if (!((el->el_tty.t_t[EX_IO][MD_CHAR].t_setmask & C_SH(i)))
1066 1.13 lukem && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i]))
1067 1.13 lukem el->el_tty.t_c[EX_IO][i] = el->el_tty.t_c[TS_IO][i];
1068 1.13 lukem if (el->el_tty.t_t[EX_IO][MD_CHAR].t_clrmask & C_SH(i))
1069 1.13 lukem el->el_tty.t_c[EX_IO][i] = el->el_tty.t_vdisable;
1070 1.13 lukem }
1071 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
1072 1.13 lukem }
1073 1.1 cgd }
1074 1.1 cgd }
1075 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
1076 1.1 cgd #ifdef DEBUG_TTY
1077 1.13 lukem (void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n",
1078 1.13 lukem strerror(errno));
1079 1.1 cgd #endif /* DEBUG_TTY */
1080 1.13 lukem return (-1);
1081 1.13 lukem }
1082 1.13 lukem el->el_tty.t_mode = ED_IO;
1083 1.13 lukem return (0);
1084 1.13 lukem }
1085 1.1 cgd
1086 1.1 cgd
1087 1.1 cgd /* tty_cookedmode():
1088 1.1 cgd * Set the tty back to normal mode
1089 1.1 cgd */
1090 1.1 cgd protected int
1091 1.13 lukem tty_cookedmode(EditLine *el)
1092 1.1 cgd { /* set tty in normal setup */
1093 1.1 cgd
1094 1.13 lukem if (el->el_tty.t_mode == EX_IO)
1095 1.13 lukem return (0);
1096 1.13 lukem
1097 1.13 lukem if (el->el_flags & EDIT_DISABLED)
1098 1.13 lukem return (0);
1099 1.13 lukem
1100 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) {
1101 1.1 cgd #ifdef DEBUG_TTY
1102 1.13 lukem (void) fprintf(el->el_errfile,
1103 1.13 lukem "tty_cookedmode: tty_setty: %s\n",
1104 1.13 lukem strerror(errno));
1105 1.1 cgd #endif /* DEBUG_TTY */
1106 1.13 lukem return (-1);
1107 1.13 lukem }
1108 1.13 lukem el->el_tty.t_mode = EX_IO;
1109 1.13 lukem return (0);
1110 1.13 lukem }
1111 1.1 cgd
1112 1.1 cgd
1113 1.1 cgd /* tty_quotemode():
1114 1.1 cgd * Turn on quote mode
1115 1.1 cgd */
1116 1.1 cgd protected int
1117 1.13 lukem tty_quotemode(EditLine *el)
1118 1.1 cgd {
1119 1.13 lukem if (el->el_tty.t_mode == QU_IO)
1120 1.13 lukem return (0);
1121 1.1 cgd
1122 1.13 lukem el->el_tty.t_qu = el->el_tty.t_ed;
1123 1.1 cgd
1124 1.13 lukem el->el_tty.t_qu.c_iflag &= ~el->el_tty.t_t[QU_IO][MD_INP].t_clrmask;
1125 1.13 lukem el->el_tty.t_qu.c_iflag |= el->el_tty.t_t[QU_IO][MD_INP].t_setmask;
1126 1.1 cgd
1127 1.13 lukem el->el_tty.t_qu.c_oflag &= ~el->el_tty.t_t[QU_IO][MD_OUT].t_clrmask;
1128 1.13 lukem el->el_tty.t_qu.c_oflag |= el->el_tty.t_t[QU_IO][MD_OUT].t_setmask;
1129 1.1 cgd
1130 1.13 lukem el->el_tty.t_qu.c_cflag &= ~el->el_tty.t_t[QU_IO][MD_CTL].t_clrmask;
1131 1.13 lukem el->el_tty.t_qu.c_cflag |= el->el_tty.t_t[QU_IO][MD_CTL].t_setmask;
1132 1.1 cgd
1133 1.13 lukem el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][MD_LIN].t_clrmask;
1134 1.13 lukem el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][MD_LIN].t_setmask;
1135 1.1 cgd
1136 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) {
1137 1.1 cgd #ifdef DEBUG_TTY
1138 1.13 lukem (void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n",
1139 1.13 lukem strerror(errno));
1140 1.1 cgd #endif /* DEBUG_TTY */
1141 1.13 lukem return (-1);
1142 1.13 lukem }
1143 1.13 lukem el->el_tty.t_mode = QU_IO;
1144 1.13 lukem return (0);
1145 1.13 lukem }
1146 1.1 cgd
1147 1.1 cgd
1148 1.1 cgd /* tty_noquotemode():
1149 1.1 cgd * Turn off quote mode
1150 1.1 cgd */
1151 1.1 cgd protected int
1152 1.13 lukem tty_noquotemode(EditLine *el)
1153 1.1 cgd {
1154 1.13 lukem
1155 1.13 lukem if (el->el_tty.t_mode != QU_IO)
1156 1.13 lukem return (0);
1157 1.26 christos if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) {
1158 1.1 cgd #ifdef DEBUG_TTY
1159 1.13 lukem (void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n",
1160 1.13 lukem strerror(errno));
1161 1.1 cgd #endif /* DEBUG_TTY */
1162 1.13 lukem return (-1);
1163 1.13 lukem }
1164 1.13 lukem el->el_tty.t_mode = ED_IO;
1165 1.13 lukem return (0);
1166 1.1 cgd }
1167 1.1 cgd
1168 1.13 lukem
1169 1.1 cgd /* tty_stty():
1170 1.1 cgd * Stty builtin
1171 1.1 cgd */
1172 1.1 cgd protected int
1173 1.1 cgd /*ARGSUSED*/
1174 1.17 christos tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
1175 1.1 cgd {
1176 1.14 jdolecek const ttymodes_t *m;
1177 1.16 christos char x;
1178 1.13 lukem int aflag = 0;
1179 1.16 christos const char *s, *d;
1180 1.16 christos const char *name;
1181 1.19 christos struct termios *tios = &el->el_tty.t_ex;
1182 1.13 lukem int z = EX_IO;
1183 1.13 lukem
1184 1.13 lukem if (argv == NULL)
1185 1.13 lukem return (-1);
1186 1.13 lukem name = *argv++;
1187 1.13 lukem
1188 1.13 lukem while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0')
1189 1.13 lukem switch (argv[0][1]) {
1190 1.13 lukem case 'a':
1191 1.13 lukem aflag++;
1192 1.13 lukem argv++;
1193 1.13 lukem break;
1194 1.13 lukem case 'd':
1195 1.13 lukem argv++;
1196 1.19 christos tios = &el->el_tty.t_ed;
1197 1.13 lukem z = ED_IO;
1198 1.13 lukem break;
1199 1.13 lukem case 'x':
1200 1.13 lukem argv++;
1201 1.19 christos tios = &el->el_tty.t_ex;
1202 1.13 lukem z = EX_IO;
1203 1.13 lukem break;
1204 1.13 lukem case 'q':
1205 1.13 lukem argv++;
1206 1.19 christos tios = &el->el_tty.t_ts;
1207 1.13 lukem z = QU_IO;
1208 1.13 lukem break;
1209 1.13 lukem default:
1210 1.13 lukem (void) fprintf(el->el_errfile,
1211 1.13 lukem "%s: Unknown switch `%c'.\n",
1212 1.13 lukem name, argv[0][1]);
1213 1.13 lukem return (-1);
1214 1.13 lukem }
1215 1.1 cgd
1216 1.13 lukem if (!argv || !*argv) {
1217 1.13 lukem int i = -1;
1218 1.13 lukem int len = 0, st = 0, cu;
1219 1.13 lukem for (m = ttymodes; m->m_name; m++) {
1220 1.13 lukem if (m->m_type != i) {
1221 1.13 lukem (void) fprintf(el->el_outfile, "%s%s",
1222 1.13 lukem i != -1 ? "\n" : "",
1223 1.13 lukem el->el_tty.t_t[z][m->m_type].t_name);
1224 1.13 lukem i = m->m_type;
1225 1.13 lukem st = len =
1226 1.13 lukem strlen(el->el_tty.t_t[z][m->m_type].t_name);
1227 1.13 lukem }
1228 1.24 christos if (i != -1) {
1229 1.24 christos x = (el->el_tty.t_t[z][i].t_setmask & m->m_value)
1230 1.24 christos ? '+' : '\0';
1231 1.24 christos x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value)
1232 1.24 christos ? '-' : x;
1233 1.24 christos } else {
1234 1.24 christos x = '\0';
1235 1.24 christos }
1236 1.13 lukem
1237 1.13 lukem if (x != '\0' || aflag) {
1238 1.13 lukem
1239 1.13 lukem cu = strlen(m->m_name) + (x != '\0') + 1;
1240 1.13 lukem
1241 1.13 lukem if (len + cu >= el->el_term.t_size.h) {
1242 1.13 lukem (void) fprintf(el->el_outfile, "\n%*s",
1243 1.13 lukem st, "");
1244 1.13 lukem len = st + cu;
1245 1.13 lukem } else
1246 1.13 lukem len += cu;
1247 1.13 lukem
1248 1.13 lukem if (x != '\0')
1249 1.13 lukem (void) fprintf(el->el_outfile, "%c%s ",
1250 1.13 lukem x, m->m_name);
1251 1.13 lukem else
1252 1.13 lukem (void) fprintf(el->el_outfile, "%s ",
1253 1.13 lukem m->m_name);
1254 1.13 lukem }
1255 1.1 cgd }
1256 1.13 lukem (void) fprintf(el->el_outfile, "\n");
1257 1.13 lukem return (0);
1258 1.1 cgd }
1259 1.13 lukem while (argv && (s = *argv++)) {
1260 1.22 christos const char *p;
1261 1.13 lukem switch (*s) {
1262 1.13 lukem case '+':
1263 1.13 lukem case '-':
1264 1.13 lukem x = *s++;
1265 1.13 lukem break;
1266 1.13 lukem default:
1267 1.13 lukem x = '\0';
1268 1.13 lukem break;
1269 1.13 lukem }
1270 1.13 lukem d = s;
1271 1.22 christos p = strchr(s, '=');
1272 1.13 lukem for (m = ttymodes; m->m_name; m++)
1273 1.22 christos if ((p ? strncmp(m->m_name, d, (size_t)(p - d)) :
1274 1.22 christos strcmp(m->m_name, d)) == 0 &&
1275 1.19 christos (p == NULL || m->m_type == MD_CHAR))
1276 1.13 lukem break;
1277 1.13 lukem
1278 1.13 lukem if (!m->m_name) {
1279 1.13 lukem (void) fprintf(el->el_errfile,
1280 1.13 lukem "%s: Invalid argument `%s'.\n", name, d);
1281 1.13 lukem return (-1);
1282 1.19 christos }
1283 1.19 christos if (p) {
1284 1.19 christos int c = ffs((int)m->m_value);
1285 1.22 christos int v = *++p ? parse__escape((const char **) &p) :
1286 1.19 christos el->el_tty.t_vdisable;
1287 1.19 christos assert(c-- != 0);
1288 1.19 christos c = tty__getcharindex(c);
1289 1.19 christos assert(c != -1);
1290 1.19 christos tios->c_cc[c] = v;
1291 1.19 christos continue;
1292 1.13 lukem }
1293 1.13 lukem switch (x) {
1294 1.13 lukem case '+':
1295 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;
1296 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
1297 1.13 lukem break;
1298 1.13 lukem case '-':
1299 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
1300 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value;
1301 1.13 lukem break;
1302 1.13 lukem default:
1303 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
1304 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
1305 1.13 lukem break;
1306 1.13 lukem }
1307 1.1 cgd }
1308 1.27 christos
1309 1.27 christos if (el->el_tty.t_mode == z) {
1310 1.27 christos if (tty_setty(el, TCSADRAIN, tios) == -1) {
1311 1.27 christos #ifdef DEBUG_TTY
1312 1.27 christos (void) fprintf(el->el_errfile,
1313 1.27 christos "tty_stty: tty_setty: %s\n", strerror(errno));
1314 1.27 christos #endif /* DEBUG_TTY */
1315 1.27 christos return (-1);
1316 1.27 christos }
1317 1.27 christos }
1318 1.27 christos
1319 1.13 lukem return (0);
1320 1.13 lukem }
1321 1.1 cgd
1322 1.1 cgd
1323 1.1 cgd #ifdef notyet
1324 1.1 cgd /* tty_printchar():
1325 1.1 cgd * DEbugging routine to print the tty characters
1326 1.1 cgd */
1327 1.1 cgd private void
1328 1.13 lukem tty_printchar(EditLine *el, unsigned char *s)
1329 1.1 cgd {
1330 1.13 lukem ttyperm_t *m;
1331 1.13 lukem int i;
1332 1.1 cgd
1333 1.13 lukem for (i = 0; i < C_NCC; i++) {
1334 1.13 lukem for (m = el->el_tty.t_t; m->m_name; m++)
1335 1.13 lukem if (m->m_type == MD_CHAR && C_SH(i) == m->m_value)
1336 1.13 lukem break;
1337 1.13 lukem if (m->m_name)
1338 1.13 lukem (void) fprintf(el->el_errfile, "%s ^%c ",
1339 1.13 lukem m->m_name, s[i] + 'A' - 1);
1340 1.13 lukem if (i % 5 == 0)
1341 1.13 lukem (void) fprintf(el->el_errfile, "\n");
1342 1.13 lukem }
1343 1.13 lukem (void) fprintf(el->el_errfile, "\n");
1344 1.1 cgd }
1345 1.1 cgd #endif /* notyet */
1346