1 /*	$NetBSD: tty.h,v 1.14 2012/05/15 15:59:01 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  */
36 
37 /*
38  * el.tty.h: Local terminal header
39  */
40 #ifndef _h_el_tty
41 #define	_h_el_tty
42 
43 #include "sys.h"
44 #include "histedit.h"
45 #include <termios.h>
46 #include <unistd.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  * So that we don't lose job control.
150  */
151 #ifdef __SVR4
152 # undef CSWTCH
153 #endif
154 
155 #ifndef _POSIX_VDISABLE
156 # define _POSIX_VDISABLE ((unsigned char) -1)
157 #endif /* _POSIX_VDISABLE */
158 
159 #if !defined(CREPRINT) && defined(CRPRNT)
160 # define CREPRINT CRPRNT
161 #endif /* !CREPRINT && CRPRNT */
162 #if !defined(CDISCARD) && defined(CFLUSH)
163 # define CDISCARD CFLUSH
164 #endif /* !CDISCARD && CFLUSH */
165 
166 #ifndef CINTR
167 # define CINTR		CONTROL('c')
168 #endif /* CINTR */
169 #ifndef CQUIT
170 # define CQUIT		034	/* ^\ */
171 #endif /* CQUIT */
172 #ifndef CERASE
173 # define CERASE		0177	/* ^? */
174 #endif /* CERASE */
175 #ifndef CKILL
176 # define CKILL		CONTROL('u')
177 #endif /* CKILL */
178 #ifndef CEOF
179 # define CEOF		CONTROL('d')
180 #endif /* CEOF */
181 #ifndef CEOL
182 # define CEOL		_POSIX_VDISABLE
183 #endif /* CEOL */
184 #ifndef CEOL2
185 # define CEOL2		_POSIX_VDISABLE
186 #endif /* CEOL2 */
187 #ifndef CSWTCH
188 # define CSWTCH		_POSIX_VDISABLE
189 #endif /* CSWTCH */
190 #ifndef CDSWTCH
191 # define CDSWTCH	_POSIX_VDISABLE
192 #endif /* CDSWTCH */
193 #ifndef CERASE2
194 # define CERASE2	_POSIX_VDISABLE
195 #endif /* CERASE2 */
196 #ifndef CSTART
197 # define CSTART		CONTROL('q')
198 #endif /* CSTART */
199 #ifndef CSTOP
200 # define CSTOP		CONTROL('s')
201 #endif /* CSTOP */
202 #ifndef CSUSP
203 # define CSUSP		CONTROL('z')
204 #endif /* CSUSP */
205 #ifndef CDSUSP
206 # define CDSUSP		CONTROL('y')
207 #endif /* CDSUSP */
208 
209 #ifdef hpux
210 
211 # ifndef CREPRINT
212 #  define CREPRINT	_POSIX_VDISABLE
213 # endif /* CREPRINT */
214 # ifndef CDISCARD
215 #  define CDISCARD	_POSIX_VDISABLE
216 # endif /* CDISCARD */
217 # ifndef CLNEXT
218 #  define CLNEXT	_POSIX_VDISABLE
219 # endif /* CLNEXT */
220 # ifndef CWERASE
221 #  define CWERASE	_POSIX_VDISABLE
222 # endif /* CWERASE */
223 
224 #else /* !hpux */
225 
226 # ifndef CREPRINT
227 #  define CREPRINT	CONTROL('r')
228 # endif /* CREPRINT */
229 # ifndef CDISCARD
230 #  define CDISCARD	CONTROL('o')
231 # endif /* CDISCARD */
232 # ifndef CLNEXT
233 #  define CLNEXT	CONTROL('v')
234 # endif /* CLNEXT */
235 # ifndef CWERASE
236 #  define CWERASE	CONTROL('w')
237 # endif /* CWERASE */
238 
239 #endif /* hpux */
240 
241 #ifndef CSTATUS
242 # define CSTATUS	CONTROL('t')
243 #endif /* CSTATUS */
244 #ifndef CPAGE
245 # define CPAGE		' '
246 #endif /* CPAGE */
247 #ifndef CPGOFF
248 # define CPGOFF		CONTROL('m')
249 #endif /* CPGOFF */
250 #ifndef CKILL2
251 # define CKILL2		_POSIX_VDISABLE
252 #endif /* CKILL2 */
253 #ifndef CBRK
254 # ifndef masscomp
255 #  define CBRK		0377
256 # else
257 #  define CBRK		'\0'
258 # endif /* masscomp */
259 #endif /* CBRK */
260 #ifndef CMIN
261 # define CMIN		CEOF
262 #endif /* CMIN */
263 #ifndef CTIME
264 # define CTIME		CEOL
265 #endif /* CTIME */
266 
267 /*
268  * Fix for sun inconsistency. On termio VSUSP and the rest of the
269  * ttychars > NCC are defined. So we undefine them.
270  */
271 #if defined(TERMIO) || defined(POSIX)
272 # if defined(POSIX) && defined(NCCS)
273 #  define NUMCC		NCCS
274 # else
275 #  ifdef NCC
276 #   define NUMCC	NCC
277 #  endif /* NCC */
278 # endif /* POSIX && NCCS */
279 # ifdef NUMCC
280 #  ifdef VINTR
281 #   if NUMCC <= VINTR
282 #    undef VINTR
283 #   endif /* NUMCC <= VINTR */
284 #  endif /* VINTR */
285 #  ifdef VQUIT
286 #   if NUMCC <= VQUIT
287 #    undef VQUIT
288 #   endif /* NUMCC <= VQUIT */
289 #  endif /* VQUIT */
290 #  ifdef VERASE
291 #   if NUMCC <= VERASE
292 #    undef VERASE
293 #   endif /* NUMCC <= VERASE */
294 #  endif /* VERASE */
295 #  ifdef VKILL
296 #   if NUMCC <= VKILL
297 #    undef VKILL
298 #   endif /* NUMCC <= VKILL */
299 #  endif /* VKILL */
300 #  ifdef VEOF
301 #   if NUMCC <= VEOF
302 #    undef VEOF
303 #   endif /* NUMCC <= VEOF */
304 #  endif /* VEOF */
305 #  ifdef VEOL
306 #   if NUMCC <= VEOL
307 #    undef VEOL
308 #   endif /* NUMCC <= VEOL */
309 #  endif /* VEOL */
310 #  ifdef VEOL2
311 #   if NUMCC <= VEOL2
312 #    undef VEOL2
313 #   endif /* NUMCC <= VEOL2 */
314 #  endif /* VEOL2 */
315 #  ifdef VSWTCH
316 #   if NUMCC <= VSWTCH
317 #    undef VSWTCH
318 #   endif /* NUMCC <= VSWTCH */
319 #  endif /* VSWTCH */
320 #  ifdef VDSWTCH
321 #   if NUMCC <= VDSWTCH
322 #    undef VDSWTCH
323 #   endif /* NUMCC <= VDSWTCH */
324 #  endif /* VDSWTCH */
325 #  ifdef VERASE2
326 #   if NUMCC <= VERASE2
327 #    undef VERASE2
328 #   endif /* NUMCC <= VERASE2 */
329 #  endif /* VERASE2 */
330 #  ifdef VSTART
331 #   if NUMCC <= VSTART
332 #    undef VSTART
333 #   endif /* NUMCC <= VSTART */
334 #  endif /* VSTART */
335 #  ifdef VSTOP
336 #   if NUMCC <= VSTOP
337 #    undef VSTOP
338 #   endif /* NUMCC <= VSTOP */
339 #  endif /* VSTOP */
340 #  ifdef VWERASE
341 #   if NUMCC <= VWERASE
342 #    undef VWERASE
343 #   endif /* NUMCC <= VWERASE */
344 #  endif /* VWERASE */
345 #  ifdef VSUSP
346 #   if NUMCC <= VSUSP
347 #    undef VSUSP
348 #   endif /* NUMCC <= VSUSP */
349 #  endif /* VSUSP */
350 #  ifdef VDSUSP
351 #   if NUMCC <= VDSUSP
352 #    undef VDSUSP
353 #   endif /* NUMCC <= VDSUSP */
354 #  endif /* VDSUSP */
355 #  ifdef VREPRINT
356 #   if NUMCC <= VREPRINT
357 #    undef VREPRINT
358 #   endif /* NUMCC <= VREPRINT */
359 #  endif /* VREPRINT */
360 #  ifdef VDISCARD
361 #   if NUMCC <= VDISCARD
362 #    undef VDISCARD
363 #   endif /* NUMCC <= VDISCARD */
364 #  endif /* VDISCARD */
365 #  ifdef VLNEXT
366 #   if NUMCC <= VLNEXT
367 #    undef VLNEXT
368 #   endif /* NUMCC <= VLNEXT */
369 #  endif /* VLNEXT */
370 #  ifdef VSTATUS
371 #   if NUMCC <= VSTATUS
372 #    undef VSTATUS
373 #   endif /* NUMCC <= VSTATUS */
374 #  endif /* VSTATUS */
375 #  ifdef VPAGE
376 #   if NUMCC <= VPAGE
377 #    undef VPAGE
378 #   endif /* NUMCC <= VPAGE */
379 #  endif /* VPAGE */
380 #  ifdef VPGOFF
381 #   if NUMCC <= VPGOFF
382 #    undef VPGOFF
383 #   endif /* NUMCC <= VPGOFF */
384 #  endif /* VPGOFF */
385 #  ifdef VKILL2
386 #   if NUMCC <= VKILL2
387 #    undef VKILL2
388 #   endif /* NUMCC <= VKILL2 */
389 #  endif /* VKILL2 */
390 #  ifdef VBRK
391 #   if NUMCC <= VBRK
392 #    undef VBRK
393 #   endif /* NUMCC <= VBRK */
394 #  endif /* VBRK */
395 #  ifdef VMIN
396 #   if NUMCC <= VMIN
397 #    undef VMIN
398 #   endif /* NUMCC <= VMIN */
399 #  endif /* VMIN */
400 #  ifdef VTIME
401 #   if NUMCC <= VTIME
402 #    undef VTIME
403 #   endif /* NUMCC <= VTIME */
404 #  endif /* VTIME */
405 # endif /* NUMCC */
406 #endif /* !POSIX */
407 
408 #define	C_INTR		 0
409 #define	C_QUIT		 1
410 #define	C_ERASE		 2
411 #define	C_KILL		 3
412 #define	C_EOF		 4
413 #define	C_EOL		 5
414 #define	C_EOL2		 6
415 #define	C_SWTCH		 7
416 #define	C_DSWTCH	 8
417 #define	C_ERASE2	 9
418 #define	C_START		10
419 #define	C_STOP		11
420 #define	C_WERASE	12
421 #define	C_SUSP		13
422 #define	C_DSUSP		14
423 #define	C_REPRINT	15
424 #define	C_DISCARD	16
425 #define	C_LNEXT		17
426 #define	C_STATUS	18
427 #define	C_PAGE		19
428 #define	C_PGOFF		20
429 #define	C_KILL2		21
430 #define	C_BRK		22
431 #define	C_MIN		23
432 #define	C_TIME		24
433 #define	C_NCC		25
434 #define	C_SH(A)		((unsigned int)(1 << (A)))
435 
436 /*
437  * Terminal dependend data structures
438  */
439 #define	EX_IO	0	/* while we are executing	*/
440 #define	ED_IO	1	/* while we are editing		*/
441 #define	TS_IO	2	/* new mode from terminal	*/
442 #define	QU_IO	2	/* used only for quoted chars	*/
443 #define	NN_IO	3	/* The number of entries	*/
444 
445 #define	MD_INP	0
446 #define	MD_OUT	1
447 #define	MD_CTL	2
448 #define	MD_LIN	3
449 #define	MD_CHAR	4
450 #define	MD_NN	5
451 
452 typedef struct {
453 	const char	*t_name;
454 	unsigned int	 t_setmask;
455 	unsigned int	 t_clrmask;
456 } ttyperm_t[NN_IO][MD_NN];
457 
458 typedef unsigned char ttychar_t[NN_IO][C_NCC];
459 
460 protected int	tty_init(EditLine *);
461 protected void	tty_end(EditLine *);
462 protected int	tty_stty(EditLine *, int, const Char **);
463 protected int	tty_rawmode(EditLine *);
464 protected int	tty_cookedmode(EditLine *);
465 protected int	tty_quotemode(EditLine *);
466 protected int	tty_noquotemode(EditLine *);
467 protected void	tty_bind_char(EditLine *, int);
468 
469 typedef 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     int t_mode;
477     unsigned char t_vdisable;
478 } el_tty_t;
479 
480 
481 #endif /* _h_el_tty */
482