1*d0ef721eSBaptiste Daroussin /* $NetBSD: tty.c,v 1.68 2018/12/02 16:58:13 christos Exp $ */ 2*d0ef721eSBaptiste Daroussin 3*d0ef721eSBaptiste Daroussin /*- 4*d0ef721eSBaptiste Daroussin * Copyright (c) 1992, 1993 5*d0ef721eSBaptiste Daroussin * The Regents of the University of California. All rights reserved. 6*d0ef721eSBaptiste Daroussin * 7*d0ef721eSBaptiste Daroussin * This code is derived from software contributed to Berkeley by 8*d0ef721eSBaptiste Daroussin * Christos Zoulas of Cornell University. 9*d0ef721eSBaptiste Daroussin * 10*d0ef721eSBaptiste Daroussin * Redistribution and use in source and binary forms, with or without 11*d0ef721eSBaptiste Daroussin * modification, are permitted provided that the following conditions 12*d0ef721eSBaptiste Daroussin * are met: 13*d0ef721eSBaptiste Daroussin * 1. Redistributions of source code must retain the above copyright 14*d0ef721eSBaptiste Daroussin * notice, this list of conditions and the following disclaimer. 15*d0ef721eSBaptiste Daroussin * 2. Redistributions in binary form must reproduce the above copyright 16*d0ef721eSBaptiste Daroussin * notice, this list of conditions and the following disclaimer in the 17*d0ef721eSBaptiste Daroussin * documentation and/or other materials provided with the distribution. 18*d0ef721eSBaptiste Daroussin * 3. Neither the name of the University nor the names of its contributors 19*d0ef721eSBaptiste Daroussin * may be used to endorse or promote products derived from this software 20*d0ef721eSBaptiste Daroussin * without specific prior written permission. 21*d0ef721eSBaptiste Daroussin * 22*d0ef721eSBaptiste Daroussin * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23*d0ef721eSBaptiste Daroussin * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24*d0ef721eSBaptiste Daroussin * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25*d0ef721eSBaptiste Daroussin * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26*d0ef721eSBaptiste Daroussin * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27*d0ef721eSBaptiste Daroussin * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28*d0ef721eSBaptiste Daroussin * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29*d0ef721eSBaptiste Daroussin * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30*d0ef721eSBaptiste Daroussin * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31*d0ef721eSBaptiste Daroussin * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32*d0ef721eSBaptiste Daroussin * SUCH DAMAGE. 33*d0ef721eSBaptiste Daroussin */ 34*d0ef721eSBaptiste Daroussin 35*d0ef721eSBaptiste Daroussin #include "config.h" 36*d0ef721eSBaptiste Daroussin #if !defined(lint) && !defined(SCCSID) 37*d0ef721eSBaptiste Daroussin #if 0 38*d0ef721eSBaptiste Daroussin static char sccsid[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93"; 39*d0ef721eSBaptiste Daroussin #else 40*d0ef721eSBaptiste Daroussin __RCSID("$NetBSD: tty.c,v 1.68 2018/12/02 16:58:13 christos Exp $"); 41*d0ef721eSBaptiste Daroussin #endif 42*d0ef721eSBaptiste Daroussin #endif /* not lint && not SCCSID */ 43*d0ef721eSBaptiste Daroussin 44*d0ef721eSBaptiste Daroussin /* 45*d0ef721eSBaptiste Daroussin * tty.c: tty interface stuff 46*d0ef721eSBaptiste Daroussin */ 47*d0ef721eSBaptiste Daroussin #include <assert.h> 48*d0ef721eSBaptiste Daroussin #include <errno.h> 49*d0ef721eSBaptiste Daroussin #include <stdlib.h> /* for abort */ 50*d0ef721eSBaptiste Daroussin #include <string.h> 51*d0ef721eSBaptiste Daroussin #include <strings.h> /* for ffs */ 52*d0ef721eSBaptiste Daroussin #include <unistd.h> /* for isatty */ 53*d0ef721eSBaptiste Daroussin 54*d0ef721eSBaptiste Daroussin #include "el.h" 55*d0ef721eSBaptiste Daroussin #include "fcns.h" 56*d0ef721eSBaptiste Daroussin #include "parse.h" 57*d0ef721eSBaptiste Daroussin 58*d0ef721eSBaptiste Daroussin typedef struct ttymodes_t { 59*d0ef721eSBaptiste Daroussin const char *m_name; 60*d0ef721eSBaptiste Daroussin unsigned int m_value; 61*d0ef721eSBaptiste Daroussin int m_type; 62*d0ef721eSBaptiste Daroussin } ttymodes_t; 63*d0ef721eSBaptiste Daroussin 64*d0ef721eSBaptiste Daroussin typedef struct ttymap_t { 65*d0ef721eSBaptiste Daroussin wint_t nch, och; /* Internal and termio rep of chars */ 66*d0ef721eSBaptiste Daroussin el_action_t bind[3]; /* emacs, vi, and vi-cmd */ 67*d0ef721eSBaptiste Daroussin } ttymap_t; 68*d0ef721eSBaptiste Daroussin 69*d0ef721eSBaptiste Daroussin 70*d0ef721eSBaptiste Daroussin static const ttyperm_t ttyperm = { 71*d0ef721eSBaptiste Daroussin { 72*d0ef721eSBaptiste Daroussin {"iflag:", ICRNL, (INLCR | IGNCR)}, 73*d0ef721eSBaptiste Daroussin {"oflag:", (OPOST | ONLCR), ONLRET}, 74*d0ef721eSBaptiste Daroussin {"cflag:", 0, 0}, 75*d0ef721eSBaptiste Daroussin {"lflag:", (ISIG | ICANON | ECHO | ECHOE | ECHOCTL | IEXTEN), 76*d0ef721eSBaptiste Daroussin (NOFLSH | ECHONL | EXTPROC | FLUSHO)}, 77*d0ef721eSBaptiste Daroussin {"chars:", 0, 0}, 78*d0ef721eSBaptiste Daroussin }, 79*d0ef721eSBaptiste Daroussin { 80*d0ef721eSBaptiste Daroussin {"iflag:", (INLCR | ICRNL), IGNCR}, 81*d0ef721eSBaptiste Daroussin {"oflag:", (OPOST | ONLCR), ONLRET}, 82*d0ef721eSBaptiste Daroussin {"cflag:", 0, 0}, 83*d0ef721eSBaptiste Daroussin {"lflag:", ISIG, 84*d0ef721eSBaptiste Daroussin (NOFLSH | ICANON | ECHO | ECHOK | ECHONL | EXTPROC | IEXTEN | FLUSHO)}, 85*d0ef721eSBaptiste Daroussin {"chars:", (C_SH(C_MIN) | C_SH(C_TIME) | C_SH(C_SWTCH) | C_SH(C_DSWTCH) | 86*d0ef721eSBaptiste Daroussin C_SH(C_SUSP) | C_SH(C_DSUSP) | C_SH(C_EOL) | C_SH(C_DISCARD) | 87*d0ef721eSBaptiste Daroussin C_SH(C_PGOFF) | C_SH(C_PAGE) | C_SH(C_STATUS)), 0} 88*d0ef721eSBaptiste Daroussin }, 89*d0ef721eSBaptiste Daroussin { 90*d0ef721eSBaptiste Daroussin {"iflag:", 0, IXON | IXOFF | INLCR | ICRNL}, 91*d0ef721eSBaptiste Daroussin {"oflag:", 0, 0}, 92*d0ef721eSBaptiste Daroussin {"cflag:", 0, 0}, 93*d0ef721eSBaptiste Daroussin {"lflag:", 0, ISIG | IEXTEN}, 94*d0ef721eSBaptiste Daroussin {"chars:", 0, 0}, 95*d0ef721eSBaptiste Daroussin } 96*d0ef721eSBaptiste Daroussin }; 97*d0ef721eSBaptiste Daroussin 98*d0ef721eSBaptiste Daroussin static const ttychar_t ttychar = { 99*d0ef721eSBaptiste Daroussin { 100*d0ef721eSBaptiste Daroussin CINTR, CQUIT, CERASE, CKILL, 101*d0ef721eSBaptiste Daroussin CEOF, CEOL, CEOL2, CSWTCH, 102*d0ef721eSBaptiste Daroussin CDSWTCH, CERASE2, CSTART, CSTOP, 103*d0ef721eSBaptiste Daroussin CWERASE, CSUSP, CDSUSP, CREPRINT, 104*d0ef721eSBaptiste Daroussin CDISCARD, CLNEXT, CSTATUS, CPAGE, 105*d0ef721eSBaptiste Daroussin CPGOFF, CKILL2, CBRK, CMIN, 106*d0ef721eSBaptiste Daroussin CTIME 107*d0ef721eSBaptiste Daroussin }, 108*d0ef721eSBaptiste Daroussin { 109*d0ef721eSBaptiste Daroussin CINTR, CQUIT, CERASE, CKILL, 110*d0ef721eSBaptiste Daroussin _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 111*d0ef721eSBaptiste Daroussin _POSIX_VDISABLE, CERASE2, CSTART, CSTOP, 112*d0ef721eSBaptiste Daroussin _POSIX_VDISABLE, CSUSP, _POSIX_VDISABLE, _POSIX_VDISABLE, 113*d0ef721eSBaptiste Daroussin CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 114*d0ef721eSBaptiste Daroussin _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1, 115*d0ef721eSBaptiste Daroussin 0 116*d0ef721eSBaptiste Daroussin }, 117*d0ef721eSBaptiste Daroussin { 118*d0ef721eSBaptiste Daroussin 0, 0, 0, 0, 119*d0ef721eSBaptiste Daroussin 0, 0, 0, 0, 120*d0ef721eSBaptiste Daroussin 0, 0, 0, 0, 121*d0ef721eSBaptiste Daroussin 0, 0, 0, 0, 122*d0ef721eSBaptiste Daroussin 0, 0, 0, 0, 123*d0ef721eSBaptiste Daroussin 0, 0, 0, 0, 124*d0ef721eSBaptiste Daroussin 0 125*d0ef721eSBaptiste Daroussin } 126*d0ef721eSBaptiste Daroussin }; 127*d0ef721eSBaptiste Daroussin 128*d0ef721eSBaptiste Daroussin static const ttymap_t tty_map[] = { 129*d0ef721eSBaptiste Daroussin #ifdef VERASE 130*d0ef721eSBaptiste Daroussin {C_ERASE, VERASE, 131*d0ef721eSBaptiste Daroussin {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, 132*d0ef721eSBaptiste Daroussin #endif /* VERASE */ 133*d0ef721eSBaptiste Daroussin #ifdef VERASE2 134*d0ef721eSBaptiste Daroussin {C_ERASE2, VERASE2, 135*d0ef721eSBaptiste Daroussin {EM_DELETE_PREV_CHAR, VI_DELETE_PREV_CHAR, ED_PREV_CHAR}}, 136*d0ef721eSBaptiste Daroussin #endif /* VERASE2 */ 137*d0ef721eSBaptiste Daroussin #ifdef VKILL 138*d0ef721eSBaptiste Daroussin {C_KILL, VKILL, 139*d0ef721eSBaptiste Daroussin {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}}, 140*d0ef721eSBaptiste Daroussin #endif /* VKILL */ 141*d0ef721eSBaptiste Daroussin #ifdef VKILL2 142*d0ef721eSBaptiste Daroussin {C_KILL2, VKILL2, 143*d0ef721eSBaptiste Daroussin {EM_KILL_LINE, VI_KILL_LINE_PREV, ED_UNASSIGNED}}, 144*d0ef721eSBaptiste Daroussin #endif /* VKILL2 */ 145*d0ef721eSBaptiste Daroussin #ifdef VEOF 146*d0ef721eSBaptiste Daroussin {C_EOF, VEOF, 147*d0ef721eSBaptiste Daroussin {EM_DELETE_OR_LIST, VI_LIST_OR_EOF, ED_UNASSIGNED}}, 148*d0ef721eSBaptiste Daroussin #endif /* VEOF */ 149*d0ef721eSBaptiste Daroussin #ifdef VWERASE 150*d0ef721eSBaptiste Daroussin {C_WERASE, VWERASE, 151*d0ef721eSBaptiste Daroussin {ED_DELETE_PREV_WORD, ED_DELETE_PREV_WORD, ED_PREV_WORD}}, 152*d0ef721eSBaptiste Daroussin #endif /* VWERASE */ 153*d0ef721eSBaptiste Daroussin #ifdef VREPRINT 154*d0ef721eSBaptiste Daroussin {C_REPRINT, VREPRINT, 155*d0ef721eSBaptiste Daroussin {ED_REDISPLAY, ED_INSERT, ED_REDISPLAY}}, 156*d0ef721eSBaptiste Daroussin #endif /* VREPRINT */ 157*d0ef721eSBaptiste Daroussin #ifdef VLNEXT 158*d0ef721eSBaptiste Daroussin {C_LNEXT, VLNEXT, 159*d0ef721eSBaptiste Daroussin {ED_QUOTED_INSERT, ED_QUOTED_INSERT, ED_UNASSIGNED}}, 160*d0ef721eSBaptiste Daroussin #endif /* VLNEXT */ 161*d0ef721eSBaptiste Daroussin {(wint_t)-1, (wint_t)-1, 162*d0ef721eSBaptiste Daroussin {ED_UNASSIGNED, ED_UNASSIGNED, ED_UNASSIGNED}} 163*d0ef721eSBaptiste Daroussin }; 164*d0ef721eSBaptiste Daroussin 165*d0ef721eSBaptiste Daroussin static const ttymodes_t ttymodes[] = { 166*d0ef721eSBaptiste Daroussin #ifdef IGNBRK 167*d0ef721eSBaptiste Daroussin {"ignbrk", IGNBRK, MD_INP}, 168*d0ef721eSBaptiste Daroussin #endif /* IGNBRK */ 169*d0ef721eSBaptiste Daroussin #ifdef BRKINT 170*d0ef721eSBaptiste Daroussin {"brkint", BRKINT, MD_INP}, 171*d0ef721eSBaptiste Daroussin #endif /* BRKINT */ 172*d0ef721eSBaptiste Daroussin #ifdef IGNPAR 173*d0ef721eSBaptiste Daroussin {"ignpar", IGNPAR, MD_INP}, 174*d0ef721eSBaptiste Daroussin #endif /* IGNPAR */ 175*d0ef721eSBaptiste Daroussin #ifdef PARMRK 176*d0ef721eSBaptiste Daroussin {"parmrk", PARMRK, MD_INP}, 177*d0ef721eSBaptiste Daroussin #endif /* PARMRK */ 178*d0ef721eSBaptiste Daroussin #ifdef INPCK 179*d0ef721eSBaptiste Daroussin {"inpck", INPCK, MD_INP}, 180*d0ef721eSBaptiste Daroussin #endif /* INPCK */ 181*d0ef721eSBaptiste Daroussin #ifdef ISTRIP 182*d0ef721eSBaptiste Daroussin {"istrip", ISTRIP, MD_INP}, 183*d0ef721eSBaptiste Daroussin #endif /* ISTRIP */ 184*d0ef721eSBaptiste Daroussin #ifdef INLCR 185*d0ef721eSBaptiste Daroussin {"inlcr", INLCR, MD_INP}, 186*d0ef721eSBaptiste Daroussin #endif /* INLCR */ 187*d0ef721eSBaptiste Daroussin #ifdef IGNCR 188*d0ef721eSBaptiste Daroussin {"igncr", IGNCR, MD_INP}, 189*d0ef721eSBaptiste Daroussin #endif /* IGNCR */ 190*d0ef721eSBaptiste Daroussin #ifdef ICRNL 191*d0ef721eSBaptiste Daroussin {"icrnl", ICRNL, MD_INP}, 192*d0ef721eSBaptiste Daroussin #endif /* ICRNL */ 193*d0ef721eSBaptiste Daroussin #ifdef IUCLC 194*d0ef721eSBaptiste Daroussin {"iuclc", IUCLC, MD_INP}, 195*d0ef721eSBaptiste Daroussin #endif /* IUCLC */ 196*d0ef721eSBaptiste Daroussin #ifdef IXON 197*d0ef721eSBaptiste Daroussin {"ixon", IXON, MD_INP}, 198*d0ef721eSBaptiste Daroussin #endif /* IXON */ 199*d0ef721eSBaptiste Daroussin #ifdef IXANY 200*d0ef721eSBaptiste Daroussin {"ixany", IXANY, MD_INP}, 201*d0ef721eSBaptiste Daroussin #endif /* IXANY */ 202*d0ef721eSBaptiste Daroussin #ifdef IXOFF 203*d0ef721eSBaptiste Daroussin {"ixoff", IXOFF, MD_INP}, 204*d0ef721eSBaptiste Daroussin #endif /* IXOFF */ 205*d0ef721eSBaptiste Daroussin #ifdef IMAXBEL 206*d0ef721eSBaptiste Daroussin {"imaxbel", IMAXBEL, MD_INP}, 207*d0ef721eSBaptiste Daroussin #endif /* IMAXBEL */ 208*d0ef721eSBaptiste Daroussin 209*d0ef721eSBaptiste Daroussin #ifdef OPOST 210*d0ef721eSBaptiste Daroussin {"opost", OPOST, MD_OUT}, 211*d0ef721eSBaptiste Daroussin #endif /* OPOST */ 212*d0ef721eSBaptiste Daroussin #ifdef OLCUC 213*d0ef721eSBaptiste Daroussin {"olcuc", OLCUC, MD_OUT}, 214*d0ef721eSBaptiste Daroussin #endif /* OLCUC */ 215*d0ef721eSBaptiste Daroussin #ifdef ONLCR 216*d0ef721eSBaptiste Daroussin {"onlcr", ONLCR, MD_OUT}, 217*d0ef721eSBaptiste Daroussin #endif /* ONLCR */ 218*d0ef721eSBaptiste Daroussin #ifdef OCRNL 219*d0ef721eSBaptiste Daroussin {"ocrnl", OCRNL, MD_OUT}, 220*d0ef721eSBaptiste Daroussin #endif /* OCRNL */ 221*d0ef721eSBaptiste Daroussin #ifdef ONOCR 222*d0ef721eSBaptiste Daroussin {"onocr", ONOCR, MD_OUT}, 223*d0ef721eSBaptiste Daroussin #endif /* ONOCR */ 224*d0ef721eSBaptiste Daroussin #ifdef ONOEOT 225*d0ef721eSBaptiste Daroussin {"onoeot", ONOEOT, MD_OUT}, 226*d0ef721eSBaptiste Daroussin #endif /* ONOEOT */ 227*d0ef721eSBaptiste Daroussin #ifdef ONLRET 228*d0ef721eSBaptiste Daroussin {"onlret", ONLRET, MD_OUT}, 229*d0ef721eSBaptiste Daroussin #endif /* ONLRET */ 230*d0ef721eSBaptiste Daroussin #ifdef OFILL 231*d0ef721eSBaptiste Daroussin {"ofill", OFILL, MD_OUT}, 232*d0ef721eSBaptiste Daroussin #endif /* OFILL */ 233*d0ef721eSBaptiste Daroussin #ifdef OFDEL 234*d0ef721eSBaptiste Daroussin {"ofdel", OFDEL, MD_OUT}, 235*d0ef721eSBaptiste Daroussin #endif /* OFDEL */ 236*d0ef721eSBaptiste Daroussin #ifdef NLDLY 237*d0ef721eSBaptiste Daroussin {"nldly", NLDLY, MD_OUT}, 238*d0ef721eSBaptiste Daroussin #endif /* NLDLY */ 239*d0ef721eSBaptiste Daroussin #ifdef CRDLY 240*d0ef721eSBaptiste Daroussin {"crdly", CRDLY, MD_OUT}, 241*d0ef721eSBaptiste Daroussin #endif /* CRDLY */ 242*d0ef721eSBaptiste Daroussin #ifdef TABDLY 243*d0ef721eSBaptiste Daroussin {"tabdly", TABDLY, MD_OUT}, 244*d0ef721eSBaptiste Daroussin #endif /* TABDLY */ 245*d0ef721eSBaptiste Daroussin #ifdef XTABS 246*d0ef721eSBaptiste Daroussin {"xtabs", XTABS, MD_OUT}, 247*d0ef721eSBaptiste Daroussin #endif /* XTABS */ 248*d0ef721eSBaptiste Daroussin #ifdef BSDLY 249*d0ef721eSBaptiste Daroussin {"bsdly", BSDLY, MD_OUT}, 250*d0ef721eSBaptiste Daroussin #endif /* BSDLY */ 251*d0ef721eSBaptiste Daroussin #ifdef VTDLY 252*d0ef721eSBaptiste Daroussin {"vtdly", VTDLY, MD_OUT}, 253*d0ef721eSBaptiste Daroussin #endif /* VTDLY */ 254*d0ef721eSBaptiste Daroussin #ifdef FFDLY 255*d0ef721eSBaptiste Daroussin {"ffdly", FFDLY, MD_OUT}, 256*d0ef721eSBaptiste Daroussin #endif /* FFDLY */ 257*d0ef721eSBaptiste Daroussin #ifdef PAGEOUT 258*d0ef721eSBaptiste Daroussin {"pageout", PAGEOUT, MD_OUT}, 259*d0ef721eSBaptiste Daroussin #endif /* PAGEOUT */ 260*d0ef721eSBaptiste Daroussin #ifdef WRAP 261*d0ef721eSBaptiste Daroussin {"wrap", WRAP, MD_OUT}, 262*d0ef721eSBaptiste Daroussin #endif /* WRAP */ 263*d0ef721eSBaptiste Daroussin 264*d0ef721eSBaptiste Daroussin #ifdef CIGNORE 265*d0ef721eSBaptiste Daroussin {"cignore", CIGNORE, MD_CTL}, 266*d0ef721eSBaptiste Daroussin #endif /* CBAUD */ 267*d0ef721eSBaptiste Daroussin #ifdef CBAUD 268*d0ef721eSBaptiste Daroussin {"cbaud", CBAUD, MD_CTL}, 269*d0ef721eSBaptiste Daroussin #endif /* CBAUD */ 270*d0ef721eSBaptiste Daroussin #ifdef CSTOPB 271*d0ef721eSBaptiste Daroussin {"cstopb", CSTOPB, MD_CTL}, 272*d0ef721eSBaptiste Daroussin #endif /* CSTOPB */ 273*d0ef721eSBaptiste Daroussin #ifdef CREAD 274*d0ef721eSBaptiste Daroussin {"cread", CREAD, MD_CTL}, 275*d0ef721eSBaptiste Daroussin #endif /* CREAD */ 276*d0ef721eSBaptiste Daroussin #ifdef PARENB 277*d0ef721eSBaptiste Daroussin {"parenb", PARENB, MD_CTL}, 278*d0ef721eSBaptiste Daroussin #endif /* PARENB */ 279*d0ef721eSBaptiste Daroussin #ifdef PARODD 280*d0ef721eSBaptiste Daroussin {"parodd", PARODD, MD_CTL}, 281*d0ef721eSBaptiste Daroussin #endif /* PARODD */ 282*d0ef721eSBaptiste Daroussin #ifdef HUPCL 283*d0ef721eSBaptiste Daroussin {"hupcl", HUPCL, MD_CTL}, 284*d0ef721eSBaptiste Daroussin #endif /* HUPCL */ 285*d0ef721eSBaptiste Daroussin #ifdef CLOCAL 286*d0ef721eSBaptiste Daroussin {"clocal", CLOCAL, MD_CTL}, 287*d0ef721eSBaptiste Daroussin #endif /* CLOCAL */ 288*d0ef721eSBaptiste Daroussin #ifdef LOBLK 289*d0ef721eSBaptiste Daroussin {"loblk", LOBLK, MD_CTL}, 290*d0ef721eSBaptiste Daroussin #endif /* LOBLK */ 291*d0ef721eSBaptiste Daroussin #ifdef CIBAUD 292*d0ef721eSBaptiste Daroussin {"cibaud", CIBAUD, MD_CTL}, 293*d0ef721eSBaptiste Daroussin #endif /* CIBAUD */ 294*d0ef721eSBaptiste Daroussin #ifdef CRTSCTS 295*d0ef721eSBaptiste Daroussin #ifdef CCTS_OFLOW 296*d0ef721eSBaptiste Daroussin {"ccts_oflow", CCTS_OFLOW, MD_CTL}, 297*d0ef721eSBaptiste Daroussin #else 298*d0ef721eSBaptiste Daroussin {"crtscts", CRTSCTS, MD_CTL}, 299*d0ef721eSBaptiste Daroussin #endif /* CCTS_OFLOW */ 300*d0ef721eSBaptiste Daroussin #endif /* CRTSCTS */ 301*d0ef721eSBaptiste Daroussin #ifdef CRTS_IFLOW 302*d0ef721eSBaptiste Daroussin {"crts_iflow", CRTS_IFLOW, MD_CTL}, 303*d0ef721eSBaptiste Daroussin #endif /* CRTS_IFLOW */ 304*d0ef721eSBaptiste Daroussin #ifdef CDTRCTS 305*d0ef721eSBaptiste Daroussin {"cdtrcts", CDTRCTS, MD_CTL}, 306*d0ef721eSBaptiste Daroussin #endif /* CDTRCTS */ 307*d0ef721eSBaptiste Daroussin #ifdef MDMBUF 308*d0ef721eSBaptiste Daroussin {"mdmbuf", MDMBUF, MD_CTL}, 309*d0ef721eSBaptiste Daroussin #endif /* MDMBUF */ 310*d0ef721eSBaptiste Daroussin #ifdef RCV1EN 311*d0ef721eSBaptiste Daroussin {"rcv1en", RCV1EN, MD_CTL}, 312*d0ef721eSBaptiste Daroussin #endif /* RCV1EN */ 313*d0ef721eSBaptiste Daroussin #ifdef XMT1EN 314*d0ef721eSBaptiste Daroussin {"xmt1en", XMT1EN, MD_CTL}, 315*d0ef721eSBaptiste Daroussin #endif /* XMT1EN */ 316*d0ef721eSBaptiste Daroussin 317*d0ef721eSBaptiste Daroussin #ifdef ISIG 318*d0ef721eSBaptiste Daroussin {"isig", ISIG, MD_LIN}, 319*d0ef721eSBaptiste Daroussin #endif /* ISIG */ 320*d0ef721eSBaptiste Daroussin #ifdef ICANON 321*d0ef721eSBaptiste Daroussin {"icanon", ICANON, MD_LIN}, 322*d0ef721eSBaptiste Daroussin #endif /* ICANON */ 323*d0ef721eSBaptiste Daroussin #ifdef XCASE 324*d0ef721eSBaptiste Daroussin {"xcase", XCASE, MD_LIN}, 325*d0ef721eSBaptiste Daroussin #endif /* XCASE */ 326*d0ef721eSBaptiste Daroussin #ifdef ECHO 327*d0ef721eSBaptiste Daroussin {"echo", ECHO, MD_LIN}, 328*d0ef721eSBaptiste Daroussin #endif /* ECHO */ 329*d0ef721eSBaptiste Daroussin #ifdef ECHOE 330*d0ef721eSBaptiste Daroussin {"echoe", ECHOE, MD_LIN}, 331*d0ef721eSBaptiste Daroussin #endif /* ECHOE */ 332*d0ef721eSBaptiste Daroussin #ifdef ECHOK 333*d0ef721eSBaptiste Daroussin {"echok", ECHOK, MD_LIN}, 334*d0ef721eSBaptiste Daroussin #endif /* ECHOK */ 335*d0ef721eSBaptiste Daroussin #ifdef ECHONL 336*d0ef721eSBaptiste Daroussin {"echonl", ECHONL, MD_LIN}, 337*d0ef721eSBaptiste Daroussin #endif /* ECHONL */ 338*d0ef721eSBaptiste Daroussin #ifdef NOFLSH 339*d0ef721eSBaptiste Daroussin {"noflsh", NOFLSH, MD_LIN}, 340*d0ef721eSBaptiste Daroussin #endif /* NOFLSH */ 341*d0ef721eSBaptiste Daroussin #ifdef TOSTOP 342*d0ef721eSBaptiste Daroussin {"tostop", TOSTOP, MD_LIN}, 343*d0ef721eSBaptiste Daroussin #endif /* TOSTOP */ 344*d0ef721eSBaptiste Daroussin #ifdef ECHOCTL 345*d0ef721eSBaptiste Daroussin {"echoctl", ECHOCTL, MD_LIN}, 346*d0ef721eSBaptiste Daroussin #endif /* ECHOCTL */ 347*d0ef721eSBaptiste Daroussin #ifdef ECHOPRT 348*d0ef721eSBaptiste Daroussin {"echoprt", ECHOPRT, MD_LIN}, 349*d0ef721eSBaptiste Daroussin #endif /* ECHOPRT */ 350*d0ef721eSBaptiste Daroussin #ifdef ECHOKE 351*d0ef721eSBaptiste Daroussin {"echoke", ECHOKE, MD_LIN}, 352*d0ef721eSBaptiste Daroussin #endif /* ECHOKE */ 353*d0ef721eSBaptiste Daroussin #ifdef DEFECHO 354*d0ef721eSBaptiste Daroussin {"defecho", DEFECHO, MD_LIN}, 355*d0ef721eSBaptiste Daroussin #endif /* DEFECHO */ 356*d0ef721eSBaptiste Daroussin #ifdef FLUSHO 357*d0ef721eSBaptiste Daroussin {"flusho", FLUSHO, MD_LIN}, 358*d0ef721eSBaptiste Daroussin #endif /* FLUSHO */ 359*d0ef721eSBaptiste Daroussin #ifdef PENDIN 360*d0ef721eSBaptiste Daroussin {"pendin", PENDIN, MD_LIN}, 361*d0ef721eSBaptiste Daroussin #endif /* PENDIN */ 362*d0ef721eSBaptiste Daroussin #ifdef IEXTEN 363*d0ef721eSBaptiste Daroussin {"iexten", IEXTEN, MD_LIN}, 364*d0ef721eSBaptiste Daroussin #endif /* IEXTEN */ 365*d0ef721eSBaptiste Daroussin #ifdef NOKERNINFO 366*d0ef721eSBaptiste Daroussin {"nokerninfo", NOKERNINFO, MD_LIN}, 367*d0ef721eSBaptiste Daroussin #endif /* NOKERNINFO */ 368*d0ef721eSBaptiste Daroussin #ifdef ALTWERASE 369*d0ef721eSBaptiste Daroussin {"altwerase", ALTWERASE, MD_LIN}, 370*d0ef721eSBaptiste Daroussin #endif /* ALTWERASE */ 371*d0ef721eSBaptiste Daroussin #ifdef EXTPROC 372*d0ef721eSBaptiste Daroussin {"extproc", EXTPROC, MD_LIN}, 373*d0ef721eSBaptiste Daroussin #endif /* EXTPROC */ 374*d0ef721eSBaptiste Daroussin 375*d0ef721eSBaptiste Daroussin #if defined(VINTR) 376*d0ef721eSBaptiste Daroussin {"intr", C_SH(C_INTR), MD_CHAR}, 377*d0ef721eSBaptiste Daroussin #endif /* VINTR */ 378*d0ef721eSBaptiste Daroussin #if defined(VQUIT) 379*d0ef721eSBaptiste Daroussin {"quit", C_SH(C_QUIT), MD_CHAR}, 380*d0ef721eSBaptiste Daroussin #endif /* VQUIT */ 381*d0ef721eSBaptiste Daroussin #if defined(VERASE) 382*d0ef721eSBaptiste Daroussin {"erase", C_SH(C_ERASE), MD_CHAR}, 383*d0ef721eSBaptiste Daroussin #endif /* VERASE */ 384*d0ef721eSBaptiste Daroussin #if defined(VKILL) 385*d0ef721eSBaptiste Daroussin {"kill", C_SH(C_KILL), MD_CHAR}, 386*d0ef721eSBaptiste Daroussin #endif /* VKILL */ 387*d0ef721eSBaptiste Daroussin #if defined(VEOF) 388*d0ef721eSBaptiste Daroussin {"eof", C_SH(C_EOF), MD_CHAR}, 389*d0ef721eSBaptiste Daroussin #endif /* VEOF */ 390*d0ef721eSBaptiste Daroussin #if defined(VEOL) 391*d0ef721eSBaptiste Daroussin {"eol", C_SH(C_EOL), MD_CHAR}, 392*d0ef721eSBaptiste Daroussin #endif /* VEOL */ 393*d0ef721eSBaptiste Daroussin #if defined(VEOL2) 394*d0ef721eSBaptiste Daroussin {"eol2", C_SH(C_EOL2), MD_CHAR}, 395*d0ef721eSBaptiste Daroussin #endif /* VEOL2 */ 396*d0ef721eSBaptiste Daroussin #if defined(VSWTCH) 397*d0ef721eSBaptiste Daroussin {"swtch", C_SH(C_SWTCH), MD_CHAR}, 398*d0ef721eSBaptiste Daroussin #endif /* VSWTCH */ 399*d0ef721eSBaptiste Daroussin #if defined(VDSWTCH) 400*d0ef721eSBaptiste Daroussin {"dswtch", C_SH(C_DSWTCH), MD_CHAR}, 401*d0ef721eSBaptiste Daroussin #endif /* VDSWTCH */ 402*d0ef721eSBaptiste Daroussin #if defined(VERASE2) 403*d0ef721eSBaptiste Daroussin {"erase2", C_SH(C_ERASE2), MD_CHAR}, 404*d0ef721eSBaptiste Daroussin #endif /* VERASE2 */ 405*d0ef721eSBaptiste Daroussin #if defined(VSTART) 406*d0ef721eSBaptiste Daroussin {"start", C_SH(C_START), MD_CHAR}, 407*d0ef721eSBaptiste Daroussin #endif /* VSTART */ 408*d0ef721eSBaptiste Daroussin #if defined(VSTOP) 409*d0ef721eSBaptiste Daroussin {"stop", C_SH(C_STOP), MD_CHAR}, 410*d0ef721eSBaptiste Daroussin #endif /* VSTOP */ 411*d0ef721eSBaptiste Daroussin #if defined(VWERASE) 412*d0ef721eSBaptiste Daroussin {"werase", C_SH(C_WERASE), MD_CHAR}, 413*d0ef721eSBaptiste Daroussin #endif /* VWERASE */ 414*d0ef721eSBaptiste Daroussin #if defined(VSUSP) 415*d0ef721eSBaptiste Daroussin {"susp", C_SH(C_SUSP), MD_CHAR}, 416*d0ef721eSBaptiste Daroussin #endif /* VSUSP */ 417*d0ef721eSBaptiste Daroussin #if defined(VDSUSP) 418*d0ef721eSBaptiste Daroussin {"dsusp", C_SH(C_DSUSP), MD_CHAR}, 419*d0ef721eSBaptiste Daroussin #endif /* VDSUSP */ 420*d0ef721eSBaptiste Daroussin #if defined(VREPRINT) 421*d0ef721eSBaptiste Daroussin {"reprint", C_SH(C_REPRINT), MD_CHAR}, 422*d0ef721eSBaptiste Daroussin #endif /* VREPRINT */ 423*d0ef721eSBaptiste Daroussin #if defined(VDISCARD) 424*d0ef721eSBaptiste Daroussin {"discard", C_SH(C_DISCARD), MD_CHAR}, 425*d0ef721eSBaptiste Daroussin #endif /* VDISCARD */ 426*d0ef721eSBaptiste Daroussin #if defined(VLNEXT) 427*d0ef721eSBaptiste Daroussin {"lnext", C_SH(C_LNEXT), MD_CHAR}, 428*d0ef721eSBaptiste Daroussin #endif /* VLNEXT */ 429*d0ef721eSBaptiste Daroussin #if defined(VSTATUS) 430*d0ef721eSBaptiste Daroussin {"status", C_SH(C_STATUS), MD_CHAR}, 431*d0ef721eSBaptiste Daroussin #endif /* VSTATUS */ 432*d0ef721eSBaptiste Daroussin #if defined(VPAGE) 433*d0ef721eSBaptiste Daroussin {"page", C_SH(C_PAGE), MD_CHAR}, 434*d0ef721eSBaptiste Daroussin #endif /* VPAGE */ 435*d0ef721eSBaptiste Daroussin #if defined(VPGOFF) 436*d0ef721eSBaptiste Daroussin {"pgoff", C_SH(C_PGOFF), MD_CHAR}, 437*d0ef721eSBaptiste Daroussin #endif /* VPGOFF */ 438*d0ef721eSBaptiste Daroussin #if defined(VKILL2) 439*d0ef721eSBaptiste Daroussin {"kill2", C_SH(C_KILL2), MD_CHAR}, 440*d0ef721eSBaptiste Daroussin #endif /* VKILL2 */ 441*d0ef721eSBaptiste Daroussin #if defined(VBRK) 442*d0ef721eSBaptiste Daroussin {"brk", C_SH(C_BRK), MD_CHAR}, 443*d0ef721eSBaptiste Daroussin #endif /* VBRK */ 444*d0ef721eSBaptiste Daroussin #if defined(VMIN) 445*d0ef721eSBaptiste Daroussin {"min", C_SH(C_MIN), MD_CHAR}, 446*d0ef721eSBaptiste Daroussin #endif /* VMIN */ 447*d0ef721eSBaptiste Daroussin #if defined(VTIME) 448*d0ef721eSBaptiste Daroussin {"time", C_SH(C_TIME), MD_CHAR}, 449*d0ef721eSBaptiste Daroussin #endif /* VTIME */ 450*d0ef721eSBaptiste Daroussin {NULL, 0, -1}, 451*d0ef721eSBaptiste Daroussin }; 452*d0ef721eSBaptiste Daroussin 453*d0ef721eSBaptiste Daroussin 454*d0ef721eSBaptiste Daroussin 455*d0ef721eSBaptiste Daroussin #define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1) 456*d0ef721eSBaptiste Daroussin #define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8) 457*d0ef721eSBaptiste Daroussin #define tty__cooked_mode(td) ((td)->c_lflag & ICANON) 458*d0ef721eSBaptiste Daroussin 459*d0ef721eSBaptiste Daroussin static int tty_getty(EditLine *, struct termios *); 460*d0ef721eSBaptiste Daroussin static int tty_setty(EditLine *, int, const struct termios *); 461*d0ef721eSBaptiste Daroussin static int tty__getcharindex(int); 462*d0ef721eSBaptiste Daroussin static void tty__getchar(struct termios *, unsigned char *); 463*d0ef721eSBaptiste Daroussin static void tty__setchar(struct termios *, unsigned char *); 464*d0ef721eSBaptiste Daroussin static speed_t tty__getspeed(struct termios *); 465*d0ef721eSBaptiste Daroussin static int tty_setup(EditLine *); 466*d0ef721eSBaptiste Daroussin static void tty_setup_flags(EditLine *, struct termios *, int); 467*d0ef721eSBaptiste Daroussin 468*d0ef721eSBaptiste Daroussin #define t_qu t_ts 469*d0ef721eSBaptiste Daroussin 470*d0ef721eSBaptiste Daroussin /* tty_getty(): 471*d0ef721eSBaptiste Daroussin * Wrapper for tcgetattr to handle EINTR 472*d0ef721eSBaptiste Daroussin */ 473*d0ef721eSBaptiste Daroussin static int 474*d0ef721eSBaptiste Daroussin tty_getty(EditLine *el, struct termios *t) 475*d0ef721eSBaptiste Daroussin { 476*d0ef721eSBaptiste Daroussin int rv; 477*d0ef721eSBaptiste Daroussin while ((rv = tcgetattr(el->el_infd, t)) == -1 && errno == EINTR) 478*d0ef721eSBaptiste Daroussin continue; 479*d0ef721eSBaptiste Daroussin return rv; 480*d0ef721eSBaptiste Daroussin } 481*d0ef721eSBaptiste Daroussin 482*d0ef721eSBaptiste Daroussin /* tty_setty(): 483*d0ef721eSBaptiste Daroussin * Wrapper for tcsetattr to handle EINTR 484*d0ef721eSBaptiste Daroussin */ 485*d0ef721eSBaptiste Daroussin static int 486*d0ef721eSBaptiste Daroussin tty_setty(EditLine *el, int action, const struct termios *t) 487*d0ef721eSBaptiste Daroussin { 488*d0ef721eSBaptiste Daroussin int rv; 489*d0ef721eSBaptiste Daroussin while ((rv = tcsetattr(el->el_infd, action, t)) == -1 && errno == EINTR) 490*d0ef721eSBaptiste Daroussin continue; 491*d0ef721eSBaptiste Daroussin return rv; 492*d0ef721eSBaptiste Daroussin } 493*d0ef721eSBaptiste Daroussin 494*d0ef721eSBaptiste Daroussin /* tty_setup(): 495*d0ef721eSBaptiste Daroussin * Get the tty parameters and initialize the editing state 496*d0ef721eSBaptiste Daroussin */ 497*d0ef721eSBaptiste Daroussin static int 498*d0ef721eSBaptiste Daroussin tty_setup(EditLine *el) 499*d0ef721eSBaptiste Daroussin { 500*d0ef721eSBaptiste Daroussin int rst = (el->el_flags & NO_RESET) == 0; 501*d0ef721eSBaptiste Daroussin 502*d0ef721eSBaptiste Daroussin if (el->el_flags & EDIT_DISABLED) 503*d0ef721eSBaptiste Daroussin return 0; 504*d0ef721eSBaptiste Daroussin 505*d0ef721eSBaptiste Daroussin if (el->el_tty.t_initialized) 506*d0ef721eSBaptiste Daroussin return -1; 507*d0ef721eSBaptiste Daroussin 508*d0ef721eSBaptiste Daroussin if (!isatty(el->el_outfd)) { 509*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 510*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: isatty: %s\n", __func__, 511*d0ef721eSBaptiste Daroussin strerror(errno)); 512*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 513*d0ef721eSBaptiste Daroussin return -1; 514*d0ef721eSBaptiste Daroussin } 515*d0ef721eSBaptiste Daroussin if (tty_getty(el, &el->el_tty.t_or) == -1) { 516*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 517*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, 518*d0ef721eSBaptiste Daroussin strerror(errno)); 519*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 520*d0ef721eSBaptiste Daroussin return -1; 521*d0ef721eSBaptiste Daroussin } 522*d0ef721eSBaptiste Daroussin el->el_tty.t_ts = el->el_tty.t_ex = el->el_tty.t_ed = el->el_tty.t_or; 523*d0ef721eSBaptiste Daroussin 524*d0ef721eSBaptiste Daroussin el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ex); 525*d0ef721eSBaptiste Daroussin el->el_tty.t_tabs = tty__gettabs(&el->el_tty.t_ex); 526*d0ef721eSBaptiste Daroussin el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ex); 527*d0ef721eSBaptiste Daroussin 528*d0ef721eSBaptiste Daroussin tty_setup_flags(el, &el->el_tty.t_ex, EX_IO); 529*d0ef721eSBaptiste Daroussin 530*d0ef721eSBaptiste Daroussin /* 531*d0ef721eSBaptiste Daroussin * Reset the tty chars to reasonable defaults 532*d0ef721eSBaptiste Daroussin * If they are disabled, then enable them. 533*d0ef721eSBaptiste Daroussin */ 534*d0ef721eSBaptiste Daroussin if (rst) { 535*d0ef721eSBaptiste Daroussin if (tty__cooked_mode(&el->el_tty.t_ts)) { 536*d0ef721eSBaptiste Daroussin tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); 537*d0ef721eSBaptiste Daroussin /* 538*d0ef721eSBaptiste Daroussin * Don't affect CMIN and CTIME for the editor mode 539*d0ef721eSBaptiste Daroussin */ 540*d0ef721eSBaptiste Daroussin for (rst = 0; rst < C_NCC - 2; rst++) 541*d0ef721eSBaptiste Daroussin if (el->el_tty.t_c[TS_IO][rst] != 542*d0ef721eSBaptiste Daroussin el->el_tty.t_vdisable 543*d0ef721eSBaptiste Daroussin && el->el_tty.t_c[ED_IO][rst] != 544*d0ef721eSBaptiste Daroussin el->el_tty.t_vdisable) 545*d0ef721eSBaptiste Daroussin el->el_tty.t_c[ED_IO][rst] = 546*d0ef721eSBaptiste Daroussin el->el_tty.t_c[TS_IO][rst]; 547*d0ef721eSBaptiste Daroussin for (rst = 0; rst < C_NCC; rst++) 548*d0ef721eSBaptiste Daroussin if (el->el_tty.t_c[TS_IO][rst] != 549*d0ef721eSBaptiste Daroussin el->el_tty.t_vdisable) 550*d0ef721eSBaptiste Daroussin el->el_tty.t_c[EX_IO][rst] = 551*d0ef721eSBaptiste Daroussin el->el_tty.t_c[TS_IO][rst]; 552*d0ef721eSBaptiste Daroussin } 553*d0ef721eSBaptiste Daroussin tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); 554*d0ef721eSBaptiste Daroussin if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { 555*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 556*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", 557*d0ef721eSBaptiste Daroussin __func__, strerror(errno)); 558*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 559*d0ef721eSBaptiste Daroussin return -1; 560*d0ef721eSBaptiste Daroussin } 561*d0ef721eSBaptiste Daroussin } 562*d0ef721eSBaptiste Daroussin 563*d0ef721eSBaptiste Daroussin tty_setup_flags(el, &el->el_tty.t_ed, ED_IO); 564*d0ef721eSBaptiste Daroussin 565*d0ef721eSBaptiste Daroussin tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); 566*d0ef721eSBaptiste Daroussin tty_bind_char(el, 1); 567*d0ef721eSBaptiste Daroussin el->el_tty.t_initialized = 1; 568*d0ef721eSBaptiste Daroussin return 0; 569*d0ef721eSBaptiste Daroussin } 570*d0ef721eSBaptiste Daroussin 571*d0ef721eSBaptiste Daroussin libedit_private int 572*d0ef721eSBaptiste Daroussin tty_init(EditLine *el) 573*d0ef721eSBaptiste Daroussin { 574*d0ef721eSBaptiste Daroussin 575*d0ef721eSBaptiste Daroussin el->el_tty.t_mode = EX_IO; 576*d0ef721eSBaptiste Daroussin el->el_tty.t_vdisable = _POSIX_VDISABLE; 577*d0ef721eSBaptiste Daroussin el->el_tty.t_initialized = 0; 578*d0ef721eSBaptiste Daroussin (void) memcpy(el->el_tty.t_t, ttyperm, sizeof(ttyperm_t)); 579*d0ef721eSBaptiste Daroussin (void) memcpy(el->el_tty.t_c, ttychar, sizeof(ttychar_t)); 580*d0ef721eSBaptiste Daroussin return tty_setup(el); 581*d0ef721eSBaptiste Daroussin } 582*d0ef721eSBaptiste Daroussin 583*d0ef721eSBaptiste Daroussin 584*d0ef721eSBaptiste Daroussin /* tty_end(): 585*d0ef721eSBaptiste Daroussin * Restore the tty to its original settings 586*d0ef721eSBaptiste Daroussin */ 587*d0ef721eSBaptiste Daroussin libedit_private void 588*d0ef721eSBaptiste Daroussin /*ARGSUSED*/ 589*d0ef721eSBaptiste Daroussin tty_end(EditLine *el, int how) 590*d0ef721eSBaptiste Daroussin { 591*d0ef721eSBaptiste Daroussin if (el->el_flags & EDIT_DISABLED) 592*d0ef721eSBaptiste Daroussin return; 593*d0ef721eSBaptiste Daroussin 594*d0ef721eSBaptiste Daroussin if (!el->el_tty.t_initialized) 595*d0ef721eSBaptiste Daroussin return; 596*d0ef721eSBaptiste Daroussin 597*d0ef721eSBaptiste Daroussin if (tty_setty(el, how, &el->el_tty.t_or) == -1) 598*d0ef721eSBaptiste Daroussin { 599*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 600*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, 601*d0ef721eSBaptiste Daroussin "%s: tty_setty: %s\n", __func__, strerror(errno)); 602*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 603*d0ef721eSBaptiste Daroussin } 604*d0ef721eSBaptiste Daroussin } 605*d0ef721eSBaptiste Daroussin 606*d0ef721eSBaptiste Daroussin 607*d0ef721eSBaptiste Daroussin /* tty__getspeed(): 608*d0ef721eSBaptiste Daroussin * Get the tty speed 609*d0ef721eSBaptiste Daroussin */ 610*d0ef721eSBaptiste Daroussin static speed_t 611*d0ef721eSBaptiste Daroussin tty__getspeed(struct termios *td) 612*d0ef721eSBaptiste Daroussin { 613*d0ef721eSBaptiste Daroussin speed_t spd; 614*d0ef721eSBaptiste Daroussin 615*d0ef721eSBaptiste Daroussin if ((spd = cfgetispeed(td)) == 0) 616*d0ef721eSBaptiste Daroussin spd = cfgetospeed(td); 617*d0ef721eSBaptiste Daroussin return spd; 618*d0ef721eSBaptiste Daroussin } 619*d0ef721eSBaptiste Daroussin 620*d0ef721eSBaptiste Daroussin /* tty__getspeed(): 621*d0ef721eSBaptiste Daroussin * Return the index of the asked char in the c_cc array 622*d0ef721eSBaptiste Daroussin */ 623*d0ef721eSBaptiste Daroussin static int 624*d0ef721eSBaptiste Daroussin tty__getcharindex(int i) 625*d0ef721eSBaptiste Daroussin { 626*d0ef721eSBaptiste Daroussin switch (i) { 627*d0ef721eSBaptiste Daroussin #ifdef VINTR 628*d0ef721eSBaptiste Daroussin case C_INTR: 629*d0ef721eSBaptiste Daroussin return VINTR; 630*d0ef721eSBaptiste Daroussin #endif /* VINTR */ 631*d0ef721eSBaptiste Daroussin #ifdef VQUIT 632*d0ef721eSBaptiste Daroussin case C_QUIT: 633*d0ef721eSBaptiste Daroussin return VQUIT; 634*d0ef721eSBaptiste Daroussin #endif /* VQUIT */ 635*d0ef721eSBaptiste Daroussin #ifdef VERASE 636*d0ef721eSBaptiste Daroussin case C_ERASE: 637*d0ef721eSBaptiste Daroussin return VERASE; 638*d0ef721eSBaptiste Daroussin #endif /* VERASE */ 639*d0ef721eSBaptiste Daroussin #ifdef VKILL 640*d0ef721eSBaptiste Daroussin case C_KILL: 641*d0ef721eSBaptiste Daroussin return VKILL; 642*d0ef721eSBaptiste Daroussin #endif /* VKILL */ 643*d0ef721eSBaptiste Daroussin #ifdef VEOF 644*d0ef721eSBaptiste Daroussin case C_EOF: 645*d0ef721eSBaptiste Daroussin return VEOF; 646*d0ef721eSBaptiste Daroussin #endif /* VEOF */ 647*d0ef721eSBaptiste Daroussin #ifdef VEOL 648*d0ef721eSBaptiste Daroussin case C_EOL: 649*d0ef721eSBaptiste Daroussin return VEOL; 650*d0ef721eSBaptiste Daroussin #endif /* VEOL */ 651*d0ef721eSBaptiste Daroussin #ifdef VEOL2 652*d0ef721eSBaptiste Daroussin case C_EOL2: 653*d0ef721eSBaptiste Daroussin return VEOL2; 654*d0ef721eSBaptiste Daroussin #endif /* VEOL2 */ 655*d0ef721eSBaptiste Daroussin #ifdef VSWTCH 656*d0ef721eSBaptiste Daroussin case C_SWTCH: 657*d0ef721eSBaptiste Daroussin return VSWTCH; 658*d0ef721eSBaptiste Daroussin #endif /* VSWTCH */ 659*d0ef721eSBaptiste Daroussin #ifdef VDSWTCH 660*d0ef721eSBaptiste Daroussin case C_DSWTCH: 661*d0ef721eSBaptiste Daroussin return VDSWTCH; 662*d0ef721eSBaptiste Daroussin #endif /* VDSWTCH */ 663*d0ef721eSBaptiste Daroussin #ifdef VERASE2 664*d0ef721eSBaptiste Daroussin case C_ERASE2: 665*d0ef721eSBaptiste Daroussin return VERASE2; 666*d0ef721eSBaptiste Daroussin #endif /* VERASE2 */ 667*d0ef721eSBaptiste Daroussin #ifdef VSTART 668*d0ef721eSBaptiste Daroussin case C_START: 669*d0ef721eSBaptiste Daroussin return VSTART; 670*d0ef721eSBaptiste Daroussin #endif /* VSTART */ 671*d0ef721eSBaptiste Daroussin #ifdef VSTOP 672*d0ef721eSBaptiste Daroussin case C_STOP: 673*d0ef721eSBaptiste Daroussin return VSTOP; 674*d0ef721eSBaptiste Daroussin #endif /* VSTOP */ 675*d0ef721eSBaptiste Daroussin #ifdef VWERASE 676*d0ef721eSBaptiste Daroussin case C_WERASE: 677*d0ef721eSBaptiste Daroussin return VWERASE; 678*d0ef721eSBaptiste Daroussin #endif /* VWERASE */ 679*d0ef721eSBaptiste Daroussin #ifdef VSUSP 680*d0ef721eSBaptiste Daroussin case C_SUSP: 681*d0ef721eSBaptiste Daroussin return VSUSP; 682*d0ef721eSBaptiste Daroussin #endif /* VSUSP */ 683*d0ef721eSBaptiste Daroussin #ifdef VDSUSP 684*d0ef721eSBaptiste Daroussin case C_DSUSP: 685*d0ef721eSBaptiste Daroussin return VDSUSP; 686*d0ef721eSBaptiste Daroussin #endif /* VDSUSP */ 687*d0ef721eSBaptiste Daroussin #ifdef VREPRINT 688*d0ef721eSBaptiste Daroussin case C_REPRINT: 689*d0ef721eSBaptiste Daroussin return VREPRINT; 690*d0ef721eSBaptiste Daroussin #endif /* VREPRINT */ 691*d0ef721eSBaptiste Daroussin #ifdef VDISCARD 692*d0ef721eSBaptiste Daroussin case C_DISCARD: 693*d0ef721eSBaptiste Daroussin return VDISCARD; 694*d0ef721eSBaptiste Daroussin #endif /* VDISCARD */ 695*d0ef721eSBaptiste Daroussin #ifdef VLNEXT 696*d0ef721eSBaptiste Daroussin case C_LNEXT: 697*d0ef721eSBaptiste Daroussin return VLNEXT; 698*d0ef721eSBaptiste Daroussin #endif /* VLNEXT */ 699*d0ef721eSBaptiste Daroussin #ifdef VSTATUS 700*d0ef721eSBaptiste Daroussin case C_STATUS: 701*d0ef721eSBaptiste Daroussin return VSTATUS; 702*d0ef721eSBaptiste Daroussin #endif /* VSTATUS */ 703*d0ef721eSBaptiste Daroussin #ifdef VPAGE 704*d0ef721eSBaptiste Daroussin case C_PAGE: 705*d0ef721eSBaptiste Daroussin return VPAGE; 706*d0ef721eSBaptiste Daroussin #endif /* VPAGE */ 707*d0ef721eSBaptiste Daroussin #ifdef VPGOFF 708*d0ef721eSBaptiste Daroussin case C_PGOFF: 709*d0ef721eSBaptiste Daroussin return VPGOFF; 710*d0ef721eSBaptiste Daroussin #endif /* VPGOFF */ 711*d0ef721eSBaptiste Daroussin #ifdef VKILL2 712*d0ef721eSBaptiste Daroussin case C_KILL2: 713*d0ef721eSBaptiste Daroussin return VKILL2; 714*d0ef721eSBaptiste Daroussin #endif /* KILL2 */ 715*d0ef721eSBaptiste Daroussin #ifdef VMIN 716*d0ef721eSBaptiste Daroussin case C_MIN: 717*d0ef721eSBaptiste Daroussin return VMIN; 718*d0ef721eSBaptiste Daroussin #endif /* VMIN */ 719*d0ef721eSBaptiste Daroussin #ifdef VTIME 720*d0ef721eSBaptiste Daroussin case C_TIME: 721*d0ef721eSBaptiste Daroussin return VTIME; 722*d0ef721eSBaptiste Daroussin #endif /* VTIME */ 723*d0ef721eSBaptiste Daroussin default: 724*d0ef721eSBaptiste Daroussin return -1; 725*d0ef721eSBaptiste Daroussin } 726*d0ef721eSBaptiste Daroussin } 727*d0ef721eSBaptiste Daroussin 728*d0ef721eSBaptiste Daroussin /* tty__getchar(): 729*d0ef721eSBaptiste Daroussin * Get the tty characters 730*d0ef721eSBaptiste Daroussin */ 731*d0ef721eSBaptiste Daroussin static void 732*d0ef721eSBaptiste Daroussin tty__getchar(struct termios *td, unsigned char *s) 733*d0ef721eSBaptiste Daroussin { 734*d0ef721eSBaptiste Daroussin 735*d0ef721eSBaptiste Daroussin #ifdef VINTR 736*d0ef721eSBaptiste Daroussin s[C_INTR] = td->c_cc[VINTR]; 737*d0ef721eSBaptiste Daroussin #endif /* VINTR */ 738*d0ef721eSBaptiste Daroussin #ifdef VQUIT 739*d0ef721eSBaptiste Daroussin s[C_QUIT] = td->c_cc[VQUIT]; 740*d0ef721eSBaptiste Daroussin #endif /* VQUIT */ 741*d0ef721eSBaptiste Daroussin #ifdef VERASE 742*d0ef721eSBaptiste Daroussin s[C_ERASE] = td->c_cc[VERASE]; 743*d0ef721eSBaptiste Daroussin #endif /* VERASE */ 744*d0ef721eSBaptiste Daroussin #ifdef VKILL 745*d0ef721eSBaptiste Daroussin s[C_KILL] = td->c_cc[VKILL]; 746*d0ef721eSBaptiste Daroussin #endif /* VKILL */ 747*d0ef721eSBaptiste Daroussin #ifdef VEOF 748*d0ef721eSBaptiste Daroussin s[C_EOF] = td->c_cc[VEOF]; 749*d0ef721eSBaptiste Daroussin #endif /* VEOF */ 750*d0ef721eSBaptiste Daroussin #ifdef VEOL 751*d0ef721eSBaptiste Daroussin s[C_EOL] = td->c_cc[VEOL]; 752*d0ef721eSBaptiste Daroussin #endif /* VEOL */ 753*d0ef721eSBaptiste Daroussin #ifdef VEOL2 754*d0ef721eSBaptiste Daroussin s[C_EOL2] = td->c_cc[VEOL2]; 755*d0ef721eSBaptiste Daroussin #endif /* VEOL2 */ 756*d0ef721eSBaptiste Daroussin #ifdef VSWTCH 757*d0ef721eSBaptiste Daroussin s[C_SWTCH] = td->c_cc[VSWTCH]; 758*d0ef721eSBaptiste Daroussin #endif /* VSWTCH */ 759*d0ef721eSBaptiste Daroussin #ifdef VDSWTCH 760*d0ef721eSBaptiste Daroussin s[C_DSWTCH] = td->c_cc[VDSWTCH]; 761*d0ef721eSBaptiste Daroussin #endif /* VDSWTCH */ 762*d0ef721eSBaptiste Daroussin #ifdef VERASE2 763*d0ef721eSBaptiste Daroussin s[C_ERASE2] = td->c_cc[VERASE2]; 764*d0ef721eSBaptiste Daroussin #endif /* VERASE2 */ 765*d0ef721eSBaptiste Daroussin #ifdef VSTART 766*d0ef721eSBaptiste Daroussin s[C_START] = td->c_cc[VSTART]; 767*d0ef721eSBaptiste Daroussin #endif /* VSTART */ 768*d0ef721eSBaptiste Daroussin #ifdef VSTOP 769*d0ef721eSBaptiste Daroussin s[C_STOP] = td->c_cc[VSTOP]; 770*d0ef721eSBaptiste Daroussin #endif /* VSTOP */ 771*d0ef721eSBaptiste Daroussin #ifdef VWERASE 772*d0ef721eSBaptiste Daroussin s[C_WERASE] = td->c_cc[VWERASE]; 773*d0ef721eSBaptiste Daroussin #endif /* VWERASE */ 774*d0ef721eSBaptiste Daroussin #ifdef VSUSP 775*d0ef721eSBaptiste Daroussin s[C_SUSP] = td->c_cc[VSUSP]; 776*d0ef721eSBaptiste Daroussin #endif /* VSUSP */ 777*d0ef721eSBaptiste Daroussin #ifdef VDSUSP 778*d0ef721eSBaptiste Daroussin s[C_DSUSP] = td->c_cc[VDSUSP]; 779*d0ef721eSBaptiste Daroussin #endif /* VDSUSP */ 780*d0ef721eSBaptiste Daroussin #ifdef VREPRINT 781*d0ef721eSBaptiste Daroussin s[C_REPRINT] = td->c_cc[VREPRINT]; 782*d0ef721eSBaptiste Daroussin #endif /* VREPRINT */ 783*d0ef721eSBaptiste Daroussin #ifdef VDISCARD 784*d0ef721eSBaptiste Daroussin s[C_DISCARD] = td->c_cc[VDISCARD]; 785*d0ef721eSBaptiste Daroussin #endif /* VDISCARD */ 786*d0ef721eSBaptiste Daroussin #ifdef VLNEXT 787*d0ef721eSBaptiste Daroussin s[C_LNEXT] = td->c_cc[VLNEXT]; 788*d0ef721eSBaptiste Daroussin #endif /* VLNEXT */ 789*d0ef721eSBaptiste Daroussin #ifdef VSTATUS 790*d0ef721eSBaptiste Daroussin s[C_STATUS] = td->c_cc[VSTATUS]; 791*d0ef721eSBaptiste Daroussin #endif /* VSTATUS */ 792*d0ef721eSBaptiste Daroussin #ifdef VPAGE 793*d0ef721eSBaptiste Daroussin s[C_PAGE] = td->c_cc[VPAGE]; 794*d0ef721eSBaptiste Daroussin #endif /* VPAGE */ 795*d0ef721eSBaptiste Daroussin #ifdef VPGOFF 796*d0ef721eSBaptiste Daroussin s[C_PGOFF] = td->c_cc[VPGOFF]; 797*d0ef721eSBaptiste Daroussin #endif /* VPGOFF */ 798*d0ef721eSBaptiste Daroussin #ifdef VKILL2 799*d0ef721eSBaptiste Daroussin s[C_KILL2] = td->c_cc[VKILL2]; 800*d0ef721eSBaptiste Daroussin #endif /* KILL2 */ 801*d0ef721eSBaptiste Daroussin #ifdef VMIN 802*d0ef721eSBaptiste Daroussin s[C_MIN] = td->c_cc[VMIN]; 803*d0ef721eSBaptiste Daroussin #endif /* VMIN */ 804*d0ef721eSBaptiste Daroussin #ifdef VTIME 805*d0ef721eSBaptiste Daroussin s[C_TIME] = td->c_cc[VTIME]; 806*d0ef721eSBaptiste Daroussin #endif /* VTIME */ 807*d0ef721eSBaptiste Daroussin } /* tty__getchar */ 808*d0ef721eSBaptiste Daroussin 809*d0ef721eSBaptiste Daroussin 810*d0ef721eSBaptiste Daroussin /* tty__setchar(): 811*d0ef721eSBaptiste Daroussin * Set the tty characters 812*d0ef721eSBaptiste Daroussin */ 813*d0ef721eSBaptiste Daroussin static void 814*d0ef721eSBaptiste Daroussin tty__setchar(struct termios *td, unsigned char *s) 815*d0ef721eSBaptiste Daroussin { 816*d0ef721eSBaptiste Daroussin 817*d0ef721eSBaptiste Daroussin #ifdef VINTR 818*d0ef721eSBaptiste Daroussin td->c_cc[VINTR] = s[C_INTR]; 819*d0ef721eSBaptiste Daroussin #endif /* VINTR */ 820*d0ef721eSBaptiste Daroussin #ifdef VQUIT 821*d0ef721eSBaptiste Daroussin td->c_cc[VQUIT] = s[C_QUIT]; 822*d0ef721eSBaptiste Daroussin #endif /* VQUIT */ 823*d0ef721eSBaptiste Daroussin #ifdef VERASE 824*d0ef721eSBaptiste Daroussin td->c_cc[VERASE] = s[C_ERASE]; 825*d0ef721eSBaptiste Daroussin #endif /* VERASE */ 826*d0ef721eSBaptiste Daroussin #ifdef VKILL 827*d0ef721eSBaptiste Daroussin td->c_cc[VKILL] = s[C_KILL]; 828*d0ef721eSBaptiste Daroussin #endif /* VKILL */ 829*d0ef721eSBaptiste Daroussin #ifdef VEOF 830*d0ef721eSBaptiste Daroussin td->c_cc[VEOF] = s[C_EOF]; 831*d0ef721eSBaptiste Daroussin #endif /* VEOF */ 832*d0ef721eSBaptiste Daroussin #ifdef VEOL 833*d0ef721eSBaptiste Daroussin td->c_cc[VEOL] = s[C_EOL]; 834*d0ef721eSBaptiste Daroussin #endif /* VEOL */ 835*d0ef721eSBaptiste Daroussin #ifdef VEOL2 836*d0ef721eSBaptiste Daroussin td->c_cc[VEOL2] = s[C_EOL2]; 837*d0ef721eSBaptiste Daroussin #endif /* VEOL2 */ 838*d0ef721eSBaptiste Daroussin #ifdef VSWTCH 839*d0ef721eSBaptiste Daroussin td->c_cc[VSWTCH] = s[C_SWTCH]; 840*d0ef721eSBaptiste Daroussin #endif /* VSWTCH */ 841*d0ef721eSBaptiste Daroussin #ifdef VDSWTCH 842*d0ef721eSBaptiste Daroussin td->c_cc[VDSWTCH] = s[C_DSWTCH]; 843*d0ef721eSBaptiste Daroussin #endif /* VDSWTCH */ 844*d0ef721eSBaptiste Daroussin #ifdef VERASE2 845*d0ef721eSBaptiste Daroussin td->c_cc[VERASE2] = s[C_ERASE2]; 846*d0ef721eSBaptiste Daroussin #endif /* VERASE2 */ 847*d0ef721eSBaptiste Daroussin #ifdef VSTART 848*d0ef721eSBaptiste Daroussin td->c_cc[VSTART] = s[C_START]; 849*d0ef721eSBaptiste Daroussin #endif /* VSTART */ 850*d0ef721eSBaptiste Daroussin #ifdef VSTOP 851*d0ef721eSBaptiste Daroussin td->c_cc[VSTOP] = s[C_STOP]; 852*d0ef721eSBaptiste Daroussin #endif /* VSTOP */ 853*d0ef721eSBaptiste Daroussin #ifdef VWERASE 854*d0ef721eSBaptiste Daroussin td->c_cc[VWERASE] = s[C_WERASE]; 855*d0ef721eSBaptiste Daroussin #endif /* VWERASE */ 856*d0ef721eSBaptiste Daroussin #ifdef VSUSP 857*d0ef721eSBaptiste Daroussin td->c_cc[VSUSP] = s[C_SUSP]; 858*d0ef721eSBaptiste Daroussin #endif /* VSUSP */ 859*d0ef721eSBaptiste Daroussin #ifdef VDSUSP 860*d0ef721eSBaptiste Daroussin td->c_cc[VDSUSP] = s[C_DSUSP]; 861*d0ef721eSBaptiste Daroussin #endif /* VDSUSP */ 862*d0ef721eSBaptiste Daroussin #ifdef VREPRINT 863*d0ef721eSBaptiste Daroussin td->c_cc[VREPRINT] = s[C_REPRINT]; 864*d0ef721eSBaptiste Daroussin #endif /* VREPRINT */ 865*d0ef721eSBaptiste Daroussin #ifdef VDISCARD 866*d0ef721eSBaptiste Daroussin td->c_cc[VDISCARD] = s[C_DISCARD]; 867*d0ef721eSBaptiste Daroussin #endif /* VDISCARD */ 868*d0ef721eSBaptiste Daroussin #ifdef VLNEXT 869*d0ef721eSBaptiste Daroussin td->c_cc[VLNEXT] = s[C_LNEXT]; 870*d0ef721eSBaptiste Daroussin #endif /* VLNEXT */ 871*d0ef721eSBaptiste Daroussin #ifdef VSTATUS 872*d0ef721eSBaptiste Daroussin td->c_cc[VSTATUS] = s[C_STATUS]; 873*d0ef721eSBaptiste Daroussin #endif /* VSTATUS */ 874*d0ef721eSBaptiste Daroussin #ifdef VPAGE 875*d0ef721eSBaptiste Daroussin td->c_cc[VPAGE] = s[C_PAGE]; 876*d0ef721eSBaptiste Daroussin #endif /* VPAGE */ 877*d0ef721eSBaptiste Daroussin #ifdef VPGOFF 878*d0ef721eSBaptiste Daroussin td->c_cc[VPGOFF] = s[C_PGOFF]; 879*d0ef721eSBaptiste Daroussin #endif /* VPGOFF */ 880*d0ef721eSBaptiste Daroussin #ifdef VKILL2 881*d0ef721eSBaptiste Daroussin td->c_cc[VKILL2] = s[C_KILL2]; 882*d0ef721eSBaptiste Daroussin #endif /* VKILL2 */ 883*d0ef721eSBaptiste Daroussin #ifdef VMIN 884*d0ef721eSBaptiste Daroussin td->c_cc[VMIN] = s[C_MIN]; 885*d0ef721eSBaptiste Daroussin #endif /* VMIN */ 886*d0ef721eSBaptiste Daroussin #ifdef VTIME 887*d0ef721eSBaptiste Daroussin td->c_cc[VTIME] = s[C_TIME]; 888*d0ef721eSBaptiste Daroussin #endif /* VTIME */ 889*d0ef721eSBaptiste Daroussin } /* tty__setchar */ 890*d0ef721eSBaptiste Daroussin 891*d0ef721eSBaptiste Daroussin 892*d0ef721eSBaptiste Daroussin /* tty_bind_char(): 893*d0ef721eSBaptiste Daroussin * Rebind the editline functions 894*d0ef721eSBaptiste Daroussin */ 895*d0ef721eSBaptiste Daroussin libedit_private void 896*d0ef721eSBaptiste Daroussin tty_bind_char(EditLine *el, int force) 897*d0ef721eSBaptiste Daroussin { 898*d0ef721eSBaptiste Daroussin 899*d0ef721eSBaptiste Daroussin unsigned char *t_n = el->el_tty.t_c[ED_IO]; 900*d0ef721eSBaptiste Daroussin unsigned char *t_o = el->el_tty.t_ed.c_cc; 901*d0ef721eSBaptiste Daroussin wchar_t new[2], old[2]; 902*d0ef721eSBaptiste Daroussin const ttymap_t *tp; 903*d0ef721eSBaptiste Daroussin el_action_t *map, *alt; 904*d0ef721eSBaptiste Daroussin const el_action_t *dmap, *dalt; 905*d0ef721eSBaptiste Daroussin new[1] = old[1] = '\0'; 906*d0ef721eSBaptiste Daroussin 907*d0ef721eSBaptiste Daroussin map = el->el_map.key; 908*d0ef721eSBaptiste Daroussin alt = el->el_map.alt; 909*d0ef721eSBaptiste Daroussin if (el->el_map.type == MAP_VI) { 910*d0ef721eSBaptiste Daroussin dmap = el->el_map.vii; 911*d0ef721eSBaptiste Daroussin dalt = el->el_map.vic; 912*d0ef721eSBaptiste Daroussin } else { 913*d0ef721eSBaptiste Daroussin dmap = el->el_map.emacs; 914*d0ef721eSBaptiste Daroussin dalt = NULL; 915*d0ef721eSBaptiste Daroussin } 916*d0ef721eSBaptiste Daroussin 917*d0ef721eSBaptiste Daroussin for (tp = tty_map; tp->nch != (wint_t)-1; tp++) { 918*d0ef721eSBaptiste Daroussin new[0] = (wchar_t)t_n[tp->nch]; 919*d0ef721eSBaptiste Daroussin old[0] = (wchar_t)t_o[tp->och]; 920*d0ef721eSBaptiste Daroussin if (new[0] == old[0] && !force) 921*d0ef721eSBaptiste Daroussin continue; 922*d0ef721eSBaptiste Daroussin /* Put the old default binding back, and set the new binding */ 923*d0ef721eSBaptiste Daroussin keymacro_clear(el, map, old); 924*d0ef721eSBaptiste Daroussin map[(unsigned char)old[0]] = dmap[(unsigned char)old[0]]; 925*d0ef721eSBaptiste Daroussin keymacro_clear(el, map, new); 926*d0ef721eSBaptiste Daroussin /* MAP_VI == 1, MAP_EMACS == 0... */ 927*d0ef721eSBaptiste Daroussin map[(unsigned char)new[0]] = tp->bind[el->el_map.type]; 928*d0ef721eSBaptiste Daroussin if (dalt) { 929*d0ef721eSBaptiste Daroussin keymacro_clear(el, alt, old); 930*d0ef721eSBaptiste Daroussin alt[(unsigned char)old[0]] = 931*d0ef721eSBaptiste Daroussin dalt[(unsigned char)old[0]]; 932*d0ef721eSBaptiste Daroussin keymacro_clear(el, alt, new); 933*d0ef721eSBaptiste Daroussin alt[(unsigned char)new[0]] = 934*d0ef721eSBaptiste Daroussin tp->bind[el->el_map.type + 1]; 935*d0ef721eSBaptiste Daroussin } 936*d0ef721eSBaptiste Daroussin } 937*d0ef721eSBaptiste Daroussin } 938*d0ef721eSBaptiste Daroussin 939*d0ef721eSBaptiste Daroussin 940*d0ef721eSBaptiste Daroussin static tcflag_t * 941*d0ef721eSBaptiste Daroussin tty__get_flag(struct termios *t, int kind) { 942*d0ef721eSBaptiste Daroussin switch (kind) { 943*d0ef721eSBaptiste Daroussin case MD_INP: 944*d0ef721eSBaptiste Daroussin return &t->c_iflag; 945*d0ef721eSBaptiste Daroussin case MD_OUT: 946*d0ef721eSBaptiste Daroussin return &t->c_oflag; 947*d0ef721eSBaptiste Daroussin case MD_CTL: 948*d0ef721eSBaptiste Daroussin return &t->c_cflag; 949*d0ef721eSBaptiste Daroussin case MD_LIN: 950*d0ef721eSBaptiste Daroussin return &t->c_lflag; 951*d0ef721eSBaptiste Daroussin default: 952*d0ef721eSBaptiste Daroussin abort(); 953*d0ef721eSBaptiste Daroussin /*NOTREACHED*/ 954*d0ef721eSBaptiste Daroussin } 955*d0ef721eSBaptiste Daroussin } 956*d0ef721eSBaptiste Daroussin 957*d0ef721eSBaptiste Daroussin 958*d0ef721eSBaptiste Daroussin static tcflag_t 959*d0ef721eSBaptiste Daroussin tty_update_flag(EditLine *el, tcflag_t f, int mode, int kind) 960*d0ef721eSBaptiste Daroussin { 961*d0ef721eSBaptiste Daroussin f &= ~el->el_tty.t_t[mode][kind].t_clrmask; 962*d0ef721eSBaptiste Daroussin f |= el->el_tty.t_t[mode][kind].t_setmask; 963*d0ef721eSBaptiste Daroussin return f; 964*d0ef721eSBaptiste Daroussin } 965*d0ef721eSBaptiste Daroussin 966*d0ef721eSBaptiste Daroussin 967*d0ef721eSBaptiste Daroussin static void 968*d0ef721eSBaptiste Daroussin tty_update_flags(EditLine *el, int kind) 969*d0ef721eSBaptiste Daroussin { 970*d0ef721eSBaptiste Daroussin tcflag_t *tt, *ed, *ex; 971*d0ef721eSBaptiste Daroussin tt = tty__get_flag(&el->el_tty.t_ts, kind); 972*d0ef721eSBaptiste Daroussin ed = tty__get_flag(&el->el_tty.t_ed, kind); 973*d0ef721eSBaptiste Daroussin ex = tty__get_flag(&el->el_tty.t_ex, kind); 974*d0ef721eSBaptiste Daroussin 975*d0ef721eSBaptiste Daroussin if (*tt != *ex && (kind != MD_CTL || *tt != *ed)) { 976*d0ef721eSBaptiste Daroussin *ed = tty_update_flag(el, *tt, ED_IO, kind); 977*d0ef721eSBaptiste Daroussin *ex = tty_update_flag(el, *tt, EX_IO, kind); 978*d0ef721eSBaptiste Daroussin } 979*d0ef721eSBaptiste Daroussin } 980*d0ef721eSBaptiste Daroussin 981*d0ef721eSBaptiste Daroussin 982*d0ef721eSBaptiste Daroussin static void 983*d0ef721eSBaptiste Daroussin tty_update_char(EditLine *el, int mode, int c) { 984*d0ef721eSBaptiste Daroussin if (!((el->el_tty.t_t[mode][MD_CHAR].t_setmask & C_SH(c))) 985*d0ef721eSBaptiste Daroussin && (el->el_tty.t_c[TS_IO][c] != el->el_tty.t_c[EX_IO][c])) 986*d0ef721eSBaptiste Daroussin el->el_tty.t_c[mode][c] = el->el_tty.t_c[TS_IO][c]; 987*d0ef721eSBaptiste Daroussin if (el->el_tty.t_t[mode][MD_CHAR].t_clrmask & C_SH(c)) 988*d0ef721eSBaptiste Daroussin el->el_tty.t_c[mode][c] = el->el_tty.t_vdisable; 989*d0ef721eSBaptiste Daroussin } 990*d0ef721eSBaptiste Daroussin 991*d0ef721eSBaptiste Daroussin 992*d0ef721eSBaptiste Daroussin /* tty_rawmode(): 993*d0ef721eSBaptiste Daroussin * Set terminal into 1 character at a time mode. 994*d0ef721eSBaptiste Daroussin */ 995*d0ef721eSBaptiste Daroussin libedit_private int 996*d0ef721eSBaptiste Daroussin tty_rawmode(EditLine *el) 997*d0ef721eSBaptiste Daroussin { 998*d0ef721eSBaptiste Daroussin 999*d0ef721eSBaptiste Daroussin if (el->el_tty.t_mode == ED_IO || el->el_tty.t_mode == QU_IO) 1000*d0ef721eSBaptiste Daroussin return 0; 1001*d0ef721eSBaptiste Daroussin 1002*d0ef721eSBaptiste Daroussin if (el->el_flags & EDIT_DISABLED) 1003*d0ef721eSBaptiste Daroussin return 0; 1004*d0ef721eSBaptiste Daroussin 1005*d0ef721eSBaptiste Daroussin if (tty_getty(el, &el->el_tty.t_ts) == -1) { 1006*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 1007*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_getty: %s\n", __func__, 1008*d0ef721eSBaptiste Daroussin strerror(errno)); 1009*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 1010*d0ef721eSBaptiste Daroussin return -1; 1011*d0ef721eSBaptiste Daroussin } 1012*d0ef721eSBaptiste Daroussin /* 1013*d0ef721eSBaptiste Daroussin * We always keep up with the eight bit setting and the speed of the 1014*d0ef721eSBaptiste Daroussin * tty. But we only believe changes that are made to cooked mode! 1015*d0ef721eSBaptiste Daroussin */ 1016*d0ef721eSBaptiste Daroussin el->el_tty.t_eight = tty__geteightbit(&el->el_tty.t_ts); 1017*d0ef721eSBaptiste Daroussin el->el_tty.t_speed = tty__getspeed(&el->el_tty.t_ts); 1018*d0ef721eSBaptiste Daroussin 1019*d0ef721eSBaptiste Daroussin if (tty__getspeed(&el->el_tty.t_ex) != el->el_tty.t_speed || 1020*d0ef721eSBaptiste Daroussin tty__getspeed(&el->el_tty.t_ed) != el->el_tty.t_speed) { 1021*d0ef721eSBaptiste Daroussin (void) cfsetispeed(&el->el_tty.t_ex, el->el_tty.t_speed); 1022*d0ef721eSBaptiste Daroussin (void) cfsetospeed(&el->el_tty.t_ex, el->el_tty.t_speed); 1023*d0ef721eSBaptiste Daroussin (void) cfsetispeed(&el->el_tty.t_ed, el->el_tty.t_speed); 1024*d0ef721eSBaptiste Daroussin (void) cfsetospeed(&el->el_tty.t_ed, el->el_tty.t_speed); 1025*d0ef721eSBaptiste Daroussin } 1026*d0ef721eSBaptiste Daroussin if (tty__cooked_mode(&el->el_tty.t_ts)) { 1027*d0ef721eSBaptiste Daroussin int i; 1028*d0ef721eSBaptiste Daroussin 1029*d0ef721eSBaptiste Daroussin for (i = MD_INP; i <= MD_LIN; i++) 1030*d0ef721eSBaptiste Daroussin tty_update_flags(el, i); 1031*d0ef721eSBaptiste Daroussin 1032*d0ef721eSBaptiste Daroussin if (tty__gettabs(&el->el_tty.t_ex) == 0) 1033*d0ef721eSBaptiste Daroussin el->el_tty.t_tabs = 0; 1034*d0ef721eSBaptiste Daroussin else 1035*d0ef721eSBaptiste Daroussin el->el_tty.t_tabs = EL_CAN_TAB ? 1 : 0; 1036*d0ef721eSBaptiste Daroussin 1037*d0ef721eSBaptiste Daroussin tty__getchar(&el->el_tty.t_ts, el->el_tty.t_c[TS_IO]); 1038*d0ef721eSBaptiste Daroussin /* 1039*d0ef721eSBaptiste Daroussin * Check if the user made any changes. 1040*d0ef721eSBaptiste Daroussin * If he did, then propagate the changes to the 1041*d0ef721eSBaptiste Daroussin * edit and execute data structures. 1042*d0ef721eSBaptiste Daroussin */ 1043*d0ef721eSBaptiste Daroussin for (i = 0; i < C_NCC; i++) 1044*d0ef721eSBaptiste Daroussin if (el->el_tty.t_c[TS_IO][i] != 1045*d0ef721eSBaptiste Daroussin el->el_tty.t_c[EX_IO][i]) 1046*d0ef721eSBaptiste Daroussin break; 1047*d0ef721eSBaptiste Daroussin 1048*d0ef721eSBaptiste Daroussin if (i != C_NCC) { 1049*d0ef721eSBaptiste Daroussin /* 1050*d0ef721eSBaptiste Daroussin * Propagate changes only to the unlibedit_private 1051*d0ef721eSBaptiste Daroussin * chars that have been modified just now. 1052*d0ef721eSBaptiste Daroussin */ 1053*d0ef721eSBaptiste Daroussin for (i = 0; i < C_NCC; i++) 1054*d0ef721eSBaptiste Daroussin tty_update_char(el, ED_IO, i); 1055*d0ef721eSBaptiste Daroussin 1056*d0ef721eSBaptiste Daroussin tty_bind_char(el, 0); 1057*d0ef721eSBaptiste Daroussin tty__setchar(&el->el_tty.t_ed, el->el_tty.t_c[ED_IO]); 1058*d0ef721eSBaptiste Daroussin 1059*d0ef721eSBaptiste Daroussin for (i = 0; i < C_NCC; i++) 1060*d0ef721eSBaptiste Daroussin tty_update_char(el, EX_IO, i); 1061*d0ef721eSBaptiste Daroussin 1062*d0ef721eSBaptiste Daroussin tty__setchar(&el->el_tty.t_ex, el->el_tty.t_c[EX_IO]); 1063*d0ef721eSBaptiste Daroussin } 1064*d0ef721eSBaptiste Daroussin } 1065*d0ef721eSBaptiste Daroussin if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { 1066*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 1067*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1068*d0ef721eSBaptiste Daroussin strerror(errno)); 1069*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 1070*d0ef721eSBaptiste Daroussin return -1; 1071*d0ef721eSBaptiste Daroussin } 1072*d0ef721eSBaptiste Daroussin el->el_tty.t_mode = ED_IO; 1073*d0ef721eSBaptiste Daroussin return 0; 1074*d0ef721eSBaptiste Daroussin } 1075*d0ef721eSBaptiste Daroussin 1076*d0ef721eSBaptiste Daroussin 1077*d0ef721eSBaptiste Daroussin /* tty_cookedmode(): 1078*d0ef721eSBaptiste Daroussin * Set the tty back to normal mode 1079*d0ef721eSBaptiste Daroussin */ 1080*d0ef721eSBaptiste Daroussin libedit_private int 1081*d0ef721eSBaptiste Daroussin tty_cookedmode(EditLine *el) 1082*d0ef721eSBaptiste Daroussin { /* set tty in normal setup */ 1083*d0ef721eSBaptiste Daroussin 1084*d0ef721eSBaptiste Daroussin if (el->el_tty.t_mode == EX_IO) 1085*d0ef721eSBaptiste Daroussin return 0; 1086*d0ef721eSBaptiste Daroussin 1087*d0ef721eSBaptiste Daroussin if (el->el_flags & EDIT_DISABLED) 1088*d0ef721eSBaptiste Daroussin return 0; 1089*d0ef721eSBaptiste Daroussin 1090*d0ef721eSBaptiste Daroussin if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ex) == -1) { 1091*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 1092*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1093*d0ef721eSBaptiste Daroussin strerror(errno)); 1094*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 1095*d0ef721eSBaptiste Daroussin return -1; 1096*d0ef721eSBaptiste Daroussin } 1097*d0ef721eSBaptiste Daroussin el->el_tty.t_mode = EX_IO; 1098*d0ef721eSBaptiste Daroussin return 0; 1099*d0ef721eSBaptiste Daroussin } 1100*d0ef721eSBaptiste Daroussin 1101*d0ef721eSBaptiste Daroussin 1102*d0ef721eSBaptiste Daroussin /* tty_quotemode(): 1103*d0ef721eSBaptiste Daroussin * Turn on quote mode 1104*d0ef721eSBaptiste Daroussin */ 1105*d0ef721eSBaptiste Daroussin libedit_private int 1106*d0ef721eSBaptiste Daroussin tty_quotemode(EditLine *el) 1107*d0ef721eSBaptiste Daroussin { 1108*d0ef721eSBaptiste Daroussin if (el->el_tty.t_mode == QU_IO) 1109*d0ef721eSBaptiste Daroussin return 0; 1110*d0ef721eSBaptiste Daroussin 1111*d0ef721eSBaptiste Daroussin el->el_tty.t_qu = el->el_tty.t_ed; 1112*d0ef721eSBaptiste Daroussin 1113*d0ef721eSBaptiste Daroussin tty_setup_flags(el, &el->el_tty.t_qu, QU_IO); 1114*d0ef721eSBaptiste Daroussin 1115*d0ef721eSBaptiste Daroussin if (tty_setty(el, TCSADRAIN, &el->el_tty.t_qu) == -1) { 1116*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 1117*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1118*d0ef721eSBaptiste Daroussin strerror(errno)); 1119*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 1120*d0ef721eSBaptiste Daroussin return -1; 1121*d0ef721eSBaptiste Daroussin } 1122*d0ef721eSBaptiste Daroussin el->el_tty.t_mode = QU_IO; 1123*d0ef721eSBaptiste Daroussin return 0; 1124*d0ef721eSBaptiste Daroussin } 1125*d0ef721eSBaptiste Daroussin 1126*d0ef721eSBaptiste Daroussin 1127*d0ef721eSBaptiste Daroussin /* tty_noquotemode(): 1128*d0ef721eSBaptiste Daroussin * Turn off quote mode 1129*d0ef721eSBaptiste Daroussin */ 1130*d0ef721eSBaptiste Daroussin libedit_private int 1131*d0ef721eSBaptiste Daroussin tty_noquotemode(EditLine *el) 1132*d0ef721eSBaptiste Daroussin { 1133*d0ef721eSBaptiste Daroussin 1134*d0ef721eSBaptiste Daroussin if (el->el_tty.t_mode != QU_IO) 1135*d0ef721eSBaptiste Daroussin return 0; 1136*d0ef721eSBaptiste Daroussin if (tty_setty(el, TCSADRAIN, &el->el_tty.t_ed) == -1) { 1137*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 1138*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", __func__, 1139*d0ef721eSBaptiste Daroussin strerror(errno)); 1140*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 1141*d0ef721eSBaptiste Daroussin return -1; 1142*d0ef721eSBaptiste Daroussin } 1143*d0ef721eSBaptiste Daroussin el->el_tty.t_mode = ED_IO; 1144*d0ef721eSBaptiste Daroussin return 0; 1145*d0ef721eSBaptiste Daroussin } 1146*d0ef721eSBaptiste Daroussin 1147*d0ef721eSBaptiste Daroussin 1148*d0ef721eSBaptiste Daroussin /* tty_stty(): 1149*d0ef721eSBaptiste Daroussin * Stty builtin 1150*d0ef721eSBaptiste Daroussin */ 1151*d0ef721eSBaptiste Daroussin libedit_private int 1152*d0ef721eSBaptiste Daroussin /*ARGSUSED*/ 1153*d0ef721eSBaptiste Daroussin tty_stty(EditLine *el, int argc __attribute__((__unused__)), 1154*d0ef721eSBaptiste Daroussin const wchar_t **argv) 1155*d0ef721eSBaptiste Daroussin { 1156*d0ef721eSBaptiste Daroussin const ttymodes_t *m; 1157*d0ef721eSBaptiste Daroussin char x; 1158*d0ef721eSBaptiste Daroussin int aflag = 0; 1159*d0ef721eSBaptiste Daroussin const wchar_t *s, *d; 1160*d0ef721eSBaptiste Daroussin char name[EL_BUFSIZ]; 1161*d0ef721eSBaptiste Daroussin struct termios *tios = &el->el_tty.t_ex; 1162*d0ef721eSBaptiste Daroussin int z = EX_IO; 1163*d0ef721eSBaptiste Daroussin 1164*d0ef721eSBaptiste Daroussin if (argv == NULL) 1165*d0ef721eSBaptiste Daroussin return -1; 1166*d0ef721eSBaptiste Daroussin strncpy(name, ct_encode_string(*argv++, &el->el_scratch), sizeof(name)); 1167*d0ef721eSBaptiste Daroussin name[sizeof(name) - 1] = '\0'; 1168*d0ef721eSBaptiste Daroussin 1169*d0ef721eSBaptiste Daroussin while (argv && *argv && argv[0][0] == '-' && argv[0][2] == '\0') 1170*d0ef721eSBaptiste Daroussin switch (argv[0][1]) { 1171*d0ef721eSBaptiste Daroussin case 'a': 1172*d0ef721eSBaptiste Daroussin aflag++; 1173*d0ef721eSBaptiste Daroussin argv++; 1174*d0ef721eSBaptiste Daroussin break; 1175*d0ef721eSBaptiste Daroussin case 'd': 1176*d0ef721eSBaptiste Daroussin argv++; 1177*d0ef721eSBaptiste Daroussin tios = &el->el_tty.t_ed; 1178*d0ef721eSBaptiste Daroussin z = ED_IO; 1179*d0ef721eSBaptiste Daroussin break; 1180*d0ef721eSBaptiste Daroussin case 'x': 1181*d0ef721eSBaptiste Daroussin argv++; 1182*d0ef721eSBaptiste Daroussin tios = &el->el_tty.t_ex; 1183*d0ef721eSBaptiste Daroussin z = EX_IO; 1184*d0ef721eSBaptiste Daroussin break; 1185*d0ef721eSBaptiste Daroussin case 'q': 1186*d0ef721eSBaptiste Daroussin argv++; 1187*d0ef721eSBaptiste Daroussin tios = &el->el_tty.t_ts; 1188*d0ef721eSBaptiste Daroussin z = QU_IO; 1189*d0ef721eSBaptiste Daroussin break; 1190*d0ef721eSBaptiste Daroussin default: 1191*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, 1192*d0ef721eSBaptiste Daroussin "%s: Unknown switch `%lc'.\n", 1193*d0ef721eSBaptiste Daroussin name, (wint_t)argv[0][1]); 1194*d0ef721eSBaptiste Daroussin return -1; 1195*d0ef721eSBaptiste Daroussin } 1196*d0ef721eSBaptiste Daroussin 1197*d0ef721eSBaptiste Daroussin if (!argv || !*argv) { 1198*d0ef721eSBaptiste Daroussin int i = -1; 1199*d0ef721eSBaptiste Daroussin size_t len = 0, st = 0, cu; 1200*d0ef721eSBaptiste Daroussin for (m = ttymodes; m->m_name; m++) { 1201*d0ef721eSBaptiste Daroussin if (m->m_type != i) { 1202*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_outfile, "%s%s", 1203*d0ef721eSBaptiste Daroussin i != -1 ? "\n" : "", 1204*d0ef721eSBaptiste Daroussin el->el_tty.t_t[z][m->m_type].t_name); 1205*d0ef721eSBaptiste Daroussin i = m->m_type; 1206*d0ef721eSBaptiste Daroussin st = len = 1207*d0ef721eSBaptiste Daroussin strlen(el->el_tty.t_t[z][m->m_type].t_name); 1208*d0ef721eSBaptiste Daroussin } 1209*d0ef721eSBaptiste Daroussin if (i != -1) { 1210*d0ef721eSBaptiste Daroussin x = (el->el_tty.t_t[z][i].t_setmask & m->m_value) 1211*d0ef721eSBaptiste Daroussin ? '+' : '\0'; 1212*d0ef721eSBaptiste Daroussin 1213*d0ef721eSBaptiste Daroussin if (el->el_tty.t_t[z][i].t_clrmask & m->m_value) 1214*d0ef721eSBaptiste Daroussin x = '-'; 1215*d0ef721eSBaptiste Daroussin } else { 1216*d0ef721eSBaptiste Daroussin x = '\0'; 1217*d0ef721eSBaptiste Daroussin } 1218*d0ef721eSBaptiste Daroussin 1219*d0ef721eSBaptiste Daroussin if (x != '\0' || aflag) { 1220*d0ef721eSBaptiste Daroussin 1221*d0ef721eSBaptiste Daroussin cu = strlen(m->m_name) + (x != '\0') + 1; 1222*d0ef721eSBaptiste Daroussin 1223*d0ef721eSBaptiste Daroussin if (len + cu >= 1224*d0ef721eSBaptiste Daroussin (size_t)el->el_terminal.t_size.h) { 1225*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_outfile, "\n%*s", 1226*d0ef721eSBaptiste Daroussin (int)st, ""); 1227*d0ef721eSBaptiste Daroussin len = st + cu; 1228*d0ef721eSBaptiste Daroussin } else 1229*d0ef721eSBaptiste Daroussin len += cu; 1230*d0ef721eSBaptiste Daroussin 1231*d0ef721eSBaptiste Daroussin if (x != '\0') 1232*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_outfile, "%c%s ", 1233*d0ef721eSBaptiste Daroussin x, m->m_name); 1234*d0ef721eSBaptiste Daroussin else 1235*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_outfile, "%s ", 1236*d0ef721eSBaptiste Daroussin m->m_name); 1237*d0ef721eSBaptiste Daroussin } 1238*d0ef721eSBaptiste Daroussin } 1239*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_outfile, "\n"); 1240*d0ef721eSBaptiste Daroussin return 0; 1241*d0ef721eSBaptiste Daroussin } 1242*d0ef721eSBaptiste Daroussin while (argv && (s = *argv++)) { 1243*d0ef721eSBaptiste Daroussin const wchar_t *p; 1244*d0ef721eSBaptiste Daroussin switch (*s) { 1245*d0ef721eSBaptiste Daroussin case '+': 1246*d0ef721eSBaptiste Daroussin case '-': 1247*d0ef721eSBaptiste Daroussin x = (char)*s++; 1248*d0ef721eSBaptiste Daroussin break; 1249*d0ef721eSBaptiste Daroussin default: 1250*d0ef721eSBaptiste Daroussin x = '\0'; 1251*d0ef721eSBaptiste Daroussin break; 1252*d0ef721eSBaptiste Daroussin } 1253*d0ef721eSBaptiste Daroussin d = s; 1254*d0ef721eSBaptiste Daroussin p = wcschr(s, L'='); 1255*d0ef721eSBaptiste Daroussin for (m = ttymodes; m->m_name; m++) 1256*d0ef721eSBaptiste Daroussin if ((p ? strncmp(m->m_name, ct_encode_string(d, 1257*d0ef721eSBaptiste Daroussin &el->el_scratch), (size_t)(p - d)) : 1258*d0ef721eSBaptiste Daroussin strcmp(m->m_name, ct_encode_string(d, 1259*d0ef721eSBaptiste Daroussin &el->el_scratch))) == 0 && 1260*d0ef721eSBaptiste Daroussin (p == NULL || m->m_type == MD_CHAR)) 1261*d0ef721eSBaptiste Daroussin break; 1262*d0ef721eSBaptiste Daroussin 1263*d0ef721eSBaptiste Daroussin if (!m->m_name) { 1264*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, 1265*d0ef721eSBaptiste Daroussin "%s: Invalid argument `%ls'.\n", name, d); 1266*d0ef721eSBaptiste Daroussin return -1; 1267*d0ef721eSBaptiste Daroussin } 1268*d0ef721eSBaptiste Daroussin if (p) { 1269*d0ef721eSBaptiste Daroussin int c = ffs((int)m->m_value); 1270*d0ef721eSBaptiste Daroussin int v = *++p ? parse__escape(&p) : 1271*d0ef721eSBaptiste Daroussin el->el_tty.t_vdisable; 1272*d0ef721eSBaptiste Daroussin assert(c != 0); 1273*d0ef721eSBaptiste Daroussin c--; 1274*d0ef721eSBaptiste Daroussin c = tty__getcharindex(c); 1275*d0ef721eSBaptiste Daroussin assert(c != -1); 1276*d0ef721eSBaptiste Daroussin tios->c_cc[c] = (cc_t)v; 1277*d0ef721eSBaptiste Daroussin continue; 1278*d0ef721eSBaptiste Daroussin } 1279*d0ef721eSBaptiste Daroussin switch (x) { 1280*d0ef721eSBaptiste Daroussin case '+': 1281*d0ef721eSBaptiste Daroussin el->el_tty.t_t[z][m->m_type].t_setmask |= m->m_value; 1282*d0ef721eSBaptiste Daroussin el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; 1283*d0ef721eSBaptiste Daroussin break; 1284*d0ef721eSBaptiste Daroussin case '-': 1285*d0ef721eSBaptiste Daroussin el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; 1286*d0ef721eSBaptiste Daroussin el->el_tty.t_t[z][m->m_type].t_clrmask |= m->m_value; 1287*d0ef721eSBaptiste Daroussin break; 1288*d0ef721eSBaptiste Daroussin default: 1289*d0ef721eSBaptiste Daroussin el->el_tty.t_t[z][m->m_type].t_setmask &= ~m->m_value; 1290*d0ef721eSBaptiste Daroussin el->el_tty.t_t[z][m->m_type].t_clrmask &= ~m->m_value; 1291*d0ef721eSBaptiste Daroussin break; 1292*d0ef721eSBaptiste Daroussin } 1293*d0ef721eSBaptiste Daroussin } 1294*d0ef721eSBaptiste Daroussin 1295*d0ef721eSBaptiste Daroussin tty_setup_flags(el, tios, z); 1296*d0ef721eSBaptiste Daroussin if (el->el_tty.t_mode == z) { 1297*d0ef721eSBaptiste Daroussin if (tty_setty(el, TCSADRAIN, tios) == -1) { 1298*d0ef721eSBaptiste Daroussin #ifdef DEBUG_TTY 1299*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s: tty_setty: %s\n", 1300*d0ef721eSBaptiste Daroussin __func__, strerror(errno)); 1301*d0ef721eSBaptiste Daroussin #endif /* DEBUG_TTY */ 1302*d0ef721eSBaptiste Daroussin return -1; 1303*d0ef721eSBaptiste Daroussin } 1304*d0ef721eSBaptiste Daroussin } 1305*d0ef721eSBaptiste Daroussin 1306*d0ef721eSBaptiste Daroussin return 0; 1307*d0ef721eSBaptiste Daroussin } 1308*d0ef721eSBaptiste Daroussin 1309*d0ef721eSBaptiste Daroussin 1310*d0ef721eSBaptiste Daroussin #ifdef notyet 1311*d0ef721eSBaptiste Daroussin /* tty_printchar(): 1312*d0ef721eSBaptiste Daroussin * DEbugging routine to print the tty characters 1313*d0ef721eSBaptiste Daroussin */ 1314*d0ef721eSBaptiste Daroussin static void 1315*d0ef721eSBaptiste Daroussin tty_printchar(EditLine *el, unsigned char *s) 1316*d0ef721eSBaptiste Daroussin { 1317*d0ef721eSBaptiste Daroussin ttyperm_t *m; 1318*d0ef721eSBaptiste Daroussin int i; 1319*d0ef721eSBaptiste Daroussin 1320*d0ef721eSBaptiste Daroussin for (i = 0; i < C_NCC; i++) { 1321*d0ef721eSBaptiste Daroussin for (m = el->el_tty.t_t; m->m_name; m++) 1322*d0ef721eSBaptiste Daroussin if (m->m_type == MD_CHAR && C_SH(i) == m->m_value) 1323*d0ef721eSBaptiste Daroussin break; 1324*d0ef721eSBaptiste Daroussin if (m->m_name) 1325*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "%s ^%c ", 1326*d0ef721eSBaptiste Daroussin m->m_name, s[i] + 'A' - 1); 1327*d0ef721eSBaptiste Daroussin if (i % 5 == 0) 1328*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "\n"); 1329*d0ef721eSBaptiste Daroussin } 1330*d0ef721eSBaptiste Daroussin (void) fprintf(el->el_errfile, "\n"); 1331*d0ef721eSBaptiste Daroussin } 1332*d0ef721eSBaptiste Daroussin #endif /* notyet */ 1333*d0ef721eSBaptiste Daroussin 1334*d0ef721eSBaptiste Daroussin 1335*d0ef721eSBaptiste Daroussin static void 1336*d0ef721eSBaptiste Daroussin tty_setup_flags(EditLine *el, struct termios *tios, int mode) 1337*d0ef721eSBaptiste Daroussin { 1338*d0ef721eSBaptiste Daroussin int kind; 1339*d0ef721eSBaptiste Daroussin for (kind = MD_INP; kind <= MD_LIN; kind++) { 1340*d0ef721eSBaptiste Daroussin tcflag_t *f = tty__get_flag(tios, kind); 1341*d0ef721eSBaptiste Daroussin *f = tty_update_flag(el, *f, mode, kind); 1342*d0ef721eSBaptiste Daroussin } 1343*d0ef721eSBaptiste Daroussin } 1344*d0ef721eSBaptiste Daroussin 1345*d0ef721eSBaptiste Daroussin libedit_private int 1346*d0ef721eSBaptiste Daroussin tty_get_signal_character(EditLine *el, int sig) 1347*d0ef721eSBaptiste Daroussin { 1348*d0ef721eSBaptiste Daroussin #ifdef ECHOCTL 1349*d0ef721eSBaptiste Daroussin tcflag_t *ed = tty__get_flag(&el->el_tty.t_ed, MD_INP); 1350*d0ef721eSBaptiste Daroussin if ((*ed & ECHOCTL) == 0) 1351*d0ef721eSBaptiste Daroussin return -1; 1352*d0ef721eSBaptiste Daroussin #endif 1353*d0ef721eSBaptiste Daroussin switch (sig) { 1354*d0ef721eSBaptiste Daroussin #ifdef SIGINT 1355*d0ef721eSBaptiste Daroussin case SIGINT: 1356*d0ef721eSBaptiste Daroussin return el->el_tty.t_c[ED_IO][VINTR]; 1357*d0ef721eSBaptiste Daroussin #endif 1358*d0ef721eSBaptiste Daroussin #ifdef SIGQUIT 1359*d0ef721eSBaptiste Daroussin case SIGQUIT: 1360*d0ef721eSBaptiste Daroussin return el->el_tty.t_c[ED_IO][VQUIT]; 1361*d0ef721eSBaptiste Daroussin #endif 1362*d0ef721eSBaptiste Daroussin #ifdef SIGINFO 1363*d0ef721eSBaptiste Daroussin case SIGINFO: 1364*d0ef721eSBaptiste Daroussin return el->el_tty.t_c[ED_IO][VSTATUS]; 1365*d0ef721eSBaptiste Daroussin #endif 1366*d0ef721eSBaptiste Daroussin #ifdef SIGTSTP 1367*d0ef721eSBaptiste Daroussin case SIGTSTP: 1368*d0ef721eSBaptiste Daroussin return el->el_tty.t_c[ED_IO][VSUSP]; 1369*d0ef721eSBaptiste Daroussin #endif 1370*d0ef721eSBaptiste Daroussin default: 1371*d0ef721eSBaptiste Daroussin return -1; 1372*d0ef721eSBaptiste Daroussin } 1373*d0ef721eSBaptiste Daroussin } 1374