Home | History | Annotate | Download | only in src
      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