16767bd61SMark Peek /* $Header: /src/pub/tcsh/ed.init.c,v 3.44 2001/02/19 23:30:44 kim Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * ed.init.c: Editor initializations 4c80476e4SDavid E. O'Brien */ 5c80476e4SDavid E. O'Brien /*- 6c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California. 7c80476e4SDavid E. O'Brien * All rights reserved. 8c80476e4SDavid E. O'Brien * 9c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 10c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions 11c80476e4SDavid E. O'Brien * are met: 12c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 13c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 14c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 15c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 16c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution. 17c80476e4SDavid E. O'Brien * 3. All advertising materials mentioning features or use of this software 18c80476e4SDavid E. O'Brien * must display the following acknowledgement: 19c80476e4SDavid E. O'Brien * This product includes software developed by the University of 20c80476e4SDavid E. O'Brien * California, Berkeley and its contributors. 21c80476e4SDavid E. O'Brien * 4. Neither the name of the University nor the names of its contributors 22c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 23c80476e4SDavid E. O'Brien * without specific prior written permission. 24c80476e4SDavid E. O'Brien * 25c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 26c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 27c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 28c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 29c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 30c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 31c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTS_ION) 32c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35c80476e4SDavid E. O'Brien * SUCH DAMAGE. 36c80476e4SDavid E. O'Brien */ 37c80476e4SDavid E. O'Brien #include "sh.h" 38c80476e4SDavid E. O'Brien 396767bd61SMark Peek RCSID("$Id: ed.init.c,v 3.44 2001/02/19 23:30:44 kim Exp $") 40c80476e4SDavid E. O'Brien 41c80476e4SDavid E. O'Brien #include "ed.h" 42c80476e4SDavid E. O'Brien #include "ed.term.h" 43c80476e4SDavid E. O'Brien #include "tc.h" 44c80476e4SDavid E. O'Brien #include "ed.defns.h" 45c80476e4SDavid E. O'Brien 46c80476e4SDavid E. O'Brien /* ed.init.c -- init routines for the line editor */ 47c80476e4SDavid E. O'Brien /* #define DEBUG_TTY */ 48c80476e4SDavid E. O'Brien 49c80476e4SDavid E. O'Brien int Tty_raw_mode = 0; /* Last tty change was to raw mode */ 50c80476e4SDavid E. O'Brien int MacroLvl = -1; /* pointer to current macro nesting level; */ 51c80476e4SDavid E. O'Brien /* (-1 == none) */ 52c80476e4SDavid E. O'Brien static int Tty_quote_mode = 0; /* Last tty change was to quote mode */ 53c80476e4SDavid E. O'Brien static unsigned char vdisable; /* The value of _POSIX_VDISABLE from 54c80476e4SDavid E. O'Brien * pathconf(2) */ 55c80476e4SDavid E. O'Brien 56c80476e4SDavid E. O'Brien int Tty_eight_bit = -1; /* does the tty handle eight bits */ 57c80476e4SDavid E. O'Brien 58c80476e4SDavid E. O'Brien extern bool GotTermCaps; 59c80476e4SDavid E. O'Brien 60c80476e4SDavid E. O'Brien static ttydata_t extty, edtty, tstty; 61c80476e4SDavid E. O'Brien #define qutty tstty 62c80476e4SDavid E. O'Brien 63c80476e4SDavid E. O'Brien extern int insource; 64c80476e4SDavid E. O'Brien #define SHTTY (insource ? OLDSTD : SHIN) 65c80476e4SDavid E. O'Brien 66c80476e4SDavid E. O'Brien #define uc unsigned char 67c80476e4SDavid E. O'Brien static unsigned char ttychars[NN_IO][C_NCC] = { 68c80476e4SDavid E. O'Brien { 69c80476e4SDavid E. O'Brien (uc)CINTR, (uc)CQUIT, (uc)CERASE, (uc)CKILL, 70c80476e4SDavid E. O'Brien (uc)CEOF, (uc)CEOL, (uc)CEOL2, (uc)CSWTCH, 71c80476e4SDavid E. O'Brien (uc)CDSWTCH, (uc)CERASE2, (uc)CSTART, (uc)CSTOP, 72c80476e4SDavid E. O'Brien (uc)CWERASE, (uc)CSUSP, (uc)CDSUSP, (uc)CREPRINT, 73c80476e4SDavid E. O'Brien (uc)CDISCARD, (uc)CLNEXT, (uc)CSTATUS, (uc)CPAGE, 74c80476e4SDavid E. O'Brien (uc)CPGOFF, (uc)CKILL2, (uc)CBRK, (uc)CMIN, 75c80476e4SDavid E. O'Brien (uc)CTIME 76c80476e4SDavid E. O'Brien }, 77c80476e4SDavid E. O'Brien { 78c80476e4SDavid E. O'Brien CINTR, CQUIT, CERASE, CKILL, 79c80476e4SDavid E. O'Brien _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 80c80476e4SDavid E. O'Brien _POSIX_VDISABLE, CERASE2, CSTART, CSTOP, 81c80476e4SDavid E. O'Brien _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 82c80476e4SDavid E. O'Brien CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 83c80476e4SDavid E. O'Brien _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1, 84c80476e4SDavid E. O'Brien 0 85c80476e4SDavid E. O'Brien }, 86c80476e4SDavid E. O'Brien { 87c80476e4SDavid E. O'Brien 0, 0, 0, 0, 88c80476e4SDavid E. O'Brien 0, 0, 0, 0, 89c80476e4SDavid E. O'Brien 0, 0, 0, 0, 90c80476e4SDavid E. O'Brien 0, 0, 0, 0, 91c80476e4SDavid E. O'Brien 0, 0, 0, 0, 92c80476e4SDavid E. O'Brien 0, 0, 0, 0, 93c80476e4SDavid E. O'Brien 0 94c80476e4SDavid E. O'Brien } 95c80476e4SDavid E. O'Brien }; 96c80476e4SDavid E. O'Brien 97c80476e4SDavid E. O'Brien #ifdef SIG_WINDOW 98c80476e4SDavid E. O'Brien void 99c80476e4SDavid E. O'Brien check_window_size(force) 100c80476e4SDavid E. O'Brien int force; 101c80476e4SDavid E. O'Brien { 102c80476e4SDavid E. O'Brien #ifdef BSDSIGS 103c80476e4SDavid E. O'Brien sigmask_t omask; 104c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 105c80476e4SDavid E. O'Brien int lins, cols; 106c80476e4SDavid E. O'Brien 107c80476e4SDavid E. O'Brien /* don't want to confuse things here */ 108c80476e4SDavid E. O'Brien #ifdef BSDSIGS 109c80476e4SDavid E. O'Brien omask = sigblock(sigmask(SIG_WINDOW)) & ~sigmask(SIG_WINDOW); 110c80476e4SDavid E. O'Brien #else /* BSDSIGS */ 111c80476e4SDavid E. O'Brien (void) sighold(SIG_WINDOW); 112c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 113c80476e4SDavid E. O'Brien /* 114c80476e4SDavid E. O'Brien * From: bret@shark.agps.lanl.gov (Bret Thaeler) Avoid sunview bug, where a 115c80476e4SDavid E. O'Brien * partially hidden window gets a SIG_WINDOW every time the text is 116c80476e4SDavid E. O'Brien * scrolled 117c80476e4SDavid E. O'Brien */ 118c80476e4SDavid E. O'Brien if (GetSize(&lins, &cols) || force) { 119c80476e4SDavid E. O'Brien if (GettingInput) { 120c80476e4SDavid E. O'Brien ClearLines(); 121c80476e4SDavid E. O'Brien ClearDisp(); 122c80476e4SDavid E. O'Brien MoveToLine(0); 123c80476e4SDavid E. O'Brien MoveToChar(0); 124c80476e4SDavid E. O'Brien ChangeSize(lins, cols); 125c80476e4SDavid E. O'Brien Refresh(); 126c80476e4SDavid E. O'Brien } 127c80476e4SDavid E. O'Brien else 128c80476e4SDavid E. O'Brien ChangeSize(lins, cols); 129c80476e4SDavid E. O'Brien } 130c80476e4SDavid E. O'Brien #ifdef BSDSIGS 131c80476e4SDavid E. O'Brien (void) sigsetmask(omask); /* can change it again */ 132c80476e4SDavid E. O'Brien #else /* BSDSIGS */ 133c80476e4SDavid E. O'Brien (void) sigrelse(SIG_WINDOW); 134c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 135c80476e4SDavid E. O'Brien } 136c80476e4SDavid E. O'Brien 137c80476e4SDavid E. O'Brien sigret_t 138c80476e4SDavid E. O'Brien /*ARGSUSED*/ 139c80476e4SDavid E. O'Brien window_change(snum) 140c80476e4SDavid E. O'Brien int snum; 141c80476e4SDavid E. O'Brien { 1428e66bd9eSDavid E. O'Brien USE(snum); 143c80476e4SDavid E. O'Brien #ifdef UNRELSIGS 144c80476e4SDavid E. O'Brien /* If we were called as a signal handler, restore it. */ 145c80476e4SDavid E. O'Brien if (snum > 0) 146c80476e4SDavid E. O'Brien sigset(snum, window_change); 147c80476e4SDavid E. O'Brien #endif /* UNRELSIGS */ 148c80476e4SDavid E. O'Brien check_window_size(0); 149c80476e4SDavid E. O'Brien #ifndef SIGVOID 150c80476e4SDavid E. O'Brien return (snum); 151c80476e4SDavid E. O'Brien #endif 152c80476e4SDavid E. O'Brien } 153c80476e4SDavid E. O'Brien 154c80476e4SDavid E. O'Brien #endif /* SIG_WINDOW */ 155c80476e4SDavid E. O'Brien 156c80476e4SDavid E. O'Brien void 157c80476e4SDavid E. O'Brien ed_set_tty_eight_bit() 158c80476e4SDavid E. O'Brien { 159c80476e4SDavid E. O'Brien if (tty_getty(SHTTY, &extty) == -1) { 160c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 161c80476e4SDavid E. O'Brien xprintf("ed_set_tty_eight_bit: tty_getty: %s\n", strerror(errno)); 162c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 163c80476e4SDavid E. O'Brien return; 164c80476e4SDavid E. O'Brien } 165c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&extty); 166c80476e4SDavid E. O'Brien } 167c80476e4SDavid E. O'Brien 168c80476e4SDavid E. O'Brien 169c80476e4SDavid E. O'Brien int 170c80476e4SDavid E. O'Brien ed_Setup(rst) 171c80476e4SDavid E. O'Brien int rst; 172c80476e4SDavid E. O'Brien { 173c80476e4SDavid E. O'Brien static int havesetup = 0; 174c80476e4SDavid E. O'Brien struct varent *imode; 175c80476e4SDavid E. O'Brien 176c80476e4SDavid E. O'Brien if (havesetup) /* if we have never been called */ 177c80476e4SDavid E. O'Brien return(0); 178c80476e4SDavid E. O'Brien 179c80476e4SDavid E. O'Brien #if defined(POSIX) && defined(_PC_VDISABLE) && !defined(BSD4_4) && \ 1803b6eaa7bSAndrey A. Chernov !defined(WINNT_NATIVE) 181c80476e4SDavid E. O'Brien { 182c80476e4SDavid E. O'Brien long pcret; 183c80476e4SDavid E. O'Brien 184c80476e4SDavid E. O'Brien if ((pcret = fpathconf(SHTTY, _PC_VDISABLE)) == -1L) 185c80476e4SDavid E. O'Brien vdisable = (unsigned char) _POSIX_VDISABLE; 186c80476e4SDavid E. O'Brien else 187c80476e4SDavid E. O'Brien vdisable = (unsigned char) pcret; 188c80476e4SDavid E. O'Brien if (vdisable != (unsigned char) _POSIX_VDISABLE && rst != 0) 189c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC; rst++) { 190c80476e4SDavid E. O'Brien if (ttychars[ED_IO][rst] == (unsigned char) _POSIX_VDISABLE) 191c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] = vdisable; 192c80476e4SDavid E. O'Brien if (ttychars[EX_IO][rst] == (unsigned char) _POSIX_VDISABLE) 193c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] = vdisable; 194c80476e4SDavid E. O'Brien } 195c80476e4SDavid E. O'Brien } 1963b6eaa7bSAndrey A. Chernov #else /* ! POSIX || !_PC_VDISABLE || BSD4_4 || WINNT_NATIVE */ 197c80476e4SDavid E. O'Brien vdisable = (unsigned char) _POSIX_VDISABLE; 1983b6eaa7bSAndrey A. Chernov #endif /* POSIX && _PC_VDISABLE && !BSD4_4 && !WINNT_NATIVE */ 199c80476e4SDavid E. O'Brien 200c80476e4SDavid E. O'Brien if ((imode = adrof(STRinputmode)) != NULL) { 201c80476e4SDavid E. O'Brien if (!Strcmp(*(imode->vec), STRinsert)) 202c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 203c80476e4SDavid E. O'Brien else if (!Strcmp(*(imode->vec), STRoverwrite)) 204c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE; 205c80476e4SDavid E. O'Brien } 206c80476e4SDavid E. O'Brien else 207c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 208c80476e4SDavid E. O'Brien ed_InitMaps(); 209c80476e4SDavid E. O'Brien Hist_num = 0; 210c80476e4SDavid E. O'Brien Expand = 0; 2116767bd61SMark Peek SetKillRing(getn(varval(STRkillring))); 212c80476e4SDavid E. O'Brien 2133b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 214c80476e4SDavid E. O'Brien if (tty_getty(SHTTY, &extty) == -1) { 215c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 216c80476e4SDavid E. O'Brien xprintf("ed_Setup: tty_getty: %s\n", strerror(errno)); 217c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 218c80476e4SDavid E. O'Brien return(-1); 219c80476e4SDavid E. O'Brien } 220c80476e4SDavid E. O'Brien 221c80476e4SDavid E. O'Brien tstty = edtty = extty; 222c80476e4SDavid E. O'Brien 223c80476e4SDavid E. O'Brien T_Speed = tty_getspeed(&extty); 224c80476e4SDavid E. O'Brien T_Tabs = tty_gettabs(&extty); 225c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&extty); 226c80476e4SDavid E. O'Brien 227c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO) 228c80476e4SDavid E. O'Brien extty.d_t.c_iflag &= ~ttylist[EX_IO][M_INPUT].t_clrmask; 229c80476e4SDavid E. O'Brien extty.d_t.c_iflag |= ttylist[EX_IO][M_INPUT].t_setmask; 230c80476e4SDavid E. O'Brien 231c80476e4SDavid E. O'Brien extty.d_t.c_oflag &= ~ttylist[EX_IO][M_OUTPUT].t_clrmask; 232c80476e4SDavid E. O'Brien extty.d_t.c_oflag |= ttylist[EX_IO][M_OUTPUT].t_setmask; 233c80476e4SDavid E. O'Brien 234c80476e4SDavid E. O'Brien extty.d_t.c_cflag &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 235c80476e4SDavid E. O'Brien extty.d_t.c_cflag |= ttylist[EX_IO][M_CONTROL].t_setmask; 236c80476e4SDavid E. O'Brien 237c80476e4SDavid E. O'Brien extty.d_t.c_lflag &= ~ttylist[EX_IO][M_LINED].t_clrmask; 238c80476e4SDavid E. O'Brien extty.d_t.c_lflag |= ttylist[EX_IO][M_LINED].t_setmask; 239c80476e4SDavid E. O'Brien 240c80476e4SDavid E. O'Brien # if defined(IRIX3_3) && SYSVREL < 4 241c80476e4SDavid E. O'Brien extty.d_t.c_line = NTTYDISC; 242c80476e4SDavid E. O'Brien # endif /* IRIX3_3 && SYSVREL < 4 */ 243c80476e4SDavid E. O'Brien 244c80476e4SDavid E. O'Brien # else /* GSTTY */ /* V7, Berkeley style tty */ 245c80476e4SDavid E. O'Brien 246c80476e4SDavid E. O'Brien if (T_Tabs) { /* order of &= and |= is important to XTABS */ 247c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~(ttylist[EX_IO][M_CONTROL].t_clrmask|XTABS); 248c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= ttylist[EX_IO][M_CONTROL].t_setmask; 249c80476e4SDavid E. O'Brien } 250c80476e4SDavid E. O'Brien else { 251c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 252c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= (ttylist[EX_IO][M_CONTROL].t_setmask|XTABS); 253c80476e4SDavid E. O'Brien } 254c80476e4SDavid E. O'Brien 255c80476e4SDavid E. O'Brien extty.d_lb &= ~ttylist[EX_IO][M_LOCAL].t_clrmask; 256c80476e4SDavid E. O'Brien extty.d_lb |= ttylist[EX_IO][M_LOCAL].t_setmask; 257c80476e4SDavid E. O'Brien 258c80476e4SDavid E. O'Brien # endif /* GSTTY */ 259c80476e4SDavid E. O'Brien /* 260c80476e4SDavid E. O'Brien * Reset the tty chars to reasonable defaults 261c80476e4SDavid E. O'Brien * If they are disabled, then enable them. 262c80476e4SDavid E. O'Brien */ 263c80476e4SDavid E. O'Brien if (rst) { 264c80476e4SDavid E. O'Brien if (tty_cooked_mode(&tstty)) { 265c80476e4SDavid E. O'Brien tty_getchar(&tstty, ttychars[TS_IO]); 266c80476e4SDavid E. O'Brien /* 267c80476e4SDavid E. O'Brien * Don't affect CMIN and CTIME for the editor mode 268c80476e4SDavid E. O'Brien */ 269c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC - 2; rst++) 270c80476e4SDavid E. O'Brien if (ttychars[TS_IO][rst] != vdisable && 271c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] != vdisable) 272c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] = ttychars[TS_IO][rst]; 273c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC; rst++) 274c80476e4SDavid E. O'Brien if (ttychars[TS_IO][rst] != vdisable && 275c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] != vdisable) 276c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] = ttychars[TS_IO][rst]; 277c80476e4SDavid E. O'Brien } 278c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 279c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &extty) == -1) { 280c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 281c80476e4SDavid E. O'Brien xprintf("ed_Setup: tty_setty: %s\n", strerror(errno)); 282c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 283c80476e4SDavid E. O'Brien return(-1); 284c80476e4SDavid E. O'Brien } 285c80476e4SDavid E. O'Brien } 286c80476e4SDavid E. O'Brien else 287c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 288c80476e4SDavid E. O'Brien 289c80476e4SDavid E. O'Brien # ifdef SIG_WINDOW 290c80476e4SDavid E. O'Brien (void) sigset(SIG_WINDOW, window_change); /* for window systems */ 291c80476e4SDavid E. O'Brien # endif 2923b6eaa7bSAndrey A. Chernov #else /* WINNT_NATIVE */ 293c80476e4SDavid E. O'Brien # ifdef DEBUG 294c80476e4SDavid E. O'Brien if (rst) 295c80476e4SDavid E. O'Brien xprintf("rst received in ed_Setup() %d\n", rst); 296c80476e4SDavid E. O'Brien # endif 2973b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 298c80476e4SDavid E. O'Brien havesetup = 1; 299c80476e4SDavid E. O'Brien return(0); 300c80476e4SDavid E. O'Brien } 301c80476e4SDavid E. O'Brien 302c80476e4SDavid E. O'Brien void 303c80476e4SDavid E. O'Brien ed_Init() 304c80476e4SDavid E. O'Brien { 305c80476e4SDavid E. O'Brien ResetInLine(1); /* reset the input pointers */ 306c80476e4SDavid E. O'Brien GettingInput = 0; /* just in case */ 3076767bd61SMark Peek #ifdef notdef 3086767bd61SMark Peek /* XXX This code was here before the kill ring: 309c80476e4SDavid E. O'Brien LastKill = KillBuf; / * no kill buffer * / 3106767bd61SMark Peek If there was any reason for that other than to make sure LastKill 3116767bd61SMark Peek was initialized, the code below should go in here instead - but 3126767bd61SMark Peek it doesn't seem reasonable to lose the entire kill ring (which is 3136767bd61SMark Peek "self-initializing") just because you set $term or whatever, so 3146767bd61SMark Peek presumably this whole '#ifdef notdef' should just be taken out. */ 3156767bd61SMark Peek 3166767bd61SMark Peek { /* no kill ring - why? */ 3176767bd61SMark Peek int i; 3186767bd61SMark Peek for (i = 0; i < KillRingMax; i++) { 3196767bd61SMark Peek if (KillRing[i].buf != NULL) 3206767bd61SMark Peek xfree((ptr_t) KillRing[i].buf); 3216767bd61SMark Peek KillRing[i].buf = NULL; 3226767bd61SMark Peek KillRing[i].len = 0; 3236767bd61SMark Peek } 3246767bd61SMark Peek YankPos = KillPos = 0; 3256767bd61SMark Peek KillRingLen = 0; 3266767bd61SMark Peek } 3276767bd61SMark Peek #endif 328c80476e4SDavid E. O'Brien 329c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT 330c80476e4SDavid E. O'Brien CheckMaps(); /* do a little error checking on key maps */ 331c80476e4SDavid E. O'Brien #endif 332c80476e4SDavid E. O'Brien 333c80476e4SDavid E. O'Brien if (ed_Setup(0) == -1) 334c80476e4SDavid E. O'Brien return; 335c80476e4SDavid E. O'Brien 336c80476e4SDavid E. O'Brien /* 337c80476e4SDavid E. O'Brien * if we have been called before but GotTermCaps isn't set, our TERM has 338c80476e4SDavid E. O'Brien * changed, so get new termcaps and try again 339c80476e4SDavid E. O'Brien */ 340c80476e4SDavid E. O'Brien 341c80476e4SDavid E. O'Brien if (!GotTermCaps) 342c80476e4SDavid E. O'Brien GetTermCaps(); /* does the obvious, but gets term type each 343c80476e4SDavid E. O'Brien * time */ 344c80476e4SDavid E. O'Brien 3453b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 346c80476e4SDavid E. O'Brien # if defined(TERMIO) || defined(POSIX) 347c80476e4SDavid E. O'Brien edtty.d_t.c_iflag &= ~ttylist[ED_IO][M_INPUT].t_clrmask; 348c80476e4SDavid E. O'Brien edtty.d_t.c_iflag |= ttylist[ED_IO][M_INPUT].t_setmask; 349c80476e4SDavid E. O'Brien 350c80476e4SDavid E. O'Brien edtty.d_t.c_oflag &= ~ttylist[ED_IO][M_OUTPUT].t_clrmask; 351c80476e4SDavid E. O'Brien edtty.d_t.c_oflag |= ttylist[ED_IO][M_OUTPUT].t_setmask; 352c80476e4SDavid E. O'Brien 353c80476e4SDavid E. O'Brien edtty.d_t.c_cflag &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 354c80476e4SDavid E. O'Brien edtty.d_t.c_cflag |= ttylist[ED_IO][M_CONTROL].t_setmask; 355c80476e4SDavid E. O'Brien 356c80476e4SDavid E. O'Brien edtty.d_t.c_lflag &= ~ttylist[ED_IO][M_LINED].t_clrmask; 357c80476e4SDavid E. O'Brien edtty.d_t.c_lflag |= ttylist[ED_IO][M_LINED].t_setmask; 358c80476e4SDavid E. O'Brien 359c80476e4SDavid E. O'Brien 360c80476e4SDavid E. O'Brien # if defined(IRIX3_3) && SYSVREL < 4 361c80476e4SDavid E. O'Brien edtty.d_t.c_line = NTTYDISC; 362c80476e4SDavid E. O'Brien # endif /* IRIX3_3 && SYSVREL < 4 */ 363c80476e4SDavid E. O'Brien 364c80476e4SDavid E. O'Brien # else /* GSTTY */ 365c80476e4SDavid E. O'Brien 366c80476e4SDavid E. O'Brien if (T_Tabs) { /* order of &= and |= is important to XTABS */ 367c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= ~(ttylist[ED_IO][M_CONTROL].t_clrmask | XTABS); 368c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= ttylist[ED_IO][M_CONTROL].t_setmask; 369c80476e4SDavid E. O'Brien } 370c80476e4SDavid E. O'Brien else { 371c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 372c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= (ttylist[ED_IO][M_CONTROL].t_setmask | XTABS); 373c80476e4SDavid E. O'Brien } 374c80476e4SDavid E. O'Brien 375c80476e4SDavid E. O'Brien edtty.d_lb &= ~ttylist[ED_IO][M_LOCAL].t_clrmask; 376c80476e4SDavid E. O'Brien edtty.d_lb |= ttylist[ED_IO][M_LOCAL].t_setmask; 377c80476e4SDavid E. O'Brien # endif /* POSIX || TERMIO */ 378c80476e4SDavid E. O'Brien 379c80476e4SDavid E. O'Brien tty_setchar(&edtty, ttychars[ED_IO]); 3803b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 381c80476e4SDavid E. O'Brien } 382c80476e4SDavid E. O'Brien 383c80476e4SDavid E. O'Brien /* 384c80476e4SDavid E. O'Brien * Check and re-init the line. set the terminal into 1 char at a time mode. 385c80476e4SDavid E. O'Brien */ 386c80476e4SDavid E. O'Brien int 387c80476e4SDavid E. O'Brien Rawmode() 388c80476e4SDavid E. O'Brien { 389c80476e4SDavid E. O'Brien if (Tty_raw_mode) 390c80476e4SDavid E. O'Brien return (0); 391c80476e4SDavid E. O'Brien 3923b6eaa7bSAndrey A. Chernov #ifdef WINNT_NATIVE 393c80476e4SDavid E. O'Brien do_nt_raw_mode(); 3943b6eaa7bSAndrey A. Chernov #else /* !WINNT_NATIVE */ 395c80476e4SDavid E. O'Brien # ifdef _IBMR2 396c80476e4SDavid E. O'Brien tty_setdisc(SHTTY, ED_IO); 397c80476e4SDavid E. O'Brien # endif /* _IBMR2 */ 398c80476e4SDavid E. O'Brien 399c80476e4SDavid E. O'Brien if (tty_getty(SHTTY, &tstty) == -1) { 400c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 401c80476e4SDavid E. O'Brien xprintf("Rawmode: tty_getty: %s\n", strerror(errno)); 402c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 403c80476e4SDavid E. O'Brien return(-1); 404c80476e4SDavid E. O'Brien } 405c80476e4SDavid E. O'Brien 406c80476e4SDavid E. O'Brien /* 407c80476e4SDavid E. O'Brien * We always keep up with the eight bit setting and the speed of the 408c80476e4SDavid E. O'Brien * tty. But only we only believe changes that are made to cooked mode! 409c80476e4SDavid E. O'Brien */ 410c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO) 411c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&tstty); 412c80476e4SDavid E. O'Brien T_Speed = tty_getspeed(&tstty); 413c80476e4SDavid E. O'Brien 414c80476e4SDavid E. O'Brien # ifdef POSIX 415c80476e4SDavid E. O'Brien /* 416c80476e4SDavid E. O'Brien * Fix from: Steven (Steve) B. Green <xrsbg@charney.gsfc.nasa.gov> 417c80476e4SDavid E. O'Brien * Speed was not being set up correctly under POSIX. 418c80476e4SDavid E. O'Brien */ 419c80476e4SDavid E. O'Brien if (tty_getspeed(&extty) != T_Speed || tty_getspeed(&edtty) != T_Speed) { 420c80476e4SDavid E. O'Brien (void) cfsetispeed(&extty.d_t, T_Speed); 421c80476e4SDavid E. O'Brien (void) cfsetospeed(&extty.d_t, T_Speed); 422c80476e4SDavid E. O'Brien (void) cfsetispeed(&edtty.d_t, T_Speed); 423c80476e4SDavid E. O'Brien (void) cfsetospeed(&edtty.d_t, T_Speed); 424c80476e4SDavid E. O'Brien } 425c80476e4SDavid E. O'Brien # endif /* POSIX */ 426c80476e4SDavid E. O'Brien # else /* GSTTY */ 427c80476e4SDavid E. O'Brien 428c80476e4SDavid E. O'Brien T_Speed = tty_getspeed(&tstty); 429c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&tstty); 430c80476e4SDavid E. O'Brien 431c80476e4SDavid E. O'Brien if (extty.d_t.sg_ispeed != tstty.d_t.sg_ispeed) { 432c80476e4SDavid E. O'Brien extty.d_t.sg_ispeed = tstty.d_t.sg_ispeed; 433c80476e4SDavid E. O'Brien edtty.d_t.sg_ispeed = tstty.d_t.sg_ispeed; 434c80476e4SDavid E. O'Brien } 435c80476e4SDavid E. O'Brien 436c80476e4SDavid E. O'Brien if (extty.d_t.sg_ospeed != tstty.d_t.sg_ospeed) { 437c80476e4SDavid E. O'Brien extty.d_t.sg_ospeed = tstty.d_t.sg_ospeed; 438c80476e4SDavid E. O'Brien edtty.d_t.sg_ospeed = tstty.d_t.sg_ospeed; 439c80476e4SDavid E. O'Brien } 440c80476e4SDavid E. O'Brien # endif /* POSIX || TERMIO */ 441c80476e4SDavid E. O'Brien 442c80476e4SDavid E. O'Brien if (tty_cooked_mode(&tstty)) { 443c80476e4SDavid E. O'Brien /* 444c80476e4SDavid E. O'Brien * re-test for some things here (like maybe the user typed 445c80476e4SDavid E. O'Brien * "stty -tabs" 446c80476e4SDavid E. O'Brien */ 447c80476e4SDavid E. O'Brien if (tty_gettabs(&tstty) == 0) 448c80476e4SDavid E. O'Brien T_Tabs = 0; 449c80476e4SDavid E. O'Brien else 450c80476e4SDavid E. O'Brien T_Tabs = CanWeTab(); 451c80476e4SDavid E. O'Brien 452c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO) 453c80476e4SDavid E. O'Brien extty.d_t.c_cflag = tstty.d_t.c_cflag; 454c80476e4SDavid E. O'Brien extty.d_t.c_cflag &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 455c80476e4SDavid E. O'Brien extty.d_t.c_cflag |= ttylist[EX_IO][M_CONTROL].t_setmask; 456c80476e4SDavid E. O'Brien 457c80476e4SDavid E. O'Brien edtty.d_t.c_cflag = tstty.d_t.c_cflag; 458c80476e4SDavid E. O'Brien edtty.d_t.c_cflag &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 459c80476e4SDavid E. O'Brien edtty.d_t.c_cflag |= ttylist[ED_IO][M_CONTROL].t_setmask; 460c80476e4SDavid E. O'Brien 461c80476e4SDavid E. O'Brien extty.d_t.c_lflag = tstty.d_t.c_lflag; 462c80476e4SDavid E. O'Brien extty.d_t.c_lflag &= ~ttylist[EX_IO][M_LINED].t_clrmask; 463c80476e4SDavid E. O'Brien extty.d_t.c_lflag |= ttylist[EX_IO][M_LINED].t_setmask; 464c80476e4SDavid E. O'Brien 465c80476e4SDavid E. O'Brien edtty.d_t.c_lflag = tstty.d_t.c_lflag; 466c80476e4SDavid E. O'Brien edtty.d_t.c_lflag &= ~ttylist[ED_IO][M_LINED].t_clrmask; 467c80476e4SDavid E. O'Brien edtty.d_t.c_lflag |= ttylist[ED_IO][M_LINED].t_setmask; 468c80476e4SDavid E. O'Brien 469c80476e4SDavid E. O'Brien extty.d_t.c_iflag = tstty.d_t.c_iflag; 470c80476e4SDavid E. O'Brien extty.d_t.c_iflag &= ~ttylist[EX_IO][M_INPUT].t_clrmask; 471c80476e4SDavid E. O'Brien extty.d_t.c_iflag |= ttylist[EX_IO][M_INPUT].t_setmask; 472c80476e4SDavid E. O'Brien 473c80476e4SDavid E. O'Brien edtty.d_t.c_iflag = tstty.d_t.c_iflag; 474c80476e4SDavid E. O'Brien edtty.d_t.c_iflag &= ~ttylist[ED_IO][M_INPUT].t_clrmask; 475c80476e4SDavid E. O'Brien edtty.d_t.c_iflag |= ttylist[ED_IO][M_INPUT].t_setmask; 476c80476e4SDavid E. O'Brien 477c80476e4SDavid E. O'Brien extty.d_t.c_oflag = tstty.d_t.c_oflag; 478c80476e4SDavid E. O'Brien extty.d_t.c_oflag &= ~ttylist[EX_IO][M_OUTPUT].t_clrmask; 479c80476e4SDavid E. O'Brien extty.d_t.c_oflag |= ttylist[EX_IO][M_OUTPUT].t_setmask; 480c80476e4SDavid E. O'Brien 481c80476e4SDavid E. O'Brien edtty.d_t.c_oflag = tstty.d_t.c_oflag; 482c80476e4SDavid E. O'Brien edtty.d_t.c_oflag &= ~ttylist[ED_IO][M_OUTPUT].t_clrmask; 483c80476e4SDavid E. O'Brien edtty.d_t.c_oflag |= ttylist[ED_IO][M_OUTPUT].t_setmask; 484c80476e4SDavid E. O'Brien 485c80476e4SDavid E. O'Brien # else /* GSTTY */ 486c80476e4SDavid E. O'Brien 487c80476e4SDavid E. O'Brien extty.d_t.sg_flags = tstty.d_t.sg_flags; 488c80476e4SDavid E. O'Brien 489c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 490c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= ttylist[EX_IO][M_CONTROL].t_setmask; 491c80476e4SDavid E. O'Brien 492c80476e4SDavid E. O'Brien if (T_Tabs) /* order of &= and |= is important to XTABS */ 493c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~XTABS; 494c80476e4SDavid E. O'Brien else 495c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= XTABS; 496c80476e4SDavid E. O'Brien 497c80476e4SDavid E. O'Brien extty.d_lb = tstty.d_lb; 498c80476e4SDavid E. O'Brien extty.d_lb &= ~ttylist[EX_IO][M_LOCAL].t_clrmask; 499c80476e4SDavid E. O'Brien extty.d_lb |= ttylist[EX_IO][M_LOCAL].t_setmask; 500c80476e4SDavid E. O'Brien 501c80476e4SDavid E. O'Brien edtty.d_t.sg_flags = extty.d_t.sg_flags; 502c80476e4SDavid E. O'Brien if (T_Tabs) { /* order of &= and |= is important to XTABS */ 503c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= 504c80476e4SDavid E. O'Brien ~(ttylist[ED_IO][M_CONTROL].t_clrmask|XTABS); 505c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= ttylist[ED_IO][M_CONTROL].t_setmask; 506c80476e4SDavid E. O'Brien } 507c80476e4SDavid E. O'Brien else { 508c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 509c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= 510c80476e4SDavid E. O'Brien (ttylist[ED_IO][M_CONTROL].t_setmask|XTABS); 511c80476e4SDavid E. O'Brien } 512c80476e4SDavid E. O'Brien 513c80476e4SDavid E. O'Brien edtty.d_lb = tstty.d_lb; 514c80476e4SDavid E. O'Brien edtty.d_lb &= ~ttylist[ED_IO][M_LOCAL].t_clrmask; 515c80476e4SDavid E. O'Brien edtty.d_lb |= ttylist[ED_IO][M_LOCAL].t_setmask; 516c80476e4SDavid E. O'Brien 517c80476e4SDavid E. O'Brien # endif /* TERMIO || POSIX */ 518c80476e4SDavid E. O'Brien 519c80476e4SDavid E. O'Brien { 520c80476e4SDavid E. O'Brien extern int didsetty; 521c80476e4SDavid E. O'Brien int i; 522c80476e4SDavid E. O'Brien 523c80476e4SDavid E. O'Brien tty_getchar(&tstty, ttychars[TS_IO]); 524c80476e4SDavid E. O'Brien /* 525c80476e4SDavid E. O'Brien * Check if the user made any changes. 526c80476e4SDavid E. O'Brien * If he did, then propagate the changes to the 527c80476e4SDavid E. O'Brien * edit and execute data structures. 528c80476e4SDavid E. O'Brien */ 529c80476e4SDavid E. O'Brien for (i = 0; i < C_NCC; i++) 530c80476e4SDavid E. O'Brien if (ttychars[TS_IO][i] != ttychars[EX_IO][i]) 531c80476e4SDavid E. O'Brien break; 532c80476e4SDavid E. O'Brien 533c80476e4SDavid E. O'Brien if (i != C_NCC || didsetty) { 534c80476e4SDavid E. O'Brien didsetty = 0; 535c80476e4SDavid E. O'Brien /* 536c80476e4SDavid E. O'Brien * Propagate changes only to the unprotected chars 537c80476e4SDavid E. O'Brien * that have been modified just now. 538c80476e4SDavid E. O'Brien */ 539c80476e4SDavid E. O'Brien for (i = 0; i < C_NCC; i++) { 540c80476e4SDavid E. O'Brien if (!((ttylist[ED_IO][M_CHAR].t_setmask & C_SH(i))) && 541c80476e4SDavid E. O'Brien (ttychars[TS_IO][i] != ttychars[EX_IO][i])) 542c80476e4SDavid E. O'Brien ttychars[ED_IO][i] = ttychars[TS_IO][i]; 543c80476e4SDavid E. O'Brien if (ttylist[ED_IO][M_CHAR].t_clrmask & C_SH(i)) 544c80476e4SDavid E. O'Brien ttychars[ED_IO][i] = vdisable; 545c80476e4SDavid E. O'Brien } 546c80476e4SDavid E. O'Brien tty_setchar(&edtty, ttychars[ED_IO]); 547c80476e4SDavid E. O'Brien 548c80476e4SDavid E. O'Brien for (i = 0; i < C_NCC; i++) { 549c80476e4SDavid E. O'Brien if (!((ttylist[EX_IO][M_CHAR].t_setmask & C_SH(i))) && 550c80476e4SDavid E. O'Brien (ttychars[TS_IO][i] != ttychars[EX_IO][i])) 551c80476e4SDavid E. O'Brien ttychars[EX_IO][i] = ttychars[TS_IO][i]; 552c80476e4SDavid E. O'Brien if (ttylist[EX_IO][M_CHAR].t_clrmask & C_SH(i)) 553c80476e4SDavid E. O'Brien ttychars[EX_IO][i] = vdisable; 554c80476e4SDavid E. O'Brien } 555c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 556c80476e4SDavid E. O'Brien } 557c80476e4SDavid E. O'Brien 558c80476e4SDavid E. O'Brien } 559c80476e4SDavid E. O'Brien } 560c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &edtty) == -1) { 561c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 562c80476e4SDavid E. O'Brien xprintf("Rawmode: tty_setty: %s\n", strerror(errno)); 563c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 564c80476e4SDavid E. O'Brien return(-1); 565c80476e4SDavid E. O'Brien } 5663b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 567c80476e4SDavid E. O'Brien Tty_raw_mode = 1; 568c80476e4SDavid E. O'Brien flush(); /* flush any buffered output */ 569c80476e4SDavid E. O'Brien return (0); 570c80476e4SDavid E. O'Brien } 571c80476e4SDavid E. O'Brien 572c80476e4SDavid E. O'Brien int 573c80476e4SDavid E. O'Brien Cookedmode() 574c80476e4SDavid E. O'Brien { /* set tty in normal setup */ 5753b6eaa7bSAndrey A. Chernov #ifdef WINNT_NATIVE 576c80476e4SDavid E. O'Brien do_nt_cooked_mode(); 577c80476e4SDavid E. O'Brien #else 578c80476e4SDavid E. O'Brien signalfun_t orig_intr; 579c80476e4SDavid E. O'Brien 580c80476e4SDavid E. O'Brien # ifdef _IBMR2 581c80476e4SDavid E. O'Brien tty_setdisc(SHTTY, EX_IO); 582c80476e4SDavid E. O'Brien # endif /* _IBMR2 */ 583c80476e4SDavid E. O'Brien 584c80476e4SDavid E. O'Brien if (!Tty_raw_mode) 585c80476e4SDavid E. O'Brien return (0); 586c80476e4SDavid E. O'Brien 587c80476e4SDavid E. O'Brien /* hold this for reseting tty */ 588c80476e4SDavid E. O'Brien # ifdef BSDSIGS 589c80476e4SDavid E. O'Brien orig_intr = (signalfun_t) signal(SIGINT, SIG_IGN); 590c80476e4SDavid E. O'Brien # else 591c80476e4SDavid E. O'Brien # ifdef SIG_HOLD 592c80476e4SDavid E. O'Brien /* 593c80476e4SDavid E. O'Brien * sigset doesn't return the previous handler if the signal is held, 594c80476e4SDavid E. O'Brien * it will return SIG_HOLD instead. So instead of restoring the 595c80476e4SDavid E. O'Brien * the signal we would end up installing a blocked SIGINT with a 596c80476e4SDavid E. O'Brien * SIG_IGN signal handler. This is what happened when Cookedmode 597c80476e4SDavid E. O'Brien * was called from sched_run, disabling interrupt for the rest 598c80476e4SDavid E. O'Brien * of your session. 599c80476e4SDavid E. O'Brien * 600c80476e4SDavid E. O'Brien * This is what we do: 601c80476e4SDavid E. O'Brien * - if the signal is blocked, keep it that way 602c80476e4SDavid E. O'Brien * - else set it to SIG_IGN 603c80476e4SDavid E. O'Brien * 604c80476e4SDavid E. O'Brien * Casper Dik (casper@fwi.uva.nl) 605c80476e4SDavid E. O'Brien */ 606c80476e4SDavid E. O'Brien orig_intr = (signalfun_t) sigset(SIGINT, SIG_HOLD); 607c80476e4SDavid E. O'Brien if (orig_intr != SIG_HOLD) 608c80476e4SDavid E. O'Brien (void) sigset(SIGINT, SIG_IGN); /* returns SIG_HOLD */ 609c80476e4SDavid E. O'Brien # else /* !SIG_HOLD */ 610c80476e4SDavid E. O'Brien /* 611c80476e4SDavid E. O'Brien * No SIG_HOLD; probably no reliable signals as well. 612c80476e4SDavid E. O'Brien */ 613c80476e4SDavid E. O'Brien orig_intr = (signalfun_t) sigset(SIGINT, SIG_IGN); 614c80476e4SDavid E. O'Brien # endif /* SIG_HOLD */ 615c80476e4SDavid E. O'Brien # endif /* BSDSIGS */ 616c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &extty) == -1) { 617c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 618c80476e4SDavid E. O'Brien xprintf("Cookedmode: tty_setty: %s\n", strerror(errno)); 619c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 620c80476e4SDavid E. O'Brien return -1; 621c80476e4SDavid E. O'Brien } 622c80476e4SDavid E. O'Brien # ifdef BSDSIGS 623c80476e4SDavid E. O'Brien (void) signal(SIGINT, orig_intr); /* take these again */ 624c80476e4SDavid E. O'Brien # else 625c80476e4SDavid E. O'Brien (void) sigset(SIGINT, orig_intr); /* take these again */ 626c80476e4SDavid E. O'Brien # endif /* BSDSIGS */ 6273b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 628c80476e4SDavid E. O'Brien 629c80476e4SDavid E. O'Brien Tty_raw_mode = 0; 630c80476e4SDavid E. O'Brien return (0); 631c80476e4SDavid E. O'Brien } 632c80476e4SDavid E. O'Brien 633c80476e4SDavid E. O'Brien void 634c80476e4SDavid E. O'Brien ResetInLine(macro) 635c80476e4SDavid E. O'Brien int macro; 636c80476e4SDavid E. O'Brien { 637c80476e4SDavid E. O'Brien Cursor = InputBuf; /* reset cursor */ 638c80476e4SDavid E. O'Brien LastChar = InputBuf; 639c80476e4SDavid E. O'Brien InputLim = &InputBuf[INBUFSIZE - 2]; 640c80476e4SDavid E. O'Brien Mark = InputBuf; 641c80476e4SDavid E. O'Brien MetaNext = 0; 642c80476e4SDavid E. O'Brien CurrentKeyMap = CcKeyMap; 643c80476e4SDavid E. O'Brien AltKeyMap = 0; 644c80476e4SDavid E. O'Brien Hist_num = 0; 645c80476e4SDavid E. O'Brien DoingArg = 0; 646c80476e4SDavid E. O'Brien Argument = 1; 647c80476e4SDavid E. O'Brien LastCmd = F_UNASSIGNED; /* previous command executed */ 648c80476e4SDavid E. O'Brien if (macro) 649c80476e4SDavid E. O'Brien MacroLvl = -1; /* no currently active macros */ 650c80476e4SDavid E. O'Brien } 651c80476e4SDavid E. O'Brien 652c80476e4SDavid E. O'Brien static Char *Input_Line = NULL; 653c80476e4SDavid E. O'Brien int 654c80476e4SDavid E. O'Brien Load_input_line() 655c80476e4SDavid E. O'Brien { 656c80476e4SDavid E. O'Brien #ifdef SUNOS4 657c80476e4SDavid E. O'Brien long chrs = 0; 658c80476e4SDavid E. O'Brien #else /* !SUNOS4 */ 659c80476e4SDavid E. O'Brien /* 660c80476e4SDavid E. O'Brien * *Everyone* else has an int, but SunOS wants long! 661c80476e4SDavid E. O'Brien * This breaks where int != long (alpha) 662c80476e4SDavid E. O'Brien */ 663c80476e4SDavid E. O'Brien int chrs = 0; 664c80476e4SDavid E. O'Brien #endif /* SUNOS4 */ 665c80476e4SDavid E. O'Brien 666c80476e4SDavid E. O'Brien if (Input_Line) 667c80476e4SDavid E. O'Brien xfree((ptr_t) Input_Line); 668c80476e4SDavid E. O'Brien Input_Line = NULL; 669c80476e4SDavid E. O'Brien 670c80476e4SDavid E. O'Brien if (Tty_raw_mode) 671c80476e4SDavid E. O'Brien return 0; 672c80476e4SDavid E. O'Brien 673c80476e4SDavid E. O'Brien #if defined(FIONREAD) && !defined(OREO) 674c80476e4SDavid E. O'Brien (void) ioctl(SHIN, FIONREAD, (ioctl_t) &chrs); 675c80476e4SDavid E. O'Brien if (chrs > 0) { 676c80476e4SDavid E. O'Brien char buf[BUFSIZE]; 677c80476e4SDavid E. O'Brien 678c80476e4SDavid E. O'Brien chrs = read(SHIN, buf, (size_t) min(chrs, BUFSIZE - 1)); 679c80476e4SDavid E. O'Brien if (chrs > 0) { 680c80476e4SDavid E. O'Brien buf[chrs] = '\0'; 681c80476e4SDavid E. O'Brien Input_Line = Strsave(str2short(buf)); 682c80476e4SDavid E. O'Brien PushMacro(Input_Line); 683c80476e4SDavid E. O'Brien } 684c80476e4SDavid E. O'Brien #ifdef convex 685c80476e4SDavid E. O'Brien /* need to print errno message in case file is migrated */ 686c80476e4SDavid E. O'Brien if (chrs < 0) 687c80476e4SDavid E. O'Brien stderror(ERR_SYSTEM, progname, strerror(errno)); 688c80476e4SDavid E. O'Brien #endif 689c80476e4SDavid E. O'Brien } 690c80476e4SDavid E. O'Brien #endif /* FIONREAD && !OREO */ 691c80476e4SDavid E. O'Brien return chrs > 0; 692c80476e4SDavid E. O'Brien } 693c80476e4SDavid E. O'Brien 694c80476e4SDavid E. O'Brien /* 695c80476e4SDavid E. O'Brien * Bugfix (in Swedish) by: 696c80476e4SDavid E. O'Brien * Johan Widen 697c80476e4SDavid E. O'Brien * SICS, PO Box 1263, S-163 13 SPANGA, SWEDEN 698c80476e4SDavid E. O'Brien * {mcvax,munnari,cernvax,diku,inria,prlb2,penet,ukc,unido}!enea!sics.se!jw 699c80476e4SDavid E. O'Brien * Internet: jw@sics.se 700c80476e4SDavid E. O'Brien * 701c80476e4SDavid E. O'Brien * (via Hans J Albertsson (thanks)) 702c80476e4SDavid E. O'Brien */ 703c80476e4SDavid E. O'Brien void 704c80476e4SDavid E. O'Brien QuoteModeOn() 705c80476e4SDavid E. O'Brien { 706c80476e4SDavid E. O'Brien if (MacroLvl >= 0) 707c80476e4SDavid E. O'Brien return; 708c80476e4SDavid E. O'Brien 7093b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 710c80476e4SDavid E. O'Brien qutty = edtty; 711c80476e4SDavid E. O'Brien 712c80476e4SDavid E. O'Brien #if defined(TERMIO) || defined(POSIX) 713c80476e4SDavid E. O'Brien qutty.d_t.c_iflag &= ~ttylist[QU_IO][M_INPUT].t_clrmask; 714c80476e4SDavid E. O'Brien qutty.d_t.c_iflag |= ttylist[QU_IO][M_INPUT].t_setmask; 715c80476e4SDavid E. O'Brien 716c80476e4SDavid E. O'Brien qutty.d_t.c_oflag &= ~ttylist[QU_IO][M_OUTPUT].t_clrmask; 717c80476e4SDavid E. O'Brien qutty.d_t.c_oflag |= ttylist[QU_IO][M_OUTPUT].t_setmask; 718c80476e4SDavid E. O'Brien 719c80476e4SDavid E. O'Brien qutty.d_t.c_cflag &= ~ttylist[QU_IO][M_CONTROL].t_clrmask; 720c80476e4SDavid E. O'Brien qutty.d_t.c_cflag |= ttylist[QU_IO][M_CONTROL].t_setmask; 721c80476e4SDavid E. O'Brien 722c80476e4SDavid E. O'Brien qutty.d_t.c_lflag &= ~ttylist[QU_IO][M_LINED].t_clrmask; 723c80476e4SDavid E. O'Brien qutty.d_t.c_lflag |= ttylist[QU_IO][M_LINED].t_setmask; 724c80476e4SDavid E. O'Brien #else /* GSTTY */ 725c80476e4SDavid E. O'Brien qutty.d_t.sg_flags &= ~ttylist[QU_IO][M_CONTROL].t_clrmask; 726c80476e4SDavid E. O'Brien qutty.d_t.sg_flags |= ttylist[QU_IO][M_CONTROL].t_setmask; 727c80476e4SDavid E. O'Brien qutty.d_lb &= ~ttylist[QU_IO][M_LOCAL].t_clrmask; 728c80476e4SDavid E. O'Brien qutty.d_lb |= ttylist[QU_IO][M_LOCAL].t_setmask; 729c80476e4SDavid E. O'Brien 730c80476e4SDavid E. O'Brien #endif /* TERMIO || POSIX */ 731c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &qutty) == -1) { 732c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 733c80476e4SDavid E. O'Brien xprintf("QuoteModeOn: tty_setty: %s\n", strerror(errno)); 734c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 735c80476e4SDavid E. O'Brien return; 736c80476e4SDavid E. O'Brien } 7373b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */ 738c80476e4SDavid E. O'Brien Tty_quote_mode = 1; 739c80476e4SDavid E. O'Brien return; 740c80476e4SDavid E. O'Brien } 741c80476e4SDavid E. O'Brien 742c80476e4SDavid E. O'Brien void 743c80476e4SDavid E. O'Brien QuoteModeOff() 744c80476e4SDavid E. O'Brien { 745c80476e4SDavid E. O'Brien if (!Tty_quote_mode) 746c80476e4SDavid E. O'Brien return; 747c80476e4SDavid E. O'Brien Tty_quote_mode = 0; 748c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &edtty) == -1) { 749c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 750c80476e4SDavid E. O'Brien xprintf("QuoteModeOff: tty_setty: %s\n", strerror(errno)); 751c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 752c80476e4SDavid E. O'Brien return; 753c80476e4SDavid E. O'Brien } 754c80476e4SDavid E. O'Brien return; 755c80476e4SDavid E. O'Brien } 756