xref: /openbsd/lib/libedit/tty.h (revision e3191321)
1 /*	$OpenBSD: tty.h,v 1.12 2016/04/11 20:43:33 schwarze Exp $	*/
2 /*	$NetBSD: tty.h,v 1.20 2016/04/11 00:50:13 christos Exp $	*/
3 
4 /*-
5  * Copyright (c) 1992, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Christos Zoulas of Cornell University.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *	@(#)tty.h	8.1 (Berkeley) 6/4/93
36  */
37 
38 /*
39  * el.tty.h: Local terminal header
40  */
41 #ifndef _h_el_tty
42 #define	_h_el_tty
43 
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 /* Don't re-order */
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 wchar_t **);
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     unsigned char t_mode;
477     unsigned char t_vdisable;
478     unsigned char t_initialized;
479 } el_tty_t;
480 
481 
482 #endif /* _h_el_tty */
483