1/*	$NetBSD: tty.h,v 1.24 2021/07/31 20:51:32 andvar Exp $	*/
2
3/*-
4 * Copyright (c) 1992, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Christos Zoulas of Cornell University.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 *
34 *	@(#)tty.h	8.1 (Berkeley) 6/4/93
35 */
36
37/*
38 * el.tty.h: Local terminal header
39 */
40#ifndef _h_el_tty
41#define	_h_el_tty
42
43#include <termios.h>
44#include <unistd.h>
45
46/* Define our own since everyone gets it wrong! */
47#define	CONTROL(A)	((A) & 037)
48
49/*
50 * Aix compatible names
51 */
52# if defined(VWERSE) && !defined(VWERASE)
53#  define VWERASE VWERSE
54# endif /* VWERSE && !VWERASE */
55
56# if defined(VDISCRD) && !defined(VDISCARD)
57#  define VDISCARD VDISCRD
58# endif /* VDISCRD && !VDISCARD */
59
60# if defined(VFLUSHO) && !defined(VDISCARD)
61#  define VDISCARD VFLUSHO
62# endif  /* VFLUSHO && VDISCARD */
63
64# if defined(VSTRT) && !defined(VSTART)
65#  define VSTART VSTRT
66# endif /* VSTRT && ! VSTART */
67
68# if defined(VSTAT) && !defined(VSTATUS)
69#  define VSTATUS VSTAT
70# endif /* VSTAT && ! VSTATUS */
71
72# ifndef ONLRET
73#  define ONLRET 0
74# endif /* ONLRET */
75
76# ifndef TAB3
77#  ifdef OXTABS
78#   define TAB3 OXTABS
79#  else
80#   define TAB3 0
81#  endif /* OXTABS */
82# endif /* !TAB3 */
83
84# if defined(OXTABS) && !defined(XTABS)
85#  define XTABS OXTABS
86# endif /* OXTABS && !XTABS */
87
88# ifndef ONLCR
89#  define ONLCR 0
90# endif /* ONLCR */
91
92# ifndef IEXTEN
93#  define IEXTEN 0
94# endif /* IEXTEN */
95
96# ifndef ECHOCTL
97#  define ECHOCTL 0
98# endif /* ECHOCTL */
99
100# ifndef PARENB
101#  define PARENB 0
102# endif /* PARENB */
103
104# ifndef EXTPROC
105#  define EXTPROC 0
106# endif /* EXTPROC */
107
108# ifndef FLUSHO
109#  define FLUSHO  0
110# endif /* FLUSHO */
111
112
113# if defined(VDISABLE) && !defined(_POSIX_VDISABLE)
114#  define _POSIX_VDISABLE VDISABLE
115# endif /* VDISABLE && ! _POSIX_VDISABLE */
116
117/*
118 * Work around ISC's definition of IEXTEN which is
119 * XCASE!
120 */
121# ifdef ISC
122#  if defined(IEXTEN) && defined(XCASE)
123#   if IEXTEN == XCASE
124#    undef IEXTEN
125#    define IEXTEN 0
126#   endif /* IEXTEN == XCASE */
127#  endif /* IEXTEN && XCASE */
128#  if defined(IEXTEN) && !defined(XCASE)
129#   define XCASE IEXTEN
130#   undef IEXTEN
131#   define IEXTEN 0
132#  endif /* IEXTEN && !XCASE */
133# endif /* ISC */
134
135/*
136 * Work around convex weirdness where turning off IEXTEN makes us
137 * lose all postprocessing!
138 */
139#if defined(convex) || defined(__convex__)
140# if defined(IEXTEN) && IEXTEN != 0
141#  undef IEXTEN
142#  define IEXTEN 0
143# endif /* IEXTEN != 0 */
144#endif /* convex || __convex__ */
145
146/*
147 * So that we don't lose job control.
148 */
149#ifdef __SVR4
150# undef CSWTCH
151#endif
152
153#ifndef _POSIX_VDISABLE
154# define _POSIX_VDISABLE ((unsigned char) -1)
155#endif /* _POSIX_VDISABLE */
156
157#if !defined(CREPRINT) && defined(CRPRNT)
158# define CREPRINT CRPRNT
159#endif /* !CREPRINT && CRPRNT */
160#if !defined(CDISCARD) && defined(CFLUSH)
161# define CDISCARD CFLUSH
162#endif /* !CDISCARD && CFLUSH */
163
164#ifndef CINTR
165# define CINTR		CONTROL('c')
166#endif /* CINTR */
167#ifndef CQUIT
168# define CQUIT		034	/* ^\ */
169#endif /* CQUIT */
170#ifndef CERASE
171# define CERASE		0177	/* ^? */
172#endif /* CERASE */
173#ifndef CKILL
174# define CKILL		CONTROL('u')
175#endif /* CKILL */
176#ifndef CEOF
177# define CEOF		CONTROL('d')
178#endif /* CEOF */
179#ifndef CEOL
180# define CEOL		_POSIX_VDISABLE
181#endif /* CEOL */
182#ifndef CEOL2
183# define CEOL2		_POSIX_VDISABLE
184#endif /* CEOL2 */
185#ifndef CSWTCH
186# define CSWTCH		_POSIX_VDISABLE
187#endif /* CSWTCH */
188#ifndef CDSWTCH
189# define CDSWTCH	_POSIX_VDISABLE
190#endif /* CDSWTCH */
191#ifndef CERASE2
192# define CERASE2	_POSIX_VDISABLE
193#endif /* CERASE2 */
194#ifndef CSTART
195# define CSTART		CONTROL('q')
196#endif /* CSTART */
197#ifndef CSTOP
198# define CSTOP		CONTROL('s')
199#endif /* CSTOP */
200#ifndef CSUSP
201# define CSUSP		CONTROL('z')
202#endif /* CSUSP */
203#ifndef CDSUSP
204# define CDSUSP		CONTROL('y')
205#endif /* CDSUSP */
206
207#ifdef hpux
208
209# ifndef CREPRINT
210#  define CREPRINT	_POSIX_VDISABLE
211# endif /* CREPRINT */
212# ifndef CDISCARD
213#  define CDISCARD	_POSIX_VDISABLE
214# endif /* CDISCARD */
215# ifndef CLNEXT
216#  define CLNEXT	_POSIX_VDISABLE
217# endif /* CLNEXT */
218# ifndef CWERASE
219#  define CWERASE	_POSIX_VDISABLE
220# endif /* CWERASE */
221
222#else /* !hpux */
223
224# ifndef CREPRINT
225#  define CREPRINT	CONTROL('r')
226# endif /* CREPRINT */
227# ifndef CDISCARD
228#  define CDISCARD	CONTROL('o')
229# endif /* CDISCARD */
230# ifndef CLNEXT
231#  define CLNEXT	CONTROL('v')
232# endif /* CLNEXT */
233# ifndef CWERASE
234#  define CWERASE	CONTROL('w')
235# endif /* CWERASE */
236
237#endif /* hpux */
238
239#ifndef CSTATUS
240# define CSTATUS	CONTROL('t')
241#endif /* CSTATUS */
242#ifndef CPAGE
243# define CPAGE		' '
244#endif /* CPAGE */
245#ifndef CPGOFF
246# define CPGOFF		CONTROL('m')
247#endif /* CPGOFF */
248#ifndef CKILL2
249# define CKILL2		_POSIX_VDISABLE
250#endif /* CKILL2 */
251#ifndef CBRK
252# ifndef masscomp
253#  define CBRK		0377
254# else
255#  define CBRK		'\0'
256# endif /* masscomp */
257#endif /* CBRK */
258#ifndef CMIN
259# define CMIN		CEOF
260#endif /* CMIN */
261#ifndef CTIME
262# define CTIME		CEOL
263#endif /* CTIME */
264
265/*
266 * Fix for sun inconsistency. On termio VSUSP and the rest of the
267 * ttychars > NCC are defined. So we undefine them.
268 */
269#if defined(TERMIO) || defined(POSIX)
270# if defined(POSIX) && defined(NCCS)
271#  define NUMCC		NCCS
272# else
273#  ifdef NCC
274#   define NUMCC	NCC
275#  endif /* NCC */
276# endif /* POSIX && NCCS */
277# ifdef NUMCC
278#  ifdef VINTR
279#   if NUMCC <= VINTR
280#    undef VINTR
281#   endif /* NUMCC <= VINTR */
282#  endif /* VINTR */
283#  ifdef VQUIT
284#   if NUMCC <= VQUIT
285#    undef VQUIT
286#   endif /* NUMCC <= VQUIT */
287#  endif /* VQUIT */
288#  ifdef VERASE
289#   if NUMCC <= VERASE
290#    undef VERASE
291#   endif /* NUMCC <= VERASE */
292#  endif /* VERASE */
293#  ifdef VKILL
294#   if NUMCC <= VKILL
295#    undef VKILL
296#   endif /* NUMCC <= VKILL */
297#  endif /* VKILL */
298#  ifdef VEOF
299#   if NUMCC <= VEOF
300#    undef VEOF
301#   endif /* NUMCC <= VEOF */
302#  endif /* VEOF */
303#  ifdef VEOL
304#   if NUMCC <= VEOL
305#    undef VEOL
306#   endif /* NUMCC <= VEOL */
307#  endif /* VEOL */
308#  ifdef VEOL2
309#   if NUMCC <= VEOL2
310#    undef VEOL2
311#   endif /* NUMCC <= VEOL2 */
312#  endif /* VEOL2 */
313#  ifdef VSWTCH
314#   if NUMCC <= VSWTCH
315#    undef VSWTCH
316#   endif /* NUMCC <= VSWTCH */
317#  endif /* VSWTCH */
318#  ifdef VDSWTCH
319#   if NUMCC <= VDSWTCH
320#    undef VDSWTCH
321#   endif /* NUMCC <= VDSWTCH */
322#  endif /* VDSWTCH */
323#  ifdef VERASE2
324#   if NUMCC <= VERASE2
325#    undef VERASE2
326#   endif /* NUMCC <= VERASE2 */
327#  endif /* VERASE2 */
328#  ifdef VSTART
329#   if NUMCC <= VSTART
330#    undef VSTART
331#   endif /* NUMCC <= VSTART */
332#  endif /* VSTART */
333#  ifdef VSTOP
334#   if NUMCC <= VSTOP
335#    undef VSTOP
336#   endif /* NUMCC <= VSTOP */
337#  endif /* VSTOP */
338#  ifdef VWERASE
339#   if NUMCC <= VWERASE
340#    undef VWERASE
341#   endif /* NUMCC <= VWERASE */
342#  endif /* VWERASE */
343#  ifdef VSUSP
344#   if NUMCC <= VSUSP
345#    undef VSUSP
346#   endif /* NUMCC <= VSUSP */
347#  endif /* VSUSP */
348#  ifdef VDSUSP
349#   if NUMCC <= VDSUSP
350#    undef VDSUSP
351#   endif /* NUMCC <= VDSUSP */
352#  endif /* VDSUSP */
353#  ifdef VREPRINT
354#   if NUMCC <= VREPRINT
355#    undef VREPRINT
356#   endif /* NUMCC <= VREPRINT */
357#  endif /* VREPRINT */
358#  ifdef VDISCARD
359#   if NUMCC <= VDISCARD
360#    undef VDISCARD
361#   endif /* NUMCC <= VDISCARD */
362#  endif /* VDISCARD */
363#  ifdef VLNEXT
364#   if NUMCC <= VLNEXT
365#    undef VLNEXT
366#   endif /* NUMCC <= VLNEXT */
367#  endif /* VLNEXT */
368#  ifdef VSTATUS
369#   if NUMCC <= VSTATUS
370#    undef VSTATUS
371#   endif /* NUMCC <= VSTATUS */
372#  endif /* VSTATUS */
373#  ifdef VPAGE
374#   if NUMCC <= VPAGE
375#    undef VPAGE
376#   endif /* NUMCC <= VPAGE */
377#  endif /* VPAGE */
378#  ifdef VPGOFF
379#   if NUMCC <= VPGOFF
380#    undef VPGOFF
381#   endif /* NUMCC <= VPGOFF */
382#  endif /* VPGOFF */
383#  ifdef VKILL2
384#   if NUMCC <= VKILL2
385#    undef VKILL2
386#   endif /* NUMCC <= VKILL2 */
387#  endif /* VKILL2 */
388#  ifdef VBRK
389#   if NUMCC <= VBRK
390#    undef VBRK
391#   endif /* NUMCC <= VBRK */
392#  endif /* VBRK */
393#  ifdef VMIN
394#   if NUMCC <= VMIN
395#    undef VMIN
396#   endif /* NUMCC <= VMIN */
397#  endif /* VMIN */
398#  ifdef VTIME
399#   if NUMCC <= VTIME
400#    undef VTIME
401#   endif /* NUMCC <= VTIME */
402#  endif /* VTIME */
403# endif /* NUMCC */
404#endif /* !POSIX */
405
406#define	C_INTR		 0
407#define	C_QUIT		 1
408#define	C_ERASE		 2
409#define	C_KILL		 3
410#define	C_EOF		 4
411#define	C_EOL		 5
412#define	C_EOL2		 6
413#define	C_SWTCH		 7
414#define	C_DSWTCH	 8
415#define	C_ERASE2	 9
416#define	C_START		10
417#define	C_STOP		11
418#define	C_WERASE	12
419#define	C_SUSP		13
420#define	C_DSUSP		14
421#define	C_REPRINT	15
422#define	C_DISCARD	16
423#define	C_LNEXT		17
424#define	C_STATUS	18
425#define	C_PAGE		19
426#define	C_PGOFF		20
427#define	C_KILL2		21
428#define	C_BRK		22
429#define	C_MIN		23
430#define	C_TIME		24
431#define	C_NCC		25
432#define	C_SH(A)		((unsigned int)(1 << (A)))
433
434/*
435 * Terminal dependent data structures
436 */
437#define	EX_IO	0	/* while we are executing	*/
438#define	ED_IO	1	/* while we are editing		*/
439#define	TS_IO	2	/* new mode from terminal	*/
440#define	QU_IO	2	/* used only for quoted chars	*/
441#define	NN_IO	3	/* The number of entries	*/
442
443/* Don't re-order */
444#define	MD_INP	0
445#define	MD_OUT	1
446#define	MD_CTL	2
447#define	MD_LIN	3
448#define	MD_CHAR	4
449#define	MD_NN	5
450
451typedef struct {
452	const char	*t_name;
453	unsigned int	 t_setmask;
454	unsigned int	 t_clrmask;
455} ttyperm_t[NN_IO][MD_NN];
456
457typedef unsigned char ttychar_t[NN_IO][C_NCC];
458
459libedit_private int	tty_init(EditLine *);
460libedit_private void	tty_end(EditLine *, int);
461libedit_private int	tty_stty(EditLine *, int, const wchar_t **);
462libedit_private int	tty_rawmode(EditLine *);
463libedit_private int	tty_cookedmode(EditLine *);
464libedit_private int	tty_quotemode(EditLine *);
465libedit_private int	tty_noquotemode(EditLine *);
466libedit_private void	tty_bind_char(EditLine *, int);
467libedit_private int	tty_get_signal_character(EditLine *, int);
468
469typedef struct {
470    ttyperm_t t_t;
471    ttychar_t t_c;
472    struct termios t_or, t_ex, t_ed, t_ts;
473    int t_tabs;
474    int t_eight;
475    speed_t t_speed;
476    unsigned char t_mode;
477    unsigned char t_vdisable;
478    unsigned char t_initialized;
479} el_tty_t;
480
481
482#endif /* _h_el_tty */
483