Merge branch 'vendor/LIBEDIT'
[dragonfly.git] / contrib / libedit / src / tty.h
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 */