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