* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
* This code is derived from software contributed to Berkeley by
* Christos Zoulas of Cornell University.
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
#if !defined(lint) && !defined(SCCSID)
static char sccsid
[] = "@(#)tty.c 8.1 (Berkeley) 6/4/93";
#endif /* not lint && not SCCSID */
* tty.c: tty interface stuff
typedef struct ttymodes_t
{
typedef struct ttymap_t
{
int nch
, och
; /* Internal and termio rep of chars */
el_action_t bind
[3]; /* emacs, vi, and vi-cmd */
private ttyperm_t ttyperm
= {
{ "iflag:", ICRNL
, (INLCR
|IGNCR
) },
{ "oflag:", (OPOST
|ONLCR
), ONLRET
},
{ "lflag:", (ISIG
|ICANON
|ECHO
|ECHOE
|ECHOCTL
|IEXTEN
),
(NOFLSH
|ECHONL
|EXTPROC
|FLUSHO
) },
{ "iflag:", (INLCR
|ICRNL
), IGNCR
},
{ "oflag:", (OPOST
|ONLCR
), ONLRET
},
(NOFLSH
|ICANON
|ECHO
|ECHOK
|ECHONL
|EXTPROC
|IEXTEN
|FLUSHO
) },
{ "chars:", (C_SH(C_MIN
)|C_SH(C_TIME
)|C_SH(C_SWTCH
)|C_SH(C_DSWTCH
)|
C_SH(C_SUSP
)|C_SH(C_DSUSP
)|C_SH(C_EOL
)|C_SH(C_DISCARD
)|
C_SH(C_PGOFF
)|C_SH(C_PAGE
)|C_SH(C_STATUS
)), 0 }
{ "iflag:", 0, IXON
| IXOFF
},
{ "lflag:", 0, ISIG
| IEXTEN
},
private ttychar_t ttychar
= {
CINTR
, CQUIT
, CERASE
, CKILL
,
CEOF
, CEOL
, CEOL2
, CSWTCH
,
CDSWTCH
, CERASE2
, CSTART
, CSTOP
,
CWERASE
, CSUSP
, CDSUSP
, CREPRINT
,
CDISCARD
, CLNEXT
, CSTATUS
, CPAGE
,
CPGOFF
, CKILL2
, CBRK
, CMIN
,
CINTR
, CQUIT
, CERASE
, CKILL
,
_POSIX_VDISABLE
, _POSIX_VDISABLE
, _POSIX_VDISABLE
, _POSIX_VDISABLE
,
_POSIX_VDISABLE
, CERASE2
, CSTART
, CSTOP
,
_POSIX_VDISABLE
, CSUSP
, _POSIX_VDISABLE
, _POSIX_VDISABLE
,
CDISCARD
, _POSIX_VDISABLE
, _POSIX_VDISABLE
, _POSIX_VDISABLE
,
_POSIX_VDISABLE
, _POSIX_VDISABLE
, _POSIX_VDISABLE
, 1,
private ttymap_t tty_map
[] = {
{ ED_DELETE_PREV_CHAR
, VI_DELETE_PREV_CHAR
, ED_PREV_CHAR
} },
{ ED_DELETE_PREV_CHAR
, VI_DELETE_PREV_CHAR
, ED_PREV_CHAR
} },
{ EM_KILL_LINE
, VI_KILL_LINE_PREV
, ED_UNASSIGNED
} },
{ EM_KILL_LINE
, VI_KILL_LINE_PREV
, ED_UNASSIGNED
} },
{ EM_DELETE_OR_LIST
, VI_LIST_OR_EOF
, ED_UNASSIGNED
} },
{ ED_DELETE_PREV_WORD
, ED_DELETE_PREV_WORD
, ED_PREV_WORD
} },
{ ED_REDISPLAY
, ED_INSERT
, ED_REDISPLAY
} },
{ ED_QUOTED_INSERT
, ED_QUOTED_INSERT
, ED_UNASSIGNED
} },
{ ED_UNASSIGNED
, ED_UNASSIGNED
, ED_UNASSIGNED
} }
private ttymodes_t ttymodes
[] = {
{ "ignbrk", IGNBRK
, M_INP
},
{ "brkint", BRKINT
, M_INP
},
{ "ignpar", IGNPAR
, M_INP
},
{ "parmrk", PARMRK
, M_INP
},
{ "inpck", INPCK
, M_INP
},
{ "istrip", ISTRIP
, M_INP
},
{ "inlcr", INLCR
, M_INP
},
{ "igncr", IGNCR
, M_INP
},
{ "icrnl", ICRNL
, M_INP
},
{ "iuclc", IUCLC
, M_INP
},
{ "ixany", IXANY
, M_INP
},
{ "ixoff", IXOFF
, M_INP
},
{ "imaxbel",IMAXBEL
,M_INP
},
{ "opost", OPOST
, M_OUT
},
{ "olcuc", OLCUC
, M_OUT
},
{ "onlcr", ONLCR
, M_OUT
},
{ "ocrnl", OCRNL
, M_OUT
},
{ "onocr", ONOCR
, M_OUT
},
{ "onoeot", ONOEOT
, M_OUT
},
{ "onlret", ONLRET
, M_OUT
},
{ "ofill", OFILL
, M_OUT
},
{ "ofdel", OFDEL
, M_OUT
},
{ "nldly", NLDLY
, M_OUT
},
{ "crdly", CRDLY
, M_OUT
},
{ "tabdly", TABDLY
, M_OUT
},
{ "xtabs", XTABS
, M_OUT
},
{ "bsdly", BSDLY
, M_OUT
},
{ "vtdly", VTDLY
, M_OUT
},
{ "ffdly", FFDLY
, M_OUT
},
{ "pageout",PAGEOUT
,M_OUT
},
{ "cignore",CIGNORE
,M_CTL
},
{ "cbaud", CBAUD
, M_CTL
},
{ "cstopb", CSTOPB
, M_CTL
},
{ "cread", CREAD
, M_CTL
},
{ "parenb", PARENB
, M_CTL
},
{ "parodd", PARODD
, M_CTL
},
{ "hupcl", HUPCL
, M_CTL
},
{ "clocal", CLOCAL
, M_CTL
},
{ "loblk", LOBLK
, M_CTL
},
{ "cibaud", CIBAUD
, M_CTL
},
{ "ccts_oflow",CCTS_OFLOW
,M_CTL
},
{ "crtscts",CRTSCTS
,M_CTL
},
{ "crts_iflow",CRTS_IFLOW
,M_CTL
},
{ "mdmbuf", MDMBUF
, M_CTL
},
{ "rcv1en", RCV1EN
, M_CTL
},
{ "xmt1en", XMT1EN
, M_CTL
},
{ "icanon", ICANON
, M_LIN
},
{ "xcase", XCASE
, M_LIN
},
{ "echoe", ECHOE
, M_LIN
},
{ "echok", ECHOK
, M_LIN
},
{ "echonl", ECHONL
, M_LIN
},
{ "noflsh", NOFLSH
, M_LIN
},
{ "tostop", TOSTOP
, M_LIN
},
{ "echoctl",ECHOCTL
,M_LIN
},
{ "echoprt",ECHOPRT
,M_LIN
},
{ "echoke", ECHOKE
, M_LIN
},
{ "defecho",DEFECHO
,M_LIN
},
{ "flusho", FLUSHO
, M_LIN
},
{ "pendin", PENDIN
, M_LIN
},
{ "iexten", IEXTEN
, M_LIN
},
{ "nokerninfo",NOKERNINFO
,M_LIN
},
{ "altwerase",ALTWERASE
,M_LIN
},
{ "extproc",EXTPROC
, M_LIN
},
{ "intr", C_SH(C_INTR
), M_CHAR
},
{ "quit", C_SH(C_QUIT
), M_CHAR
},
{ "erase", C_SH(C_ERASE
), M_CHAR
},
{ "kill", C_SH(C_KILL
), M_CHAR
},
{ "eof", C_SH(C_EOF
), M_CHAR
},
{ "eol", C_SH(C_EOL
), M_CHAR
},
{ "eol2", C_SH(C_EOL2
), M_CHAR
},
{ "swtch", C_SH(C_SWTCH
), M_CHAR
},
{ "dswtch", C_SH(C_DSWTCH
), M_CHAR
},
{ "erase2", C_SH(C_ERASE2
), M_CHAR
},
{ "start", C_SH(C_START
), M_CHAR
},
{ "stop", C_SH(C_STOP
), M_CHAR
},
{ "werase", C_SH(C_WERASE
), M_CHAR
},
{ "susp", C_SH(C_SUSP
), M_CHAR
},
{ "dsusp", C_SH(C_DSUSP
), M_CHAR
},
{ "reprint", C_SH(C_REPRINT
),M_CHAR
},
{ "discard", C_SH(C_DISCARD
),M_CHAR
},
{ "lnext", C_SH(C_LNEXT
), M_CHAR
},
{ "status", C_SH(C_STATUS
), M_CHAR
},
{ "page", C_SH(C_PAGE
), M_CHAR
},
{ "pgoff", C_SH(C_PGOFF
), M_CHAR
},
{ "kill2", C_SH(C_KILL2
), M_CHAR
},
{ "brk", C_SH(C_BRK
), M_CHAR
},
{ "min", C_SH(C_MIN
), M_CHAR
},
{ "time", C_SH(C_TIME
), M_CHAR
},
#define tty_getty(el, td) tcgetattr((el)->el_infd, (td))
#define tty_setty(el, td) tcsetattr((el)->el_infd, TCSADRAIN, (td))
#define tty__gettabs(td) ((((td)->c_oflag & TAB3) == TAB3) ? 0 : 1)
#define tty__geteightbit(td) (((td)->c_cflag & CSIZE) == CS8)
#define tty__cooked_mode(td) ((td)->c_lflag & ICANON)
private void tty__getchar
__P((struct termios
*, unsigned char *));
private void tty__setchar
__P((struct termios
*, unsigned char *));
private speed_t tty__getspeed
__P((struct termios
*));
private int tty_setup
__P((EditLine
*));
* Get the tty parameters and initialize the editing state
if (tty_getty(el
, &el
->el_tty
.t_ed
) == -1) {
(void) fprintf(el
->el_errfile
,
"tty_setup: tty_getty: %s\n", strerror(errno
));
el
->el_tty
.t_ts
= el
->el_tty
.t_ex
= el
->el_tty
.t_ed
;
el
->el_tty
.t_speed
= tty__getspeed(&el
->el_tty
.t_ex
);
el
->el_tty
.t_tabs
= tty__gettabs(&el
->el_tty
.t_ex
);
el
->el_tty
.t_eight
= tty__geteightbit(&el
->el_tty
.t_ex
);
el
->el_tty
.t_ex
.c_iflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_INP
].t_clrmask
;
el
->el_tty
.t_ex
.c_iflag
|= el
->el_tty
.t_t
[EX_IO
][M_INP
].t_setmask
;
el
->el_tty
.t_ex
.c_oflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_OUT
].t_clrmask
;
el
->el_tty
.t_ex
.c_oflag
|= el
->el_tty
.t_t
[EX_IO
][M_OUT
].t_setmask
;
el
->el_tty
.t_ex
.c_cflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_CTL
].t_clrmask
;
el
->el_tty
.t_ex
.c_cflag
|= el
->el_tty
.t_t
[EX_IO
][M_CTL
].t_setmask
;
el
->el_tty
.t_ex
.c_lflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_LIN
].t_clrmask
;
el
->el_tty
.t_ex
.c_lflag
|= el
->el_tty
.t_t
[EX_IO
][M_LIN
].t_setmask
;
* Reset the tty chars to reasonable defaults
* If they are disabled, then enable them.
if (tty__cooked_mode(&el
->el_tty
.t_ts
)) {
tty__getchar(&el
->el_tty
.t_ts
, el
->el_tty
.t_c
[TS_IO
]);
* Don't affect CMIN and CTIME for the editor mode
for (rst
= 0; rst
< C_NCC
- 2; rst
++)
if (el
->el_tty
.t_c
[TS_IO
][rst
] != el
->el_tty
.t_vdisable
&&
el
->el_tty
.t_c
[ED_IO
][rst
] != el
->el_tty
.t_vdisable
)
el
->el_tty
.t_c
[ED_IO
][rst
] = el
->el_tty
.t_c
[TS_IO
][rst
];
for (rst
= 0; rst
< C_NCC
; rst
++)
if (el
->el_tty
.t_c
[TS_IO
][rst
] != el
->el_tty
.t_vdisable
&&
el
->el_tty
.t_c
[EX_IO
][rst
] != el
->el_tty
.t_vdisable
)
el
->el_tty
.t_c
[EX_IO
][rst
] = el
->el_tty
.t_c
[TS_IO
][rst
];
tty__setchar(&el
->el_tty
.t_ex
, el
->el_tty
.t_c
[EX_IO
]);
if (tty_setty(el
, &el
->el_tty
.t_ex
) == -1) {
(void) fprintf(el
->el_errfile
, "tty_setup: tty_setty: %s\n",
tty__setchar(&el
->el_tty
.t_ex
, el
->el_tty
.t_c
[EX_IO
]);
el
->el_tty
.t_ed
.c_iflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_INP
].t_clrmask
;
el
->el_tty
.t_ed
.c_iflag
|= el
->el_tty
.t_t
[ED_IO
][M_INP
].t_setmask
;
el
->el_tty
.t_ed
.c_oflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_OUT
].t_clrmask
;
el
->el_tty
.t_ed
.c_oflag
|= el
->el_tty
.t_t
[ED_IO
][M_OUT
].t_setmask
;
el
->el_tty
.t_ed
.c_cflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_CTL
].t_clrmask
;
el
->el_tty
.t_ed
.c_cflag
|= el
->el_tty
.t_t
[ED_IO
][M_CTL
].t_setmask
;
el
->el_tty
.t_ed
.c_lflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_LIN
].t_clrmask
;
el
->el_tty
.t_ed
.c_lflag
|= el
->el_tty
.t_t
[ED_IO
][M_LIN
].t_setmask
;
tty__setchar(&el
->el_tty
.t_ed
, el
->el_tty
.t_c
[ED_IO
]);
el
->el_tty
.t_mode
= EX_IO
;
el
->el_tty
.t_vdisable
= _POSIX_VDISABLE
;
(void) memcpy(el
->el_tty
.t_t
, ttyperm
, sizeof(ttyperm_t
));
(void) memcpy(el
->el_tty
.t_c
, ttychar
, sizeof(ttychar_t
));
* Restore the tty to its original settings
/* XXX: Maybe reset to an initial state? */
if ((spd
= cfgetispeed(td
)) == 0)
} /* end tty__getspeed */
s
[C_INTR
] = td
->c_cc
[VINTR
];
s
[C_QUIT
] = td
->c_cc
[VQUIT
];
s
[C_ERASE
] = td
->c_cc
[VERASE
];
s
[C_KILL
] = td
->c_cc
[VKILL
];
s
[C_EOF
] = td
->c_cc
[VEOF
];
s
[C_EOL
] = td
->c_cc
[VEOL
];
s
[C_EOL2
] = td
->c_cc
[VEOL2
];
s
[C_SWTCH
] = td
->c_cc
[VSWTCH
];
s
[C_DSWTCH
] = td
->c_cc
[VDSWTCH
];
s
[C_ERASE2
] = td
->c_cc
[VERASE2
];
s
[C_START
] = td
->c_cc
[VSTART
];
s
[C_STOP
] = td
->c_cc
[VSTOP
];
s
[C_WERASE
] = td
->c_cc
[VWERASE
];
s
[C_SUSP
] = td
->c_cc
[VSUSP
];
s
[C_DSUSP
] = td
->c_cc
[VDSUSP
];
s
[C_REPRINT
]= td
->c_cc
[VREPRINT
];
s
[C_DISCARD
]= td
->c_cc
[VDISCARD
];
s
[C_LNEXT
] = td
->c_cc
[VLNEXT
];
s
[C_STATUS
] = td
->c_cc
[VSTATUS
];
s
[C_PAGE
] = td
->c_cc
[VPAGE
];
s
[C_PGOFF
] = td
->c_cc
[VPGOFF
];
s
[C_KILL2
] = td
->c_cc
[VKILL2
];
s
[C_MIN
] = td
->c_cc
[VMIN
];
s
[C_TIME
] = td
->c_cc
[VTIME
];
td
->c_cc
[VINTR
] = s
[C_INTR
];
td
->c_cc
[VQUIT
] = s
[C_QUIT
];
td
->c_cc
[VERASE
] = s
[C_ERASE
];
td
->c_cc
[VKILL
] = s
[C_KILL
];
td
->c_cc
[VEOF
] = s
[C_EOF
];
td
->c_cc
[VEOL
] = s
[C_EOL
];
td
->c_cc
[VEOL2
] = s
[C_EOL2
];
td
->c_cc
[VSWTCH
] = s
[C_SWTCH
];
td
->c_cc
[VDSWTCH
] = s
[C_DSWTCH
];
td
->c_cc
[VERASE2
] = s
[C_ERASE2
];
td
->c_cc
[VSTART
] = s
[C_START
];
td
->c_cc
[VSTOP
] = s
[C_STOP
];
td
->c_cc
[VWERASE
] = s
[C_WERASE
];
td
->c_cc
[VSUSP
] = s
[C_SUSP
];
td
->c_cc
[VDSUSP
] = s
[C_DSUSP
];
td
->c_cc
[VREPRINT
] = s
[C_REPRINT
];
td
->c_cc
[VDISCARD
] = s
[C_DISCARD
];
td
->c_cc
[VLNEXT
] = s
[C_LNEXT
];
td
->c_cc
[VSTATUS
] = s
[C_STATUS
];
td
->c_cc
[VPAGE
] = s
[C_PAGE
];
td
->c_cc
[VPGOFF
] = s
[C_PGOFF
];
td
->c_cc
[VKILL2
] = s
[C_KILL2
];
td
->c_cc
[VMIN
] = s
[C_MIN
];
td
->c_cc
[VTIME
] = s
[C_TIME
];
* Rebind the editline functions
unsigned char *t_n
= el
->el_tty
.t_c
[ED_IO
];
unsigned char *t_o
= el
->el_tty
.t_ed
.c_cc
;
el_action_t
*dmap
, *dalt
, *map
, *alt
;
if (el
->el_map
.type
== MAP_VI
) {
for (tp
= tty_map
; tp
->nch
!= -1; tp
++) {
if (new[0] == old
[0] && !force
)
/* Put the old default binding back, and set the new binding */
map
[old
[0]] = dmap
[old
[0]];
/* MAP_VI == 1, MAP_EMACS == 0... */
map
[new[0]] = tp
->bind
[el
->el_map
.type
];
alt
[old
[0]] = dalt
[old
[0]];
alt
[new[0]] = tp
->bind
[el
->el_map
.type
+1];
* Set terminal into 1 character at a time mode.
if (el
->el_tty
.t_mode
== ED_IO
)
if (tty_getty(el
, &el
->el_tty
.t_ts
) == -1) {
(void) fprintf(el
->el_errfile
, "tty_rawmode: tty_getty: %s\n", strerror(errno
));
* We always keep up with the eight bit setting and the speed of the
* tty. But only we only believe changes that are made to cooked mode!
el
->el_tty
.t_eight
= tty__geteightbit(&el
->el_tty
.t_ts
);
el
->el_tty
.t_speed
= tty__getspeed(&el
->el_tty
.t_ts
);
if (tty__getspeed(&el
->el_tty
.t_ex
) != el
->el_tty
.t_speed
||
tty__getspeed(&el
->el_tty
.t_ed
) != el
->el_tty
.t_speed
) {
(void) cfsetispeed(&el
->el_tty
.t_ex
, el
->el_tty
.t_speed
);
(void) cfsetospeed(&el
->el_tty
.t_ex
, el
->el_tty
.t_speed
);
(void) cfsetispeed(&el
->el_tty
.t_ed
, el
->el_tty
.t_speed
);
(void) cfsetospeed(&el
->el_tty
.t_ed
, el
->el_tty
.t_speed
);
if (tty__cooked_mode(&el
->el_tty
.t_ts
)) {
if (el
->el_tty
.t_ts
.c_cflag
!= el
->el_tty
.t_ex
.c_cflag
) {
el
->el_tty
.t_ex
.c_cflag
= el
->el_tty
.t_ts
.c_cflag
;
el
->el_tty
.t_ex
.c_cflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_CTL
].t_clrmask
;
el
->el_tty
.t_ex
.c_cflag
|= el
->el_tty
.t_t
[EX_IO
][M_CTL
].t_setmask
;
el
->el_tty
.t_ed
.c_cflag
= el
->el_tty
.t_ts
.c_cflag
;
el
->el_tty
.t_ed
.c_cflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_CTL
].t_clrmask
;
el
->el_tty
.t_ed
.c_cflag
|= el
->el_tty
.t_t
[ED_IO
][M_CTL
].t_setmask
;
if ((el
->el_tty
.t_ts
.c_lflag
!= el
->el_tty
.t_ex
.c_lflag
) &&
(el
->el_tty
.t_ts
.c_lflag
!= el
->el_tty
.t_ed
.c_lflag
)) {
el
->el_tty
.t_ex
.c_lflag
= el
->el_tty
.t_ts
.c_lflag
;
el
->el_tty
.t_ex
.c_lflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_LIN
].t_clrmask
;
el
->el_tty
.t_ex
.c_lflag
|= el
->el_tty
.t_t
[EX_IO
][M_LIN
].t_setmask
;
el
->el_tty
.t_ed
.c_lflag
= el
->el_tty
.t_ts
.c_lflag
;
el
->el_tty
.t_ed
.c_lflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_LIN
].t_clrmask
;
el
->el_tty
.t_ed
.c_lflag
|= el
->el_tty
.t_t
[ED_IO
][M_LIN
].t_setmask
;
if ((el
->el_tty
.t_ts
.c_iflag
!= el
->el_tty
.t_ex
.c_iflag
) &&
(el
->el_tty
.t_ts
.c_iflag
!= el
->el_tty
.t_ed
.c_iflag
)) {
el
->el_tty
.t_ex
.c_iflag
= el
->el_tty
.t_ts
.c_iflag
;
el
->el_tty
.t_ex
.c_iflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_INP
].t_clrmask
;
el
->el_tty
.t_ex
.c_iflag
|= el
->el_tty
.t_t
[EX_IO
][M_INP
].t_setmask
;
el
->el_tty
.t_ed
.c_iflag
= el
->el_tty
.t_ts
.c_iflag
;
el
->el_tty
.t_ed
.c_iflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_INP
].t_clrmask
;
el
->el_tty
.t_ed
.c_iflag
|= el
->el_tty
.t_t
[ED_IO
][M_INP
].t_setmask
;
if ((el
->el_tty
.t_ts
.c_oflag
!= el
->el_tty
.t_ex
.c_oflag
) &&
(el
->el_tty
.t_ts
.c_oflag
!= el
->el_tty
.t_ed
.c_oflag
)) {
el
->el_tty
.t_ex
.c_oflag
= el
->el_tty
.t_ts
.c_oflag
;
el
->el_tty
.t_ex
.c_oflag
&= ~el
->el_tty
.t_t
[EX_IO
][M_OUT
].t_clrmask
;
el
->el_tty
.t_ex
.c_oflag
|= el
->el_tty
.t_t
[EX_IO
][M_OUT
].t_setmask
;
el
->el_tty
.t_ed
.c_oflag
= el
->el_tty
.t_ts
.c_oflag
;
el
->el_tty
.t_ed
.c_oflag
&= ~el
->el_tty
.t_t
[ED_IO
][M_OUT
].t_clrmask
;
el
->el_tty
.t_ed
.c_oflag
|= el
->el_tty
.t_t
[ED_IO
][M_OUT
].t_setmask
;
if (tty__gettabs(&el
->el_tty
.t_ex
) == 0)
el
->el_tty
.t_tabs
= EL_CAN_TAB
? 1 : 0;
tty__getchar(&el
->el_tty
.t_ts
, el
->el_tty
.t_c
[TS_IO
]);
* Check if the user made any changes.
* If he did, then propagate the changes to the
* edit and execute data structures.
for (i
= 0; i
< C_NCC
; i
++)
if (el
->el_tty
.t_c
[TS_IO
][i
] != el
->el_tty
.t_c
[EX_IO
][i
])
* Propagate changes only to the unprotected chars
* that have been modified just now.
for (i
= 0; i
< C_NCC
; i
++) {
if (!((el
->el_tty
.t_t
[ED_IO
][M_CHAR
].t_setmask
& C_SH(i
)))
&& (el
->el_tty
.t_c
[TS_IO
][i
] != el
->el_tty
.t_c
[EX_IO
][i
]))
el
->el_tty
.t_c
[ED_IO
][i
] = el
->el_tty
.t_c
[TS_IO
][i
];
if (el
->el_tty
.t_t
[ED_IO
][M_CHAR
].t_clrmask
& C_SH(i
))
el
->el_tty
.t_c
[ED_IO
][i
] = el
->el_tty
.t_vdisable
;
tty__setchar(&el
->el_tty
.t_ed
, el
->el_tty
.t_c
[ED_IO
]);
for (i
= 0; i
< C_NCC
; i
++) {
if (!((el
->el_tty
.t_t
[EX_IO
][M_CHAR
].t_setmask
& C_SH(i
)))
&& (el
->el_tty
.t_c
[TS_IO
][i
] != el
->el_tty
.t_c
[EX_IO
][i
]))
el
->el_tty
.t_c
[EX_IO
][i
] = el
->el_tty
.t_c
[TS_IO
][i
];
if (el
->el_tty
.t_t
[EX_IO
][M_CHAR
].t_clrmask
& C_SH(i
))
el
->el_tty
.t_c
[EX_IO
][i
] = el
->el_tty
.t_vdisable
;
tty__setchar(&el
->el_tty
.t_ex
, el
->el_tty
.t_c
[EX_IO
]);
if (tty_setty(el
, &el
->el_tty
.t_ed
) == -1) {
(void) fprintf(el
->el_errfile
, "tty_rawmode: tty_setty: %s\n",
el
->el_tty
.t_mode
= ED_IO
;
* Set the tty back to normal mode
{ /* set tty in normal setup */
if (el
->el_tty
.t_mode
== EX_IO
)
if (tty_setty(el
, &el
->el_tty
.t_ex
) == -1) {
(void) fprintf(el
->el_errfile
, "tty_cookedmode: tty_setty: %s\n",
el
->el_tty
.t_mode
= EX_IO
;
} /* end tty_cookedmode */
if (el
->el_tty
.t_mode
== QU_IO
)
el
->el_tty
.t_qu
= el
->el_tty
.t_ed
;
el
->el_tty
.t_qu
.c_iflag
&= ~el
->el_tty
.t_t
[QU_IO
][M_INP
].t_clrmask
;
el
->el_tty
.t_qu
.c_iflag
|= el
->el_tty
.t_t
[QU_IO
][M_INP
].t_setmask
;
el
->el_tty
.t_qu
.c_oflag
&= ~el
->el_tty
.t_t
[QU_IO
][M_OUT
].t_clrmask
;
el
->el_tty
.t_qu
.c_oflag
|= el
->el_tty
.t_t
[QU_IO
][M_OUT
].t_setmask
;
el
->el_tty
.t_qu
.c_cflag
&= ~el
->el_tty
.t_t
[QU_IO
][M_CTL
].t_clrmask
;
el
->el_tty
.t_qu
.c_cflag
|= el
->el_tty
.t_t
[QU_IO
][M_CTL
].t_setmask
;
el
->el_tty
.t_qu
.c_lflag
&= ~el
->el_tty
.t_t
[QU_IO
][M_LIN
].t_clrmask
;
el
->el_tty
.t_qu
.c_lflag
|= el
->el_tty
.t_t
[QU_IO
][M_LIN
].t_setmask
;
if (tty_setty(el
, &el
->el_tty
.t_qu
) == -1) {
(void) fprintf(el
->el_errfile
, "QuoteModeOn: tty_setty: %s\n",
el
->el_tty
.t_mode
= QU_IO
;
} /* end tty_quotemode */
if (el
->el_tty
.t_mode
!= QU_IO
)
if (tty_setty(el
, &el
->el_tty
.t_ed
) == -1) {
(void) fprintf(el
->el_errfile
, "QuoteModeOff: tty_setty: %s\n",
el
->el_tty
.t_mode
= ED_IO
;
while (argv
&& *argv
&& argv
[0][0] == '-' && argv
[0][2] == '\0')
(void) fprintf(el
->el_errfile
, "%s: Unknown switch `%c'.\n",
for (m
= ttymodes
; m
->m_name
; m
++) {
(void) fprintf(el
->el_outfile
, "%s%s", i
!= -1 ? "\n" : "",
el
->el_tty
.t_t
[z
][m
->m_type
].t_name
);
st
= len
= strlen(el
->el_tty
.t_t
[z
][m
->m_type
].t_name
);
x
= (el
->el_tty
.t_t
[z
][i
].t_setmask
& m
->m_value
) ? '+' : '\0';
x
= (el
->el_tty
.t_t
[z
][i
].t_clrmask
& m
->m_value
) ? '-' : x
;
if (x
!= '\0' || aflag
) {
cu
= strlen(m
->m_name
) + (x
!= '\0') + 1;
if (len
+ cu
>= el
->el_term
.t_size
.h
) {
(void) fprintf(el
->el_outfile
, "\n%*s", st
, "");
(void) fprintf(el
->el_outfile
, "%c%s ", x
, m
->m_name
);
(void) fprintf(el
->el_outfile
, "%s ", m
->m_name
);
(void) fprintf(el
->el_outfile
, "\n");
while (argv
&& (s
= *argv
++)) {
for (m
= ttymodes
; m
->m_name
; m
++)
if (strcmp(m
->m_name
, d
) == 0)
(void) fprintf(el
->el_errfile
, "%s: Invalid argument `%s'.\n",
el
->el_tty
.t_t
[z
][m
->m_type
].t_setmask
|= m
->m_value
;
el
->el_tty
.t_t
[z
][m
->m_type
].t_clrmask
&= ~m
->m_value
;
el
->el_tty
.t_t
[z
][m
->m_type
].t_setmask
&= ~m
->m_value
;
el
->el_tty
.t_t
[z
][m
->m_type
].t_clrmask
|= m
->m_value
;
el
->el_tty
.t_t
[z
][m
->m_type
].t_setmask
&= ~m
->m_value
;
el
->el_tty
.t_t
[z
][m
->m_type
].t_clrmask
&= ~m
->m_value
;
* DEbugging routine to print the tty characters
for (i
= 0; i
< C_NCC
; i
++) {
for (m
= el
->el_tty
.t_t
; m
->m_name
; m
++)
if (m
->m_type
== M_CHAR
&& C_SH(i
) == m
->m_value
)
(void) fprintf(el
->el_errfile
, "%s ^%c ", m
->m_name
, s
[i
] + 'A'-1);
(void) fprintf(el
->el_errfile
, "\n");
(void) fprintf(el
->el_errfile
, "\n");