1/* $NetBSD: tty.h,v 1.24 2021/07/31 20:51:32 andvar 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 dependent 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 451typedef struct { 452 const char *t_name; 453 unsigned int t_setmask; 454 unsigned int t_clrmask; 455} ttyperm_t[NN_IO][MD_NN]; 456 457typedef unsigned char ttychar_t[NN_IO][C_NCC]; 458 459libedit_private int tty_init(EditLine *); 460libedit_private void tty_end(EditLine *, int); 461libedit_private int tty_stty(EditLine *, int, const wchar_t **); 462libedit_private int tty_rawmode(EditLine *); 463libedit_private int tty_cookedmode(EditLine *); 464libedit_private int tty_quotemode(EditLine *); 465libedit_private int tty_noquotemode(EditLine *); 466libedit_private void tty_bind_char(EditLine *, int); 467libedit_private int tty_get_signal_character(EditLine *, int); 468 469typedef 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