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