tty.c revision 1.23 1 1.23 lukem /* $NetBSD: tty.c,v 1.23 2005/06/01 11:37:52 lukem 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.23 lukem __RCSID("$NetBSD: tty.c,v 1.23 2005/06/01 11:37:52 lukem 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_getty(el, td) tcgetattr((el)->el_infd, (td))
449 1.13 lukem #define tty_setty(el, td) tcsetattr((el)->el_infd, TCSADRAIN, (td))
450 1.1 cgd
451 1.13 lukem #define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1)
452 1.13 lukem #define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
453 1.13 lukem #define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
454 1.13 lukem
455 1.19 christos private int tty__getcharindex(int);
456 1.13 lukem private void tty__getchar(struct termios *, unsigned char *);
457 1.13 lukem private void tty__setchar(struct termios *, unsigned char *);
458 1.13 lukem private speed_t tty__getspeed(struct termios *);
459 1.13 lukem private int tty_setup(EditLine *);
460 1.1 cgd
461 1.13 lukem #define t_qu t_ts
462 1.1 cgd
463 1.1 cgd
464 1.1 cgd /* tty_setup():
465 1.1 cgd * Get the tty parameters and initialize the editing state
466 1.1 cgd */
467 1.11 simonb private int
468 1.13 lukem tty_setup(EditLine *el)
469 1.1 cgd {
470 1.13 lukem int rst = 1;
471 1.12 sommerfe
472 1.13 lukem if (el->el_flags & EDIT_DISABLED)
473 1.13 lukem return (0);
474 1.13 lukem
475 1.13 lukem if (tty_getty(el, &el->el_tty.t_ed) == -1) {
476 1.1 cgd #ifdef DEBUG_TTY
477 1.13 lukem (void) fprintf(el->el_errfile,
478 1.13 lukem "tty_setup: tty_getty: %s\n", strerror(errno));
479 1.1 cgd #endif /* DEBUG_TTY */
480 1.13 lukem return (-1);
481 1.13 lukem }
482 1.13 lukem el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed;
483 1.13 lukem
484 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex);
485 1.13 lukem el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex);
486 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex);
487 1.13 lukem
488 1.13 lukem el->el_tty.t_ex.c_iflag &= ~el->el_tty.t_t[EX_IO][MD_INP].t_clrmask;
489 1.13 lukem el->el_tty.t_ex.c_iflag |= el->el_tty.t_t[EX_IO][MD_INP].t_setmask;
490 1.13 lukem
491 1.13 lukem el->el_tty.t_ex.c_oflag &= ~el->el_tty.t_t[EX_IO][MD_OUT].t_clrmask;
492 1.13 lukem el->el_tty.t_ex.c_oflag |= el->el_tty.t_t[EX_IO][MD_OUT].t_setmask;
493 1.13 lukem
494 1.13 lukem el->el_tty.t_ex.c_cflag &= ~el->el_tty.t_t[EX_IO][MD_CTL].t_clrmask;
495 1.13 lukem el->el_tty.t_ex.c_cflag |= el->el_tty.t_t[EX_IO][MD_CTL].t_setmask;
496 1.13 lukem
497 1.13 lukem el->el_tty.t_ex.c_lflag &= ~el->el_tty.t_t[EX_IO][MD_LIN].t_clrmask;
498 1.13 lukem el->el_tty.t_ex.c_lflag |= el->el_tty.t_t[EX_IO][MD_LIN].t_setmask;
499 1.13 lukem
500 1.13 lukem /*
501 1.13 lukem * Reset the tty chars to reasonable defaults
502 1.13 lukem * If they are disabled, then enable them.
503 1.13 lukem */
504 1.13 lukem if (rst) {
505 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) {
506 1.13 lukem tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
507 1.13 lukem /*
508 1.13 lukem * Don't affect CMIN and CTIME for the editor mode
509 1.13 lukem */
510 1.13 lukem for (rst = 0; rst < C_NCC - 2; rst++)
511 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] !=
512 1.13 lukem el->el_tty.t_vdisable
513 1.13 lukem && el->el_tty.t_c[ED_IO][rst] !=
514 1.13 lukem el->el_tty.t_vdisable)
515 1.13 lukem el->el_tty.t_c[ED_IO][rst] =
516 1.13 lukem el->el_tty.t_c[TS_IO][rst];
517 1.13 lukem for (rst = 0; rst < C_NCC; rst++)
518 1.13 lukem if (el->el_tty.t_c[TS_IO][rst] !=
519 1.13 lukem el->el_tty.t_vdisable)
520 1.13 lukem el->el_tty.t_c[EX_IO][rst] =
521 1.13 lukem el->el_tty.t_c[TS_IO][rst];
522 1.13 lukem }
523 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
524 1.13 lukem if (tty_setty(el, &el->el_tty.t_ex) == -1) {
525 1.1 cgd #ifdef DEBUG_TTY
526 1.13 lukem (void) fprintf(el->el_errfile,
527 1.13 lukem "tty_setup: tty_setty: %s\n",
528 1.13 lukem strerror(errno));
529 1.1 cgd #endif /* DEBUG_TTY */
530 1.13 lukem return (-1);
531 1.13 lukem }
532 1.13 lukem } else
533 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
534 1.13 lukem
535 1.13 lukem el->el_tty.t_ed.c_iflag &= ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask;
536 1.13 lukem el->el_tty.t_ed.c_iflag |= el->el_tty.t_t[ED_IO][MD_INP].t_setmask;
537 1.13 lukem
538 1.13 lukem el->el_tty.t_ed.c_oflag &= ~el->el_tty.t_t[ED_IO][MD_OUT].t_clrmask;
539 1.13 lukem el->el_tty.t_ed.c_oflag |= el->el_tty.t_t[ED_IO][MD_OUT].t_setmask;
540 1.13 lukem
541 1.13 lukem el->el_tty.t_ed.c_cflag &= ~el->el_tty.t_t[ED_IO][MD_CTL].t_clrmask;
542 1.13 lukem el->el_tty.t_ed.c_cflag |= el->el_tty.t_t[ED_IO][MD_CTL].t_setmask;
543 1.13 lukem
544 1.13 lukem el->el_tty.t_ed.c_lflag &= ~el->el_tty.t_t[ED_IO][MD_LIN].t_clrmask;
545 1.13 lukem el->el_tty.t_ed.c_lflag |= el->el_tty.t_t[ED_IO][MD_LIN].t_setmask;
546 1.13 lukem
547 1.13 lukem tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
548 1.13 lukem tty_bind_char(el, 1);
549 1.13 lukem return (0);
550 1.1 cgd }
551 1.1 cgd
552 1.1 cgd protected int
553 1.13 lukem tty_init(EditLine *el)
554 1.1 cgd {
555 1.13 lukem
556 1.13 lukem el->el_tty.t_mode = EX_IO;
557 1.13 lukem el->el_tty.t_vdisable = _POSIX_VDISABLE;
558 1.13 lukem (void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t));
559 1.13 lukem (void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t));
560 1.13 lukem return (tty_setup(el));
561 1.13 lukem }
562 1.1 cgd
563 1.1 cgd
564 1.1 cgd /* tty_end():
565 1.1 cgd * Restore the tty to its original settings
566 1.1 cgd */
567 1.1 cgd protected void
568 1.1 cgd /*ARGSUSED*/
569 1.17 christos tty_end(EditLine *el __attribute__((__unused__)))
570 1.1 cgd {
571 1.13 lukem
572 1.13 lukem /* XXX: Maybe reset to an initial state? */
573 1.1 cgd }
574 1.1 cgd
575 1.1 cgd
576 1.1 cgd /* tty__getspeed():
577 1.1 cgd * Get the tty speed
578 1.1 cgd */
579 1.1 cgd private speed_t
580 1.13 lukem tty__getspeed(struct termios *td)
581 1.1 cgd {
582 1.13 lukem speed_t spd;
583 1.1 cgd
584 1.13 lukem if ((spd = cfgetispeed(td)) == 0)
585 1.13 lukem spd = cfgetospeed(td);
586 1.13 lukem return (spd);
587 1.13 lukem }
588 1.1 cgd
589 1.19 christos /* tty__getspeed():
590 1.19 christos * Return the index of the asked char in the c_cc array
591 1.19 christos */
592 1.19 christos private int
593 1.19 christos tty__getcharindex(int i)
594 1.19 christos {
595 1.19 christos switch (i) {
596 1.19 christos #ifdef VINTR
597 1.19 christos case C_INTR:
598 1.19 christos return VINTR;
599 1.19 christos #endif /* VINTR */
600 1.19 christos #ifdef VQUIT
601 1.19 christos case C_QUIT:
602 1.19 christos return VQUIT;
603 1.19 christos #endif /* VQUIT */
604 1.19 christos #ifdef VERASE
605 1.19 christos case C_ERASE:
606 1.19 christos return VERASE;
607 1.19 christos #endif /* VERASE */
608 1.19 christos #ifdef VKILL
609 1.19 christos case C_KILL:
610 1.19 christos return VKILL;
611 1.19 christos #endif /* VKILL */
612 1.19 christos #ifdef VEOF
613 1.19 christos case C_EOF:
614 1.19 christos return VEOF;
615 1.19 christos #endif /* VEOF */
616 1.19 christos #ifdef VEOL
617 1.19 christos case C_EOL:
618 1.19 christos return VEOL;
619 1.19 christos #endif /* VEOL */
620 1.19 christos #ifdef VEOL2
621 1.19 christos case C_EOL2:
622 1.19 christos return VEOL2;
623 1.19 christos #endif /* VEOL2 */
624 1.19 christos #ifdef VSWTCH
625 1.19 christos case C_SWTCH:
626 1.19 christos return VSWTCH;
627 1.19 christos #endif /* VSWTCH */
628 1.19 christos #ifdef VDSWTCH
629 1.19 christos case C_DSWTCH:
630 1.19 christos return VDSWTCH;
631 1.19 christos #endif /* VDSWTCH */
632 1.19 christos #ifdef VERASE2
633 1.19 christos case C_ERASE2:
634 1.19 christos return VERASE2;
635 1.19 christos #endif /* VERASE2 */
636 1.19 christos #ifdef VSTART
637 1.19 christos case C_START:
638 1.19 christos return VSTART;
639 1.19 christos #endif /* VSTART */
640 1.19 christos #ifdef VSTOP
641 1.19 christos case C_STOP:
642 1.19 christos return VSTOP;
643 1.19 christos #endif /* VSTOP */
644 1.19 christos #ifdef VWERASE
645 1.19 christos case C_WERASE:
646 1.19 christos return VWERASE;
647 1.19 christos #endif /* VWERASE */
648 1.19 christos #ifdef VSUSP
649 1.19 christos case C_SUSP:
650 1.19 christos return VSUSP;
651 1.19 christos #endif /* VSUSP */
652 1.19 christos #ifdef VDSUSP
653 1.19 christos case C_DSUSP:
654 1.19 christos return VDSUSP;
655 1.19 christos #endif /* VDSUSP */
656 1.19 christos #ifdef VREPRINT
657 1.19 christos case C_REPRINT:
658 1.19 christos return VREPRINT;
659 1.19 christos #endif /* VREPRINT */
660 1.19 christos #ifdef VDISCARD
661 1.19 christos case C_DISCARD:
662 1.19 christos return VDISCARD;
663 1.19 christos #endif /* VDISCARD */
664 1.19 christos #ifdef VLNEXT
665 1.19 christos case C_LNEXT:
666 1.19 christos return VLNEXT;
667 1.19 christos #endif /* VLNEXT */
668 1.19 christos #ifdef VSTATUS
669 1.19 christos case C_STATUS:
670 1.19 christos return VSTATUS;
671 1.19 christos #endif /* VSTATUS */
672 1.19 christos #ifdef VPAGE
673 1.19 christos case C_PAGE:
674 1.19 christos return VPAGE;
675 1.19 christos #endif /* VPAGE */
676 1.19 christos #ifdef VPGOFF
677 1.19 christos case C_PGOFF:
678 1.19 christos return VPGOFF;
679 1.19 christos #endif /* VPGOFF */
680 1.19 christos #ifdef VKILL2
681 1.19 christos case C_KILL2:
682 1.19 christos return VKILL2;
683 1.19 christos #endif /* KILL2 */
684 1.19 christos #ifdef VMIN
685 1.19 christos case C_MIN:
686 1.19 christos return VMIN;
687 1.19 christos #endif /* VMIN */
688 1.19 christos #ifdef VTIME
689 1.19 christos case C_TIME:
690 1.19 christos return VTIME;
691 1.19 christos #endif /* VTIME */
692 1.19 christos default:
693 1.19 christos return -1;
694 1.19 christos }
695 1.19 christos }
696 1.1 cgd
697 1.1 cgd /* tty__getchar():
698 1.1 cgd * Get the tty characters
699 1.1 cgd */
700 1.1 cgd private void
701 1.13 lukem tty__getchar(struct termios *td, unsigned char *s)
702 1.11 simonb {
703 1.13 lukem
704 1.13 lukem #ifdef VINTR
705 1.13 lukem s[C_INTR] = td->c_cc[VINTR];
706 1.13 lukem #endif /* VINTR */
707 1.13 lukem #ifdef VQUIT
708 1.13 lukem s[C_QUIT] = td->c_cc[VQUIT];
709 1.13 lukem #endif /* VQUIT */
710 1.13 lukem #ifdef VERASE
711 1.13 lukem s[C_ERASE] = td->c_cc[VERASE];
712 1.13 lukem #endif /* VERASE */
713 1.13 lukem #ifdef VKILL
714 1.13 lukem s[C_KILL] = td->c_cc[VKILL];
715 1.13 lukem #endif /* VKILL */
716 1.13 lukem #ifdef VEOF
717 1.13 lukem s[C_EOF] = td->c_cc[VEOF];
718 1.13 lukem #endif /* VEOF */
719 1.13 lukem #ifdef VEOL
720 1.13 lukem s[C_EOL] = td->c_cc[VEOL];
721 1.13 lukem #endif /* VEOL */
722 1.13 lukem #ifdef VEOL2
723 1.13 lukem s[C_EOL2] = td->c_cc[VEOL2];
724 1.13 lukem #endif /* VEOL2 */
725 1.13 lukem #ifdef VSWTCH
726 1.13 lukem s[C_SWTCH] = td->c_cc[VSWTCH];
727 1.13 lukem #endif /* VSWTCH */
728 1.13 lukem #ifdef VDSWTCH
729 1.13 lukem s[C_DSWTCH] = td->c_cc[VDSWTCH];
730 1.13 lukem #endif /* VDSWTCH */
731 1.13 lukem #ifdef VERASE2
732 1.13 lukem s[C_ERASE2] = td->c_cc[VERASE2];
733 1.13 lukem #endif /* VERASE2 */
734 1.13 lukem #ifdef VSTART
735 1.13 lukem s[C_START] = td->c_cc[VSTART];
736 1.13 lukem #endif /* VSTART */
737 1.13 lukem #ifdef VSTOP
738 1.13 lukem s[C_STOP] = td->c_cc[VSTOP];
739 1.13 lukem #endif /* VSTOP */
740 1.13 lukem #ifdef VWERASE
741 1.13 lukem s[C_WERASE] = td->c_cc[VWERASE];
742 1.13 lukem #endif /* VWERASE */
743 1.13 lukem #ifdef VSUSP
744 1.13 lukem s[C_SUSP] = td->c_cc[VSUSP];
745 1.13 lukem #endif /* VSUSP */
746 1.13 lukem #ifdef VDSUSP
747 1.13 lukem s[C_DSUSP] = td->c_cc[VDSUSP];
748 1.13 lukem #endif /* VDSUSP */
749 1.13 lukem #ifdef VREPRINT
750 1.13 lukem s[C_REPRINT] = td->c_cc[VREPRINT];
751 1.13 lukem #endif /* VREPRINT */
752 1.13 lukem #ifdef VDISCARD
753 1.13 lukem s[C_DISCARD] = td->c_cc[VDISCARD];
754 1.13 lukem #endif /* VDISCARD */
755 1.13 lukem #ifdef VLNEXT
756 1.13 lukem s[C_LNEXT] = td->c_cc[VLNEXT];
757 1.13 lukem #endif /* VLNEXT */
758 1.13 lukem #ifdef VSTATUS
759 1.13 lukem s[C_STATUS] = td->c_cc[VSTATUS];
760 1.13 lukem #endif /* VSTATUS */
761 1.13 lukem #ifdef VPAGE
762 1.13 lukem s[C_PAGE] = td->c_cc[VPAGE];
763 1.13 lukem #endif /* VPAGE */
764 1.13 lukem #ifdef VPGOFF
765 1.13 lukem s[C_PGOFF] = td->c_cc[VPGOFF];
766 1.13 lukem #endif /* VPGOFF */
767 1.13 lukem #ifdef VKILL2
768 1.13 lukem s[C_KILL2] = td->c_cc[VKILL2];
769 1.13 lukem #endif /* KILL2 */
770 1.13 lukem #ifdef VMIN
771 1.13 lukem s[C_MIN] = td->c_cc[VMIN];
772 1.13 lukem #endif /* VMIN */
773 1.13 lukem #ifdef VTIME
774 1.13 lukem s[C_TIME] = td->c_cc[VTIME];
775 1.13 lukem #endif /* VTIME */
776 1.13 lukem } /* tty__getchar */
777 1.1 cgd
778 1.1 cgd
779 1.1 cgd /* tty__setchar():
780 1.1 cgd * Set the tty characters
781 1.1 cgd */
782 1.1 cgd private void
783 1.13 lukem tty__setchar(struct termios *td, unsigned char *s)
784 1.11 simonb {
785 1.13 lukem
786 1.13 lukem #ifdef VINTR
787 1.13 lukem td->c_cc[VINTR] = s[C_INTR];
788 1.13 lukem #endif /* VINTR */
789 1.13 lukem #ifdef VQUIT
790 1.13 lukem td->c_cc[VQUIT] = s[C_QUIT];
791 1.13 lukem #endif /* VQUIT */
792 1.13 lukem #ifdef VERASE
793 1.13 lukem td->c_cc[VERASE] = s[C_ERASE];
794 1.13 lukem #endif /* VERASE */
795 1.13 lukem #ifdef VKILL
796 1.13 lukem td->c_cc[VKILL] = s[C_KILL];
797 1.13 lukem #endif /* VKILL */
798 1.13 lukem #ifdef VEOF
799 1.13 lukem td->c_cc[VEOF] = s[C_EOF];
800 1.13 lukem #endif /* VEOF */
801 1.13 lukem #ifdef VEOL
802 1.13 lukem td->c_cc[VEOL] = s[C_EOL];
803 1.13 lukem #endif /* VEOL */
804 1.13 lukem #ifdef VEOL2
805 1.13 lukem td->c_cc[VEOL2] = s[C_EOL2];
806 1.13 lukem #endif /* VEOL2 */
807 1.13 lukem #ifdef VSWTCH
808 1.13 lukem td->c_cc[VSWTCH] = s[C_SWTCH];
809 1.13 lukem #endif /* VSWTCH */
810 1.13 lukem #ifdef VDSWTCH
811 1.13 lukem td->c_cc[VDSWTCH] = s[C_DSWTCH];
812 1.13 lukem #endif /* VDSWTCH */
813 1.13 lukem #ifdef VERASE2
814 1.13 lukem td->c_cc[VERASE2] = s[C_ERASE2];
815 1.13 lukem #endif /* VERASE2 */
816 1.13 lukem #ifdef VSTART
817 1.13 lukem td->c_cc[VSTART] = s[C_START];
818 1.13 lukem #endif /* VSTART */
819 1.13 lukem #ifdef VSTOP
820 1.13 lukem td->c_cc[VSTOP] = s[C_STOP];
821 1.13 lukem #endif /* VSTOP */
822 1.13 lukem #ifdef VWERASE
823 1.13 lukem td->c_cc[VWERASE] = s[C_WERASE];
824 1.13 lukem #endif /* VWERASE */
825 1.13 lukem #ifdef VSUSP
826 1.13 lukem td->c_cc[VSUSP] = s[C_SUSP];
827 1.13 lukem #endif /* VSUSP */
828 1.13 lukem #ifdef VDSUSP
829 1.13 lukem td->c_cc[VDSUSP] = s[C_DSUSP];
830 1.13 lukem #endif /* VDSUSP */
831 1.13 lukem #ifdef VREPRINT
832 1.13 lukem td->c_cc[VREPRINT] = s[C_REPRINT];
833 1.13 lukem #endif /* VREPRINT */
834 1.13 lukem #ifdef VDISCARD
835 1.13 lukem td->c_cc[VDISCARD] = s[C_DISCARD];
836 1.13 lukem #endif /* VDISCARD */
837 1.13 lukem #ifdef VLNEXT
838 1.13 lukem td->c_cc[VLNEXT] = s[C_LNEXT];
839 1.13 lukem #endif /* VLNEXT */
840 1.13 lukem #ifdef VSTATUS
841 1.13 lukem td->c_cc[VSTATUS] = s[C_STATUS];
842 1.13 lukem #endif /* VSTATUS */
843 1.13 lukem #ifdef VPAGE
844 1.13 lukem td->c_cc[VPAGE] = s[C_PAGE];
845 1.13 lukem #endif /* VPAGE */
846 1.13 lukem #ifdef VPGOFF
847 1.13 lukem td->c_cc[VPGOFF] = s[C_PGOFF];
848 1.13 lukem #endif /* VPGOFF */
849 1.13 lukem #ifdef VKILL2
850 1.13 lukem td->c_cc[VKILL2] = s[C_KILL2];
851 1.13 lukem #endif /* VKILL2 */
852 1.13 lukem #ifdef VMIN
853 1.13 lukem td->c_cc[VMIN] = s[C_MIN];
854 1.13 lukem #endif /* VMIN */
855 1.13 lukem #ifdef VTIME
856 1.13 lukem td->c_cc[VTIME] = s[C_TIME];
857 1.13 lukem #endif /* VTIME */
858 1.13 lukem } /* tty__setchar */
859 1.1 cgd
860 1.1 cgd
861 1.1 cgd /* tty_bind_char():
862 1.1 cgd * Rebind the editline functions
863 1.1 cgd */
864 1.1 cgd protected void
865 1.13 lukem tty_bind_char(EditLine *el, int force)
866 1.1 cgd {
867 1.13 lukem
868 1.13 lukem unsigned char *t_n = el->el_tty.t_c[ED_IO];
869 1.13 lukem unsigned char *t_o = el->el_tty.t_ed.c_cc;
870 1.15 christos unsigned char new[2], old[2];
871 1.14 jdolecek const ttymap_t *tp;
872 1.14 jdolecek el_action_t *map, *alt;
873 1.14 jdolecek const el_action_t *dmap, *dalt;
874 1.13 lukem new[1] = old[1] = '\0';
875 1.13 lukem
876 1.13 lukem map = el->el_map.key;
877 1.13 lukem alt = el->el_map.alt;
878 1.13 lukem if (el->el_map.type == MAP_VI) {
879 1.13 lukem dmap = el->el_map.vii;
880 1.13 lukem dalt = el->el_map.vic;
881 1.13 lukem } else {
882 1.13 lukem dmap = el->el_map.emacs;
883 1.13 lukem dalt = NULL;
884 1.13 lukem }
885 1.13 lukem
886 1.13 lukem for (tp = tty_map; tp->nch != -1; tp++) {
887 1.13 lukem new[0] = t_n[tp->nch];
888 1.13 lukem old[0] = t_o[tp->och];
889 1.13 lukem if (new[0] == old[0] && !force)
890 1.13 lukem continue;
891 1.13 lukem /* Put the old default binding back, and set the new binding */
892 1.15 christos key_clear(el, map, (char *)old);
893 1.15 christos map[old[0]] = dmap[old[0]];
894 1.15 christos key_clear(el, map, (char *)new);
895 1.13 lukem /* MAP_VI == 1, MAP_EMACS == 0... */
896 1.15 christos map[new[0]] = tp->bind[el->el_map.type];
897 1.13 lukem if (dalt) {
898 1.15 christos key_clear(el, alt, (char *)old);
899 1.15 christos alt[old[0]] = dalt[old[0]];
900 1.15 christos key_clear(el, alt, (char *)new);
901 1.15 christos alt[new[0]] = tp->bind[el->el_map.type + 1];
902 1.13 lukem }
903 1.1 cgd }
904 1.1 cgd }
905 1.1 cgd
906 1.13 lukem
907 1.1 cgd /* tty_rawmode():
908 1.1 cgd * Set terminal into 1 character at a time mode.
909 1.1 cgd */
910 1.1 cgd protected int
911 1.13 lukem tty_rawmode(EditLine *el)
912 1.1 cgd {
913 1.1 cgd
914 1.13 lukem if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO)
915 1.13 lukem return (0);
916 1.13 lukem
917 1.13 lukem if (el->el_flags & EDIT_DISABLED)
918 1.13 lukem return (0);
919 1.12 sommerfe
920 1.13 lukem if (tty_getty(el, &el->el_tty.t_ts) == -1) {
921 1.1 cgd #ifdef DEBUG_TTY
922 1.13 lukem (void) fprintf(el->el_errfile, "tty_rawmode: tty_getty: %s\n",
923 1.13 lukem strerror(errno));
924 1.1 cgd #endif /* DEBUG_TTY */
925 1.13 lukem return (-1);
926 1.1 cgd }
927 1.13 lukem /*
928 1.13 lukem * We always keep up with the eight bit setting and the speed of the
929 1.13 lukem * tty. But only we only believe changes that are made to cooked mode!
930 1.13 lukem */
931 1.13 lukem el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts);
932 1.13 lukem el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts);
933 1.13 lukem
934 1.13 lukem if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed ||
935 1.13 lukem tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) {
936 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed);
937 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed);
938 1.13 lukem (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed);
939 1.13 lukem (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed);
940 1.1 cgd }
941 1.13 lukem if (tty__cooked_mode(&el->el_tty.t_ts)) {
942 1.13 lukem if (el->el_tty.t_ts.c_cflag != el->el_tty.t_ex.c_cflag) {
943 1.13 lukem el->el_tty.t_ex.c_cflag =
944 1.13 lukem el->el_tty.t_ts.c_cflag;
945 1.13 lukem el->el_tty.t_ex.c_cflag &=
946 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_CTL].t_clrmask;
947 1.13 lukem el->el_tty.t_ex.c_cflag |=
948 1.13 lukem el->el_tty.t_t[EX_IO][MD_CTL].t_setmask;
949 1.13 lukem
950 1.13 lukem el->el_tty.t_ed.c_cflag =
951 1.13 lukem el->el_tty.t_ts.c_cflag;
952 1.13 lukem el->el_tty.t_ed.c_cflag &=
953 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_CTL].t_clrmask;
954 1.13 lukem el->el_tty.t_ed.c_cflag |=
955 1.13 lukem el->el_tty.t_t[ED_IO][MD_CTL].t_setmask;
956 1.13 lukem }
957 1.13 lukem if ((el->el_tty.t_ts.c_lflag != el->el_tty.t_ex.c_lflag) &&
958 1.13 lukem (el->el_tty.t_ts.c_lflag != el->el_tty.t_ed.c_lflag)) {
959 1.13 lukem el->el_tty.t_ex.c_lflag =
960 1.13 lukem el->el_tty.t_ts.c_lflag;
961 1.13 lukem el->el_tty.t_ex.c_lflag &=
962 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_LIN].t_clrmask;
963 1.13 lukem el->el_tty.t_ex.c_lflag |=
964 1.13 lukem el->el_tty.t_t[EX_IO][MD_LIN].t_setmask;
965 1.13 lukem
966 1.13 lukem el->el_tty.t_ed.c_lflag =
967 1.13 lukem el->el_tty.t_ts.c_lflag;
968 1.13 lukem el->el_tty.t_ed.c_lflag &=
969 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_LIN].t_clrmask;
970 1.13 lukem el->el_tty.t_ed.c_lflag |=
971 1.13 lukem el->el_tty.t_t[ED_IO][MD_LIN].t_setmask;
972 1.13 lukem }
973 1.13 lukem if ((el->el_tty.t_ts.c_iflag != el->el_tty.t_ex.c_iflag) &&
974 1.13 lukem (el->el_tty.t_ts.c_iflag != el->el_tty.t_ed.c_iflag)) {
975 1.13 lukem el->el_tty.t_ex.c_iflag =
976 1.13 lukem el->el_tty.t_ts.c_iflag;
977 1.13 lukem el->el_tty.t_ex.c_iflag &=
978 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_INP].t_clrmask;
979 1.13 lukem el->el_tty.t_ex.c_iflag |=
980 1.13 lukem el->el_tty.t_t[EX_IO][MD_INP].t_setmask;
981 1.13 lukem
982 1.13 lukem el->el_tty.t_ed.c_iflag =
983 1.13 lukem el->el_tty.t_ts.c_iflag;
984 1.13 lukem el->el_tty.t_ed.c_iflag &=
985 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_INP].t_clrmask;
986 1.13 lukem el->el_tty.t_ed.c_iflag |=
987 1.13 lukem el->el_tty.t_t[ED_IO][MD_INP].t_setmask;
988 1.13 lukem }
989 1.13 lukem if ((el->el_tty.t_ts.c_oflag != el->el_tty.t_ex.c_oflag) &&
990 1.13 lukem (el->el_tty.t_ts.c_oflag != el->el_tty.t_ed.c_oflag)) {
991 1.13 lukem el->el_tty.t_ex.c_oflag =
992 1.13 lukem el->el_tty.t_ts.c_oflag;
993 1.13 lukem el->el_tty.t_ex.c_oflag &=
994 1.13 lukem ~el->el_tty.t_t[EX_IO][MD_OUT].t_clrmask;
995 1.13 lukem el->el_tty.t_ex.c_oflag |=
996 1.13 lukem el->el_tty.t_t[EX_IO][MD_OUT].t_setmask;
997 1.13 lukem
998 1.13 lukem el->el_tty.t_ed.c_oflag =
999 1.13 lukem el->el_tty.t_ts.c_oflag;
1000 1.13 lukem el->el_tty.t_ed.c_oflag &=
1001 1.13 lukem ~el->el_tty.t_t[ED_IO][MD_OUT].t_clrmask;
1002 1.13 lukem el->el_tty.t_ed.c_oflag |=
1003 1.13 lukem el->el_tty.t_t[ED_IO][MD_OUT].t_setmask;
1004 1.13 lukem }
1005 1.13 lukem if (tty__gettabs(&el->el_tty.t_ex) == 0)
1006 1.13 lukem el->el_tty.t_tabs = 0;
1007 1.13 lukem else
1008 1.13 lukem el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0;
1009 1.1 cgd
1010 1.13 lukem {
1011 1.13 lukem int i;
1012 1.1 cgd
1013 1.13 lukem tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]);
1014 1.13 lukem /*
1015 1.13 lukem * Check if the user made any changes.
1016 1.13 lukem * If he did, then propagate the changes to the
1017 1.13 lukem * edit and execute data structures.
1018 1.13 lukem */
1019 1.13 lukem for (i = 0; i < C_NCC; i++)
1020 1.13 lukem if (el->el_tty.t_c[TS_IO][i] !=
1021 1.13 lukem el->el_tty.t_c[EX_IO][i])
1022 1.13 lukem break;
1023 1.13 lukem
1024 1.13 lukem if (i != C_NCC) {
1025 1.13 lukem /*
1026 1.13 lukem * Propagate changes only to the unprotected
1027 1.13 lukem * chars that have been modified just now.
1028 1.13 lukem */
1029 1.13 lukem for (i = 0; i < C_NCC; i++) {
1030 1.13 lukem if (!((el->el_tty.t_t[ED_IO][MD_CHAR].t_setmask & C_SH(i)))
1031 1.13 lukem && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i]))
1032 1.13 lukem el->el_tty.t_c[ED_IO][i] = el->el_tty.t_c[TS_IO][i];
1033 1.13 lukem if (el->el_tty.t_t[ED_IO][MD_CHAR].t_clrmask & C_SH(i))
1034 1.13 lukem el->el_tty.t_c[ED_IO][i] = el->el_tty.t_vdisable;
1035 1.13 lukem }
1036 1.13 lukem tty_bind_char(el, 0);
1037 1.13 lukem tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]);
1038 1.13 lukem
1039 1.13 lukem for (i = 0; i < C_NCC; i++) {
1040 1.13 lukem if (!((el->el_tty.t_t[EX_IO][MD_CHAR].t_setmask & C_SH(i)))
1041 1.13 lukem && (el->el_tty.t_c[TS_IO][i] != el->el_tty.t_c[EX_IO][i]))
1042 1.13 lukem el->el_tty.t_c[EX_IO][i] = el->el_tty.t_c[TS_IO][i];
1043 1.13 lukem if (el->el_tty.t_t[EX_IO][MD_CHAR].t_clrmask & C_SH(i))
1044 1.13 lukem el->el_tty.t_c[EX_IO][i] = el->el_tty.t_vdisable;
1045 1.13 lukem }
1046 1.13 lukem tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]);
1047 1.13 lukem }
1048 1.1 cgd }
1049 1.1 cgd }
1050 1.13 lukem if (tty_setty(el, &el->el_tty.t_ed) == -1) {
1051 1.1 cgd #ifdef DEBUG_TTY
1052 1.13 lukem (void) fprintf(el->el_errfile, "tty_rawmode: tty_setty: %s\n",
1053 1.13 lukem strerror(errno));
1054 1.1 cgd #endif /* DEBUG_TTY */
1055 1.13 lukem return (-1);
1056 1.13 lukem }
1057 1.13 lukem el->el_tty.t_mode = ED_IO;
1058 1.13 lukem return (0);
1059 1.13 lukem }
1060 1.1 cgd
1061 1.1 cgd
1062 1.1 cgd /* tty_cookedmode():
1063 1.1 cgd * Set the tty back to normal mode
1064 1.1 cgd */
1065 1.1 cgd protected int
1066 1.13 lukem tty_cookedmode(EditLine *el)
1067 1.1 cgd { /* set tty in normal setup */
1068 1.1 cgd
1069 1.13 lukem if (el->el_tty.t_mode == EX_IO)
1070 1.13 lukem return (0);
1071 1.13 lukem
1072 1.13 lukem if (el->el_flags & EDIT_DISABLED)
1073 1.13 lukem return (0);
1074 1.13 lukem
1075 1.13 lukem if (tty_setty(el, &el->el_tty.t_ex) == -1) {
1076 1.1 cgd #ifdef DEBUG_TTY
1077 1.13 lukem (void) fprintf(el->el_errfile,
1078 1.13 lukem "tty_cookedmode: tty_setty: %s\n",
1079 1.13 lukem strerror(errno));
1080 1.1 cgd #endif /* DEBUG_TTY */
1081 1.13 lukem return (-1);
1082 1.13 lukem }
1083 1.13 lukem el->el_tty.t_mode = EX_IO;
1084 1.13 lukem return (0);
1085 1.13 lukem }
1086 1.1 cgd
1087 1.1 cgd
1088 1.1 cgd /* tty_quotemode():
1089 1.1 cgd * Turn on quote mode
1090 1.1 cgd */
1091 1.1 cgd protected int
1092 1.13 lukem tty_quotemode(EditLine *el)
1093 1.1 cgd {
1094 1.13 lukem if (el->el_tty.t_mode == QU_IO)
1095 1.13 lukem return (0);
1096 1.1 cgd
1097 1.13 lukem el->el_tty.t_qu = el->el_tty.t_ed;
1098 1.1 cgd
1099 1.13 lukem el->el_tty.t_qu.c_iflag &= ~el->el_tty.t_t[QU_IO][MD_INP].t_clrmask;
1100 1.13 lukem el->el_tty.t_qu.c_iflag |= el->el_tty.t_t[QU_IO][MD_INP].t_setmask;
1101 1.1 cgd
1102 1.13 lukem el->el_tty.t_qu.c_oflag &= ~el->el_tty.t_t[QU_IO][MD_OUT].t_clrmask;
1103 1.13 lukem el->el_tty.t_qu.c_oflag |= el->el_tty.t_t[QU_IO][MD_OUT].t_setmask;
1104 1.1 cgd
1105 1.13 lukem el->el_tty.t_qu.c_cflag &= ~el->el_tty.t_t[QU_IO][MD_CTL].t_clrmask;
1106 1.13 lukem el->el_tty.t_qu.c_cflag |= el->el_tty.t_t[QU_IO][MD_CTL].t_setmask;
1107 1.1 cgd
1108 1.13 lukem el->el_tty.t_qu.c_lflag &= ~el->el_tty.t_t[QU_IO][MD_LIN].t_clrmask;
1109 1.13 lukem el->el_tty.t_qu.c_lflag |= el->el_tty.t_t[QU_IO][MD_LIN].t_setmask;
1110 1.1 cgd
1111 1.13 lukem if (tty_setty(el, &el->el_tty.t_qu) == -1) {
1112 1.1 cgd #ifdef DEBUG_TTY
1113 1.13 lukem (void) fprintf(el->el_errfile, "QuoteModeOn: tty_setty: %s\n",
1114 1.13 lukem strerror(errno));
1115 1.1 cgd #endif /* DEBUG_TTY */
1116 1.13 lukem return (-1);
1117 1.13 lukem }
1118 1.13 lukem el->el_tty.t_mode = QU_IO;
1119 1.13 lukem return (0);
1120 1.13 lukem }
1121 1.1 cgd
1122 1.1 cgd
1123 1.1 cgd /* tty_noquotemode():
1124 1.1 cgd * Turn off quote mode
1125 1.1 cgd */
1126 1.1 cgd protected int
1127 1.13 lukem tty_noquotemode(EditLine *el)
1128 1.1 cgd {
1129 1.13 lukem
1130 1.13 lukem if (el->el_tty.t_mode != QU_IO)
1131 1.13 lukem return (0);
1132 1.13 lukem if (tty_setty(el, &el->el_tty.t_ed) == -1) {
1133 1.1 cgd #ifdef DEBUG_TTY
1134 1.13 lukem (void) fprintf(el->el_errfile, "QuoteModeOff: tty_setty: %s\n",
1135 1.13 lukem strerror(errno));
1136 1.1 cgd #endif /* DEBUG_TTY */
1137 1.13 lukem return (-1);
1138 1.13 lukem }
1139 1.13 lukem el->el_tty.t_mode = ED_IO;
1140 1.13 lukem return (0);
1141 1.1 cgd }
1142 1.1 cgd
1143 1.13 lukem
1144 1.1 cgd /* tty_stty():
1145 1.1 cgd * Stty builtin
1146 1.1 cgd */
1147 1.1 cgd protected int
1148 1.1 cgd /*ARGSUSED*/
1149 1.17 christos tty_stty(EditLine *el, int argc __attribute__((__unused__)), const char **argv)
1150 1.1 cgd {
1151 1.14 jdolecek const ttymodes_t *m;
1152 1.16 christos char x;
1153 1.13 lukem int aflag = 0;
1154 1.16 christos const char *s, *d;
1155 1.16 christos const char *name;
1156 1.19 christos struct termios *tios = &el->el_tty.t_ex;
1157 1.13 lukem int z = EX_IO;
1158 1.13 lukem
1159 1.13 lukem if (argv == NULL)
1160 1.13 lukem return (-1);
1161 1.13 lukem name = *argv++;
1162 1.13 lukem
1163 1.13 lukem while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0')
1164 1.13 lukem switch (argv[0][1]) {
1165 1.13 lukem case 'a':
1166 1.13 lukem aflag++;
1167 1.13 lukem argv++;
1168 1.13 lukem break;
1169 1.13 lukem case 'd':
1170 1.13 lukem argv++;
1171 1.19 christos tios = &el->el_tty.t_ed;
1172 1.13 lukem z = ED_IO;
1173 1.13 lukem break;
1174 1.13 lukem case 'x':
1175 1.13 lukem argv++;
1176 1.19 christos tios = &el->el_tty.t_ex;
1177 1.13 lukem z = EX_IO;
1178 1.13 lukem break;
1179 1.13 lukem case 'q':
1180 1.13 lukem argv++;
1181 1.19 christos tios = &el->el_tty.t_ts;
1182 1.13 lukem z = QU_IO;
1183 1.13 lukem break;
1184 1.13 lukem default:
1185 1.13 lukem (void) fprintf(el->el_errfile,
1186 1.13 lukem "%s: Unknown switch `%c'.\n",
1187 1.13 lukem name, argv[0][1]);
1188 1.13 lukem return (-1);
1189 1.13 lukem }
1190 1.1 cgd
1191 1.13 lukem if (!argv || !*argv) {
1192 1.13 lukem int i = -1;
1193 1.13 lukem int len = 0, st = 0, cu;
1194 1.13 lukem for (m = ttymodes; m->m_name; m++) {
1195 1.13 lukem if (m->m_type != i) {
1196 1.13 lukem (void) fprintf(el->el_outfile, "%s%s",
1197 1.13 lukem i != -1 ? "\n" : "",
1198 1.13 lukem el->el_tty.t_t[z][m->m_type].t_name);
1199 1.13 lukem i = m->m_type;
1200 1.13 lukem st = len =
1201 1.13 lukem strlen(el->el_tty.t_t[z][m->m_type].t_name);
1202 1.13 lukem }
1203 1.13 lukem x = (el->el_tty.t_t[z][i].t_setmask & m->m_value)
1204 1.13 lukem ? '+' : '\0';
1205 1.13 lukem x = (el->el_tty.t_t[z][i].t_clrmask & m->m_value)
1206 1.13 lukem ? '-' : x;
1207 1.13 lukem
1208 1.13 lukem if (x != '\0' || aflag) {
1209 1.13 lukem
1210 1.13 lukem cu = strlen(m->m_name) + (x != '\0') + 1;
1211 1.13 lukem
1212 1.13 lukem if (len + cu >= el->el_term.t_size.h) {
1213 1.13 lukem (void) fprintf(el->el_outfile, "\n%*s",
1214 1.13 lukem st, "");
1215 1.13 lukem len = st + cu;
1216 1.13 lukem } else
1217 1.13 lukem len += cu;
1218 1.13 lukem
1219 1.13 lukem if (x != '\0')
1220 1.13 lukem (void) fprintf(el->el_outfile, "%c%s ",
1221 1.13 lukem x, m->m_name);
1222 1.13 lukem else
1223 1.13 lukem (void) fprintf(el->el_outfile, "%s ",
1224 1.13 lukem m->m_name);
1225 1.13 lukem }
1226 1.1 cgd }
1227 1.13 lukem (void) fprintf(el->el_outfile, "\n");
1228 1.13 lukem return (0);
1229 1.1 cgd }
1230 1.13 lukem while (argv && (s = *argv++)) {
1231 1.22 christos const char *p;
1232 1.13 lukem switch (*s) {
1233 1.13 lukem case '+':
1234 1.13 lukem case '-':
1235 1.13 lukem x = *s++;
1236 1.13 lukem break;
1237 1.13 lukem default:
1238 1.13 lukem x = '\0';
1239 1.13 lukem break;
1240 1.13 lukem }
1241 1.13 lukem d = s;
1242 1.22 christos p = strchr(s, '=');
1243 1.13 lukem for (m = ttymodes; m->m_name; m++)
1244 1.22 christos if ((p ? strncmp(m->m_name, d, (size_t)(p - d)) :
1245 1.22 christos strcmp(m->m_name, d)) == 0 &&
1246 1.19 christos (p == NULL || m->m_type == MD_CHAR))
1247 1.13 lukem break;
1248 1.13 lukem
1249 1.13 lukem if (!m->m_name) {
1250 1.13 lukem (void) fprintf(el->el_errfile,
1251 1.13 lukem "%s: Invalid argument `%s'.\n", name, d);
1252 1.13 lukem return (-1);
1253 1.19 christos }
1254 1.19 christos if (p) {
1255 1.19 christos int c = ffs((int)m->m_value);
1256 1.22 christos int v = *++p ? parse__escape((const char **) &p) :
1257 1.19 christos el->el_tty.t_vdisable;
1258 1.19 christos assert(c-- != 0);
1259 1.19 christos c = tty__getcharindex(c);
1260 1.19 christos assert(c != -1);
1261 1.19 christos tios->c_cc[c] = v;
1262 1.19 christos continue;
1263 1.13 lukem }
1264 1.13 lukem switch (x) {
1265 1.13 lukem case '+':
1266 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value;
1267 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
1268 1.13 lukem break;
1269 1.13 lukem case '-':
1270 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
1271 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value;
1272 1.13 lukem break;
1273 1.13 lukem default:
1274 1.13 lukem el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value;
1275 1.13 lukem el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value;
1276 1.13 lukem break;
1277 1.13 lukem }
1278 1.1 cgd }
1279 1.13 lukem return (0);
1280 1.13 lukem }
1281 1.1 cgd
1282 1.1 cgd
1283 1.1 cgd #ifdef notyet
1284 1.1 cgd /* tty_printchar():
1285 1.1 cgd * DEbugging routine to print the tty characters
1286 1.1 cgd */
1287 1.1 cgd private void
1288 1.13 lukem tty_printchar(EditLine *el, unsigned char *s)
1289 1.1 cgd {
1290 1.13 lukem ttyperm_t *m;
1291 1.13 lukem int i;
1292 1.1 cgd
1293 1.13 lukem for (i = 0; i < C_NCC; i++) {
1294 1.13 lukem for (m = el->el_tty.t_t; m->m_name; m++)
1295 1.13 lukem if (m->m_type == MD_CHAR && C_SH(i) == m->m_value)
1296 1.13 lukem break;
1297 1.13 lukem if (m->m_name)
1298 1.13 lukem (void) fprintf(el->el_errfile, "%s ^%c ",
1299 1.13 lukem m->m_name, s[i] + 'A' - 1);
1300 1.13 lukem if (i % 5 == 0)
1301 1.13 lukem (void) fprintf(el->el_errfile, "\n");
1302 1.13 lukem }
1303 1.13 lukem (void) fprintf(el->el_errfile, "\n");
1304 1.1 cgd }
1305 1.1 cgd #endif /* notyet */
1306