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