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