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