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 452typedef struct { 453 const char *t_name; 454 unsigned int t_setmask; 455 unsigned int t_clrmask; 456} ttyperm_t[NN_IO][MD_NN]; 457 458typedef unsigned char ttychar_t[NN_IO][C_NCC]; 459 460protected int tty_init(EditLine *); 461protected void tty_end(EditLine *); 462protected int tty_stty(EditLine *, int, const Char **); 463protected int tty_rawmode(EditLine *); 464protected int tty_cookedmode(EditLine *); 465protected int tty_quotemode(EditLine *); 466protected int tty_noquotemode(EditLine *); 467protected void tty_bind_char(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 int t_mode; 477 unsigned char t_vdisable; 478} el_tty_t; 479 480 481#endif /* _h_el_tty */ 482