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