1 /* $NetBSD: tty.h,v 1.23 2018/12/02 16:58:13 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 <termios.h> 44 #include <unistd.h> 45 46 /* Define our own since everyone gets it wrong! */ 47 #define CONTROL(A) ((A) & 037) 48 49 /* 50 * Aix compatible names 51 */ 52 # if defined(VWERSE) && !defined(VWERASE) 53 # define VWERASE VWERSE 54 # endif /* VWERSE && !VWERASE */ 55 56 # if defined(VDISCRD) && !defined(VDISCARD) 57 # define VDISCARD VDISCRD 58 # endif /* VDISCRD && !VDISCARD */ 59 60 # if defined(VFLUSHO) && !defined(VDISCARD) 61 # define VDISCARD VFLUSHO 62 # endif /* VFLUSHO && VDISCARD */ 63 64 # if defined(VSTRT) && !defined(VSTART) 65 # define VSTART VSTRT 66 # endif /* VSTRT && ! VSTART */ 67 68 # if defined(VSTAT) && !defined(VSTATUS) 69 # define VSTATUS VSTAT 70 # endif /* VSTAT && ! VSTATUS */ 71 72 # ifndef ONLRET 73 # define ONLRET 0 74 # endif /* ONLRET */ 75 76 # ifndef TAB3 77 # ifdef OXTABS 78 # define TAB3 OXTABS 79 # else 80 # define TAB3 0 81 # endif /* OXTABS */ 82 # endif /* !TAB3 */ 83 84 # if defined(OXTABS) && !defined(XTABS) 85 # define XTABS OXTABS 86 # endif /* OXTABS && !XTABS */ 87 88 # ifndef ONLCR 89 # define ONLCR 0 90 # endif /* ONLCR */ 91 92 # ifndef IEXTEN 93 # define IEXTEN 0 94 # endif /* IEXTEN */ 95 96 # ifndef ECHOCTL 97 # define ECHOCTL 0 98 # endif /* ECHOCTL */ 99 100 # ifndef PARENB 101 # define PARENB 0 102 # endif /* PARENB */ 103 104 # ifndef EXTPROC 105 # define EXTPROC 0 106 # endif /* EXTPROC */ 107 108 # ifndef FLUSHO 109 # define FLUSHO 0 110 # endif /* FLUSHO */ 111 112 113 # if defined(VDISABLE) && !defined(_POSIX_VDISABLE) 114 # define _POSIX_VDISABLE VDISABLE 115 # endif /* VDISABLE && ! _POSIX_VDISABLE */ 116 117 /* 118 * Work around ISC's definition of IEXTEN which is 119 * XCASE! 120 */ 121 # ifdef ISC 122 # if defined(IEXTEN) && defined(XCASE) 123 # if IEXTEN == XCASE 124 # undef IEXTEN 125 # define IEXTEN 0 126 # endif /* IEXTEN == XCASE */ 127 # endif /* IEXTEN && XCASE */ 128 # if defined(IEXTEN) && !defined(XCASE) 129 # define XCASE IEXTEN 130 # undef IEXTEN 131 # define IEXTEN 0 132 # endif /* IEXTEN && !XCASE */ 133 # endif /* ISC */ 134 135 /* 136 * Work around convex weirdness where turning off IEXTEN makes us 137 * lose all postprocessing! 138 */ 139 #if defined(convex) || defined(__convex__) 140 # if defined(IEXTEN) && IEXTEN != 0 141 # undef IEXTEN 142 # define IEXTEN 0 143 # endif /* IEXTEN != 0 */ 144 #endif /* convex || __convex__ */ 145 146 /* 147 * So that we don't lose job control. 148 */ 149 #ifdef __SVR4 150 # undef CSWTCH 151 #endif 152 153 #ifndef _POSIX_VDISABLE 154 # define _POSIX_VDISABLE ((unsigned char) -1) 155 #endif /* _POSIX_VDISABLE */ 156 157 #if !defined(CREPRINT) && defined(CRPRNT) 158 # define CREPRINT CRPRNT 159 #endif /* !CREPRINT && CRPRNT */ 160 #if !defined(CDISCARD) && defined(CFLUSH) 161 # define CDISCARD CFLUSH 162 #endif /* !CDISCARD && CFLUSH */ 163 164 #ifndef CINTR 165 # define CINTR CONTROL('c') 166 #endif /* CINTR */ 167 #ifndef CQUIT 168 # define CQUIT 034 /* ^\ */ 169 #endif /* CQUIT */ 170 #ifndef CERASE 171 # define CERASE 0177 /* ^? */ 172 #endif /* CERASE */ 173 #ifndef CKILL 174 # define CKILL CONTROL('u') 175 #endif /* CKILL */ 176 #ifndef CEOF 177 # define CEOF CONTROL('d') 178 #endif /* CEOF */ 179 #ifndef CEOL 180 # define CEOL _POSIX_VDISABLE 181 #endif /* CEOL */ 182 #ifndef CEOL2 183 # define CEOL2 _POSIX_VDISABLE 184 #endif /* CEOL2 */ 185 #ifndef CSWTCH 186 # define CSWTCH _POSIX_VDISABLE 187 #endif /* CSWTCH */ 188 #ifndef CDSWTCH 189 # define CDSWTCH _POSIX_VDISABLE 190 #endif /* CDSWTCH */ 191 #ifndef CERASE2 192 # define CERASE2 _POSIX_VDISABLE 193 #endif /* CERASE2 */ 194 #ifndef CSTART 195 # define CSTART CONTROL('q') 196 #endif /* CSTART */ 197 #ifndef CSTOP 198 # define CSTOP CONTROL('s') 199 #endif /* CSTOP */ 200 #ifndef CSUSP 201 # define CSUSP CONTROL('z') 202 #endif /* CSUSP */ 203 #ifndef CDSUSP 204 # define CDSUSP CONTROL('y') 205 #endif /* CDSUSP */ 206 207 #ifdef hpux 208 209 # ifndef CREPRINT 210 # define CREPRINT _POSIX_VDISABLE 211 # endif /* CREPRINT */ 212 # ifndef CDISCARD 213 # define CDISCARD _POSIX_VDISABLE 214 # endif /* CDISCARD */ 215 # ifndef CLNEXT 216 # define CLNEXT _POSIX_VDISABLE 217 # endif /* CLNEXT */ 218 # ifndef CWERASE 219 # define CWERASE _POSIX_VDISABLE 220 # endif /* CWERASE */ 221 222 #else /* !hpux */ 223 224 # ifndef CREPRINT 225 # define CREPRINT CONTROL('r') 226 # endif /* CREPRINT */ 227 # ifndef CDISCARD 228 # define CDISCARD CONTROL('o') 229 # endif /* CDISCARD */ 230 # ifndef CLNEXT 231 # define CLNEXT CONTROL('v') 232 # endif /* CLNEXT */ 233 # ifndef CWERASE 234 # define CWERASE CONTROL('w') 235 # endif /* CWERASE */ 236 237 #endif /* hpux */ 238 239 #ifndef CSTATUS 240 # define CSTATUS CONTROL('t') 241 #endif /* CSTATUS */ 242 #ifndef CPAGE 243 # define CPAGE ' ' 244 #endif /* CPAGE */ 245 #ifndef CPGOFF 246 # define CPGOFF CONTROL('m') 247 #endif /* CPGOFF */ 248 #ifndef CKILL2 249 # define CKILL2 _POSIX_VDISABLE 250 #endif /* CKILL2 */ 251 #ifndef CBRK 252 # ifndef masscomp 253 # define CBRK 0377 254 # else 255 # define CBRK '\0' 256 # endif /* masscomp */ 257 #endif /* CBRK */ 258 #ifndef CMIN 259 # define CMIN CEOF 260 #endif /* CMIN */ 261 #ifndef CTIME 262 # define CTIME CEOL 263 #endif /* CTIME */ 264 265 /* 266 * Fix for sun inconsistency. On termio VSUSP and the rest of the 267 * ttychars > NCC are defined. So we undefine them. 268 */ 269 #if defined(TERMIO) || defined(POSIX) 270 # if defined(POSIX) && defined(NCCS) 271 # define NUMCC NCCS 272 # else 273 # ifdef NCC 274 # define NUMCC NCC 275 # endif /* NCC */ 276 # endif /* POSIX && NCCS */ 277 # ifdef NUMCC 278 # ifdef VINTR 279 # if NUMCC <= VINTR 280 # undef VINTR 281 # endif /* NUMCC <= VINTR */ 282 # endif /* VINTR */ 283 # ifdef VQUIT 284 # if NUMCC <= VQUIT 285 # undef VQUIT 286 # endif /* NUMCC <= VQUIT */ 287 # endif /* VQUIT */ 288 # ifdef VERASE 289 # if NUMCC <= VERASE 290 # undef VERASE 291 # endif /* NUMCC <= VERASE */ 292 # endif /* VERASE */ 293 # ifdef VKILL 294 # if NUMCC <= VKILL 295 # undef VKILL 296 # endif /* NUMCC <= VKILL */ 297 # endif /* VKILL */ 298 # ifdef VEOF 299 # if NUMCC <= VEOF 300 # undef VEOF 301 # endif /* NUMCC <= VEOF */ 302 # endif /* VEOF */ 303 # ifdef VEOL 304 # if NUMCC <= VEOL 305 # undef VEOL 306 # endif /* NUMCC <= VEOL */ 307 # endif /* VEOL */ 308 # ifdef VEOL2 309 # if NUMCC <= VEOL2 310 # undef VEOL2 311 # endif /* NUMCC <= VEOL2 */ 312 # endif /* VEOL2 */ 313 # ifdef VSWTCH 314 # if NUMCC <= VSWTCH 315 # undef VSWTCH 316 # endif /* NUMCC <= VSWTCH */ 317 # endif /* VSWTCH */ 318 # ifdef VDSWTCH 319 # if NUMCC <= VDSWTCH 320 # undef VDSWTCH 321 # endif /* NUMCC <= VDSWTCH */ 322 # endif /* VDSWTCH */ 323 # ifdef VERASE2 324 # if NUMCC <= VERASE2 325 # undef VERASE2 326 # endif /* NUMCC <= VERASE2 */ 327 # endif /* VERASE2 */ 328 # ifdef VSTART 329 # if NUMCC <= VSTART 330 # undef VSTART 331 # endif /* NUMCC <= VSTART */ 332 # endif /* VSTART */ 333 # ifdef VSTOP 334 # if NUMCC <= VSTOP 335 # undef VSTOP 336 # endif /* NUMCC <= VSTOP */ 337 # endif /* VSTOP */ 338 # ifdef VWERASE 339 # if NUMCC <= VWERASE 340 # undef VWERASE 341 # endif /* NUMCC <= VWERASE */ 342 # endif /* VWERASE */ 343 # ifdef VSUSP 344 # if NUMCC <= VSUSP 345 # undef VSUSP 346 # endif /* NUMCC <= VSUSP */ 347 # endif /* VSUSP */ 348 # ifdef VDSUSP 349 # if NUMCC <= VDSUSP 350 # undef VDSUSP 351 # endif /* NUMCC <= VDSUSP */ 352 # endif /* VDSUSP */ 353 # ifdef VREPRINT 354 # if NUMCC <= VREPRINT 355 # undef VREPRINT 356 # endif /* NUMCC <= VREPRINT */ 357 # endif /* VREPRINT */ 358 # ifdef VDISCARD 359 # if NUMCC <= VDISCARD 360 # undef VDISCARD 361 # endif /* NUMCC <= VDISCARD */ 362 # endif /* VDISCARD */ 363 # ifdef VLNEXT 364 # if NUMCC <= VLNEXT 365 # undef VLNEXT 366 # endif /* NUMCC <= VLNEXT */ 367 # endif /* VLNEXT */ 368 # ifdef VSTATUS 369 # if NUMCC <= VSTATUS 370 # undef VSTATUS 371 # endif /* NUMCC <= VSTATUS */ 372 # endif /* VSTATUS */ 373 # ifdef VPAGE 374 # if NUMCC <= VPAGE 375 # undef VPAGE 376 # endif /* NUMCC <= VPAGE */ 377 # endif /* VPAGE */ 378 # ifdef VPGOFF 379 # if NUMCC <= VPGOFF 380 # undef VPGOFF 381 # endif /* NUMCC <= VPGOFF */ 382 # endif /* VPGOFF */ 383 # ifdef VKILL2 384 # if NUMCC <= VKILL2 385 # undef VKILL2 386 # endif /* NUMCC <= VKILL2 */ 387 # endif /* VKILL2 */ 388 # ifdef VBRK 389 # if NUMCC <= VBRK 390 # undef VBRK 391 # endif /* NUMCC <= VBRK */ 392 # endif /* VBRK */ 393 # ifdef VMIN 394 # if NUMCC <= VMIN 395 # undef VMIN 396 # endif /* NUMCC <= VMIN */ 397 # endif /* VMIN */ 398 # ifdef VTIME 399 # if NUMCC <= VTIME 400 # undef VTIME 401 # endif /* NUMCC <= VTIME */ 402 # endif /* VTIME */ 403 # endif /* NUMCC */ 404 #endif /* !POSIX */ 405 406 #define C_INTR 0 407 #define C_QUIT 1 408 #define C_ERASE 2 409 #define C_KILL 3 410 #define C_EOF 4 411 #define C_EOL 5 412 #define C_EOL2 6 413 #define C_SWTCH 7 414 #define C_DSWTCH 8 415 #define C_ERASE2 9 416 #define C_START 10 417 #define C_STOP 11 418 #define C_WERASE 12 419 #define C_SUSP 13 420 #define C_DSUSP 14 421 #define C_REPRINT 15 422 #define C_DISCARD 16 423 #define C_LNEXT 17 424 #define C_STATUS 18 425 #define C_PAGE 19 426 #define C_PGOFF 20 427 #define C_KILL2 21 428 #define C_BRK 22 429 #define C_MIN 23 430 #define C_TIME 24 431 #define C_NCC 25 432 #define C_SH(A) ((unsigned int)(1 << (A))) 433 434 /* 435 * Terminal dependend data structures 436 */ 437 #define EX_IO 0 /* while we are executing */ 438 #define ED_IO 1 /* while we are editing */ 439 #define TS_IO 2 /* new mode from terminal */ 440 #define QU_IO 2 /* used only for quoted chars */ 441 #define NN_IO 3 /* The number of entries */ 442 443 /* Don't re-order */ 444 #define MD_INP 0 445 #define MD_OUT 1 446 #define MD_CTL 2 447 #define MD_LIN 3 448 #define MD_CHAR 4 449 #define MD_NN 5 450 451 typedef struct { 452 const char *t_name; 453 unsigned int t_setmask; 454 unsigned int t_clrmask; 455 } ttyperm_t[NN_IO][MD_NN]; 456 457 typedef unsigned char ttychar_t[NN_IO][C_NCC]; 458 459 libedit_private int tty_init(EditLine *); 460 libedit_private void tty_end(EditLine *, int); 461 libedit_private int tty_stty(EditLine *, int, const wchar_t **); 462 libedit_private int tty_rawmode(EditLine *); 463 libedit_private int tty_cookedmode(EditLine *); 464 libedit_private int tty_quotemode(EditLine *); 465 libedit_private int tty_noquotemode(EditLine *); 466 libedit_private void tty_bind_char(EditLine *, int); 467 libedit_private int tty_get_signal_character(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