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