18e66bd9eSDavid E. O'Brien /* $Header: /src/pub/tcsh/ed.init.c,v 3.42 2000/01/14 22:57:26 christos 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 398e66bd9eSDavid E. O'Brien RCSID("$Id: ed.init.c,v 3.42 2000/01/14 22:57:26 christos 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) && \ 180c80476e4SDavid E. O'Brien !defined(WINNT) 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 } 196c80476e4SDavid E. O'Brien #else /* ! POSIX || !_PC_VDISABLE || BSD4_4 || WINNT */ 197c80476e4SDavid E. O'Brien vdisable = (unsigned char) _POSIX_VDISABLE; 198c80476e4SDavid E. O'Brien #endif /* POSIX && _PC_VDISABLE && !BSD4_4 && !WINNT */ 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; 211c80476e4SDavid E. O'Brien 212c80476e4SDavid E. O'Brien #ifndef WINNT 213c80476e4SDavid E. O'Brien if (tty_getty(SHTTY, &extty) == -1) { 214c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 215c80476e4SDavid E. O'Brien xprintf("ed_Setup: tty_getty: %s\n", strerror(errno)); 216c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 217c80476e4SDavid E. O'Brien return(-1); 218c80476e4SDavid E. O'Brien } 219c80476e4SDavid E. O'Brien 220c80476e4SDavid E. O'Brien tstty = edtty = extty; 221c80476e4SDavid E. O'Brien 222c80476e4SDavid E. O'Brien T_Speed = tty_getspeed(&extty); 223c80476e4SDavid E. O'Brien T_Tabs = tty_gettabs(&extty); 224c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&extty); 225c80476e4SDavid E. O'Brien 226c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO) 227c80476e4SDavid E. O'Brien extty.d_t.c_iflag &= ~ttylist[EX_IO][M_INPUT].t_clrmask; 228c80476e4SDavid E. O'Brien extty.d_t.c_iflag |= ttylist[EX_IO][M_INPUT].t_setmask; 229c80476e4SDavid E. O'Brien 230c80476e4SDavid E. O'Brien extty.d_t.c_oflag &= ~ttylist[EX_IO][M_OUTPUT].t_clrmask; 231c80476e4SDavid E. O'Brien extty.d_t.c_oflag |= ttylist[EX_IO][M_OUTPUT].t_setmask; 232c80476e4SDavid E. O'Brien 233c80476e4SDavid E. O'Brien extty.d_t.c_cflag &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 234c80476e4SDavid E. O'Brien extty.d_t.c_cflag |= ttylist[EX_IO][M_CONTROL].t_setmask; 235c80476e4SDavid E. O'Brien 236c80476e4SDavid E. O'Brien extty.d_t.c_lflag &= ~ttylist[EX_IO][M_LINED].t_clrmask; 237c80476e4SDavid E. O'Brien extty.d_t.c_lflag |= ttylist[EX_IO][M_LINED].t_setmask; 238c80476e4SDavid E. O'Brien 239c80476e4SDavid E. O'Brien # if defined(IRIX3_3) && SYSVREL < 4 240c80476e4SDavid E. O'Brien extty.d_t.c_line = NTTYDISC; 241c80476e4SDavid E. O'Brien # endif /* IRIX3_3 && SYSVREL < 4 */ 242c80476e4SDavid E. O'Brien 243c80476e4SDavid E. O'Brien # else /* GSTTY */ /* V7, Berkeley style tty */ 244c80476e4SDavid E. O'Brien 245c80476e4SDavid E. O'Brien if (T_Tabs) { /* order of &= and |= is important to XTABS */ 246c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~(ttylist[EX_IO][M_CONTROL].t_clrmask|XTABS); 247c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= ttylist[EX_IO][M_CONTROL].t_setmask; 248c80476e4SDavid E. O'Brien } 249c80476e4SDavid E. O'Brien else { 250c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 251c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= (ttylist[EX_IO][M_CONTROL].t_setmask|XTABS); 252c80476e4SDavid E. O'Brien } 253c80476e4SDavid E. O'Brien 254c80476e4SDavid E. O'Brien extty.d_lb &= ~ttylist[EX_IO][M_LOCAL].t_clrmask; 255c80476e4SDavid E. O'Brien extty.d_lb |= ttylist[EX_IO][M_LOCAL].t_setmask; 256c80476e4SDavid E. O'Brien 257c80476e4SDavid E. O'Brien # endif /* GSTTY */ 258c80476e4SDavid E. O'Brien /* 259c80476e4SDavid E. O'Brien * Reset the tty chars to reasonable defaults 260c80476e4SDavid E. O'Brien * If they are disabled, then enable them. 261c80476e4SDavid E. O'Brien */ 262c80476e4SDavid E. O'Brien if (rst) { 263c80476e4SDavid E. O'Brien if (tty_cooked_mode(&tstty)) { 264c80476e4SDavid E. O'Brien tty_getchar(&tstty, ttychars[TS_IO]); 265c80476e4SDavid E. O'Brien /* 266c80476e4SDavid E. O'Brien * Don't affect CMIN and CTIME for the editor mode 267c80476e4SDavid E. O'Brien */ 268c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC - 2; rst++) 269c80476e4SDavid E. O'Brien if (ttychars[TS_IO][rst] != vdisable && 270c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] != vdisable) 271c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] = ttychars[TS_IO][rst]; 272c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC; rst++) 273c80476e4SDavid E. O'Brien if (ttychars[TS_IO][rst] != vdisable && 274c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] != vdisable) 275c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] = ttychars[TS_IO][rst]; 276c80476e4SDavid E. O'Brien } 277c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 278c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &extty) == -1) { 279c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 280c80476e4SDavid E. O'Brien xprintf("ed_Setup: tty_setty: %s\n", strerror(errno)); 281c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 282c80476e4SDavid E. O'Brien return(-1); 283c80476e4SDavid E. O'Brien } 284c80476e4SDavid E. O'Brien } 285c80476e4SDavid E. O'Brien else 286c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 287c80476e4SDavid E. O'Brien 288c80476e4SDavid E. O'Brien # ifdef SIG_WINDOW 289c80476e4SDavid E. O'Brien (void) sigset(SIG_WINDOW, window_change); /* for window systems */ 290c80476e4SDavid E. O'Brien # endif 291c80476e4SDavid E. O'Brien #else /* WINNT */ 292c80476e4SDavid E. O'Brien # ifdef DEBUG 293c80476e4SDavid E. O'Brien if (rst) 294c80476e4SDavid E. O'Brien xprintf("rst received in ed_Setup() %d\n", rst); 295c80476e4SDavid E. O'Brien # endif 296c80476e4SDavid E. O'Brien #endif /* WINNT */ 297c80476e4SDavid E. O'Brien havesetup = 1; 298c80476e4SDavid E. O'Brien return(0); 299c80476e4SDavid E. O'Brien } 300c80476e4SDavid E. O'Brien 301c80476e4SDavid E. O'Brien void 302c80476e4SDavid E. O'Brien ed_Init() 303c80476e4SDavid E. O'Brien { 304c80476e4SDavid E. O'Brien ResetInLine(1); /* reset the input pointers */ 305c80476e4SDavid E. O'Brien GettingInput = 0; /* just in case */ 306c80476e4SDavid E. O'Brien LastKill = KillBuf; /* no kill buffer */ 307c80476e4SDavid E. O'Brien 308c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT 309c80476e4SDavid E. O'Brien CheckMaps(); /* do a little error checking on key maps */ 310c80476e4SDavid E. O'Brien #endif 311c80476e4SDavid E. O'Brien 312c80476e4SDavid E. O'Brien if (ed_Setup(0) == -1) 313c80476e4SDavid E. O'Brien return; 314c80476e4SDavid E. O'Brien 315c80476e4SDavid E. O'Brien /* 316c80476e4SDavid E. O'Brien * if we have been called before but GotTermCaps isn't set, our TERM has 317c80476e4SDavid E. O'Brien * changed, so get new termcaps and try again 318c80476e4SDavid E. O'Brien */ 319c80476e4SDavid E. O'Brien 320c80476e4SDavid E. O'Brien if (!GotTermCaps) 321c80476e4SDavid E. O'Brien GetTermCaps(); /* does the obvious, but gets term type each 322c80476e4SDavid E. O'Brien * time */ 323c80476e4SDavid E. O'Brien 324c80476e4SDavid E. O'Brien #ifndef WINNT 325c80476e4SDavid E. O'Brien # if defined(TERMIO) || defined(POSIX) 326c80476e4SDavid E. O'Brien edtty.d_t.c_iflag &= ~ttylist[ED_IO][M_INPUT].t_clrmask; 327c80476e4SDavid E. O'Brien edtty.d_t.c_iflag |= ttylist[ED_IO][M_INPUT].t_setmask; 328c80476e4SDavid E. O'Brien 329c80476e4SDavid E. O'Brien edtty.d_t.c_oflag &= ~ttylist[ED_IO][M_OUTPUT].t_clrmask; 330c80476e4SDavid E. O'Brien edtty.d_t.c_oflag |= ttylist[ED_IO][M_OUTPUT].t_setmask; 331c80476e4SDavid E. O'Brien 332c80476e4SDavid E. O'Brien edtty.d_t.c_cflag &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 333c80476e4SDavid E. O'Brien edtty.d_t.c_cflag |= ttylist[ED_IO][M_CONTROL].t_setmask; 334c80476e4SDavid E. O'Brien 335c80476e4SDavid E. O'Brien edtty.d_t.c_lflag &= ~ttylist[ED_IO][M_LINED].t_clrmask; 336c80476e4SDavid E. O'Brien edtty.d_t.c_lflag |= ttylist[ED_IO][M_LINED].t_setmask; 337c80476e4SDavid E. O'Brien 338c80476e4SDavid E. O'Brien 339c80476e4SDavid E. O'Brien # if defined(IRIX3_3) && SYSVREL < 4 340c80476e4SDavid E. O'Brien edtty.d_t.c_line = NTTYDISC; 341c80476e4SDavid E. O'Brien # endif /* IRIX3_3 && SYSVREL < 4 */ 342c80476e4SDavid E. O'Brien 343c80476e4SDavid E. O'Brien # else /* GSTTY */ 344c80476e4SDavid E. O'Brien 345c80476e4SDavid E. O'Brien if (T_Tabs) { /* order of &= and |= is important to XTABS */ 346c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= ~(ttylist[ED_IO][M_CONTROL].t_clrmask | XTABS); 347c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= ttylist[ED_IO][M_CONTROL].t_setmask; 348c80476e4SDavid E. O'Brien } 349c80476e4SDavid E. O'Brien else { 350c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 351c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= (ttylist[ED_IO][M_CONTROL].t_setmask | XTABS); 352c80476e4SDavid E. O'Brien } 353c80476e4SDavid E. O'Brien 354c80476e4SDavid E. O'Brien edtty.d_lb &= ~ttylist[ED_IO][M_LOCAL].t_clrmask; 355c80476e4SDavid E. O'Brien edtty.d_lb |= ttylist[ED_IO][M_LOCAL].t_setmask; 356c80476e4SDavid E. O'Brien # endif /* POSIX || TERMIO */ 357c80476e4SDavid E. O'Brien 358c80476e4SDavid E. O'Brien tty_setchar(&edtty, ttychars[ED_IO]); 359c80476e4SDavid E. O'Brien #endif /* WINNT */ 360c80476e4SDavid E. O'Brien } 361c80476e4SDavid E. O'Brien 362c80476e4SDavid E. O'Brien /* 363c80476e4SDavid E. O'Brien * Check and re-init the line. set the terminal into 1 char at a time mode. 364c80476e4SDavid E. O'Brien */ 365c80476e4SDavid E. O'Brien int 366c80476e4SDavid E. O'Brien Rawmode() 367c80476e4SDavid E. O'Brien { 368c80476e4SDavid E. O'Brien if (Tty_raw_mode) 369c80476e4SDavid E. O'Brien return (0); 370c80476e4SDavid E. O'Brien 371c80476e4SDavid E. O'Brien #ifdef WINNT 372c80476e4SDavid E. O'Brien do_nt_raw_mode(); 373c80476e4SDavid E. O'Brien #else /* !WINNT */ 374c80476e4SDavid E. O'Brien # ifdef _IBMR2 375c80476e4SDavid E. O'Brien tty_setdisc(SHTTY, ED_IO); 376c80476e4SDavid E. O'Brien # endif /* _IBMR2 */ 377c80476e4SDavid E. O'Brien 378c80476e4SDavid E. O'Brien if (tty_getty(SHTTY, &tstty) == -1) { 379c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 380c80476e4SDavid E. O'Brien xprintf("Rawmode: tty_getty: %s\n", strerror(errno)); 381c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 382c80476e4SDavid E. O'Brien return(-1); 383c80476e4SDavid E. O'Brien } 384c80476e4SDavid E. O'Brien 385c80476e4SDavid E. O'Brien /* 386c80476e4SDavid E. O'Brien * We always keep up with the eight bit setting and the speed of the 387c80476e4SDavid E. O'Brien * tty. But only we only believe changes that are made to cooked mode! 388c80476e4SDavid E. O'Brien */ 389c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO) 390c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&tstty); 391c80476e4SDavid E. O'Brien T_Speed = tty_getspeed(&tstty); 392c80476e4SDavid E. O'Brien 393c80476e4SDavid E. O'Brien # ifdef POSIX 394c80476e4SDavid E. O'Brien /* 395c80476e4SDavid E. O'Brien * Fix from: Steven (Steve) B. Green <xrsbg@charney.gsfc.nasa.gov> 396c80476e4SDavid E. O'Brien * Speed was not being set up correctly under POSIX. 397c80476e4SDavid E. O'Brien */ 398c80476e4SDavid E. O'Brien if (tty_getspeed(&extty) != T_Speed || tty_getspeed(&edtty) != T_Speed) { 399c80476e4SDavid E. O'Brien (void) cfsetispeed(&extty.d_t, T_Speed); 400c80476e4SDavid E. O'Brien (void) cfsetospeed(&extty.d_t, T_Speed); 401c80476e4SDavid E. O'Brien (void) cfsetispeed(&edtty.d_t, T_Speed); 402c80476e4SDavid E. O'Brien (void) cfsetospeed(&edtty.d_t, T_Speed); 403c80476e4SDavid E. O'Brien } 404c80476e4SDavid E. O'Brien # endif /* POSIX */ 405c80476e4SDavid E. O'Brien # else /* GSTTY */ 406c80476e4SDavid E. O'Brien 407c80476e4SDavid E. O'Brien T_Speed = tty_getspeed(&tstty); 408c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&tstty); 409c80476e4SDavid E. O'Brien 410c80476e4SDavid E. O'Brien if (extty.d_t.sg_ispeed != tstty.d_t.sg_ispeed) { 411c80476e4SDavid E. O'Brien extty.d_t.sg_ispeed = tstty.d_t.sg_ispeed; 412c80476e4SDavid E. O'Brien edtty.d_t.sg_ispeed = tstty.d_t.sg_ispeed; 413c80476e4SDavid E. O'Brien } 414c80476e4SDavid E. O'Brien 415c80476e4SDavid E. O'Brien if (extty.d_t.sg_ospeed != tstty.d_t.sg_ospeed) { 416c80476e4SDavid E. O'Brien extty.d_t.sg_ospeed = tstty.d_t.sg_ospeed; 417c80476e4SDavid E. O'Brien edtty.d_t.sg_ospeed = tstty.d_t.sg_ospeed; 418c80476e4SDavid E. O'Brien } 419c80476e4SDavid E. O'Brien # endif /* POSIX || TERMIO */ 420c80476e4SDavid E. O'Brien 421c80476e4SDavid E. O'Brien if (tty_cooked_mode(&tstty)) { 422c80476e4SDavid E. O'Brien /* 423c80476e4SDavid E. O'Brien * re-test for some things here (like maybe the user typed 424c80476e4SDavid E. O'Brien * "stty -tabs" 425c80476e4SDavid E. O'Brien */ 426c80476e4SDavid E. O'Brien if (tty_gettabs(&tstty) == 0) 427c80476e4SDavid E. O'Brien T_Tabs = 0; 428c80476e4SDavid E. O'Brien else 429c80476e4SDavid E. O'Brien T_Tabs = CanWeTab(); 430c80476e4SDavid E. O'Brien 431c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO) 432c80476e4SDavid E. O'Brien extty.d_t.c_cflag = tstty.d_t.c_cflag; 433c80476e4SDavid E. O'Brien extty.d_t.c_cflag &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 434c80476e4SDavid E. O'Brien extty.d_t.c_cflag |= ttylist[EX_IO][M_CONTROL].t_setmask; 435c80476e4SDavid E. O'Brien 436c80476e4SDavid E. O'Brien edtty.d_t.c_cflag = tstty.d_t.c_cflag; 437c80476e4SDavid E. O'Brien edtty.d_t.c_cflag &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 438c80476e4SDavid E. O'Brien edtty.d_t.c_cflag |= ttylist[ED_IO][M_CONTROL].t_setmask; 439c80476e4SDavid E. O'Brien 440c80476e4SDavid E. O'Brien extty.d_t.c_lflag = tstty.d_t.c_lflag; 441c80476e4SDavid E. O'Brien extty.d_t.c_lflag &= ~ttylist[EX_IO][M_LINED].t_clrmask; 442c80476e4SDavid E. O'Brien extty.d_t.c_lflag |= ttylist[EX_IO][M_LINED].t_setmask; 443c80476e4SDavid E. O'Brien 444c80476e4SDavid E. O'Brien edtty.d_t.c_lflag = tstty.d_t.c_lflag; 445c80476e4SDavid E. O'Brien edtty.d_t.c_lflag &= ~ttylist[ED_IO][M_LINED].t_clrmask; 446c80476e4SDavid E. O'Brien edtty.d_t.c_lflag |= ttylist[ED_IO][M_LINED].t_setmask; 447c80476e4SDavid E. O'Brien 448c80476e4SDavid E. O'Brien extty.d_t.c_iflag = tstty.d_t.c_iflag; 449c80476e4SDavid E. O'Brien extty.d_t.c_iflag &= ~ttylist[EX_IO][M_INPUT].t_clrmask; 450c80476e4SDavid E. O'Brien extty.d_t.c_iflag |= ttylist[EX_IO][M_INPUT].t_setmask; 451c80476e4SDavid E. O'Brien 452c80476e4SDavid E. O'Brien edtty.d_t.c_iflag = tstty.d_t.c_iflag; 453c80476e4SDavid E. O'Brien edtty.d_t.c_iflag &= ~ttylist[ED_IO][M_INPUT].t_clrmask; 454c80476e4SDavid E. O'Brien edtty.d_t.c_iflag |= ttylist[ED_IO][M_INPUT].t_setmask; 455c80476e4SDavid E. O'Brien 456c80476e4SDavid E. O'Brien extty.d_t.c_oflag = tstty.d_t.c_oflag; 457c80476e4SDavid E. O'Brien extty.d_t.c_oflag &= ~ttylist[EX_IO][M_OUTPUT].t_clrmask; 458c80476e4SDavid E. O'Brien extty.d_t.c_oflag |= ttylist[EX_IO][M_OUTPUT].t_setmask; 459c80476e4SDavid E. O'Brien 460c80476e4SDavid E. O'Brien edtty.d_t.c_oflag = tstty.d_t.c_oflag; 461c80476e4SDavid E. O'Brien edtty.d_t.c_oflag &= ~ttylist[ED_IO][M_OUTPUT].t_clrmask; 462c80476e4SDavid E. O'Brien edtty.d_t.c_oflag |= ttylist[ED_IO][M_OUTPUT].t_setmask; 463c80476e4SDavid E. O'Brien 464c80476e4SDavid E. O'Brien # else /* GSTTY */ 465c80476e4SDavid E. O'Brien 466c80476e4SDavid E. O'Brien extty.d_t.sg_flags = tstty.d_t.sg_flags; 467c80476e4SDavid E. O'Brien 468c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 469c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= ttylist[EX_IO][M_CONTROL].t_setmask; 470c80476e4SDavid E. O'Brien 471c80476e4SDavid E. O'Brien if (T_Tabs) /* order of &= and |= is important to XTABS */ 472c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~XTABS; 473c80476e4SDavid E. O'Brien else 474c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= XTABS; 475c80476e4SDavid E. O'Brien 476c80476e4SDavid E. O'Brien extty.d_lb = tstty.d_lb; 477c80476e4SDavid E. O'Brien extty.d_lb &= ~ttylist[EX_IO][M_LOCAL].t_clrmask; 478c80476e4SDavid E. O'Brien extty.d_lb |= ttylist[EX_IO][M_LOCAL].t_setmask; 479c80476e4SDavid E. O'Brien 480c80476e4SDavid E. O'Brien edtty.d_t.sg_flags = extty.d_t.sg_flags; 481c80476e4SDavid E. O'Brien if (T_Tabs) { /* order of &= and |= is important to XTABS */ 482c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= 483c80476e4SDavid E. O'Brien ~(ttylist[ED_IO][M_CONTROL].t_clrmask|XTABS); 484c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= ttylist[ED_IO][M_CONTROL].t_setmask; 485c80476e4SDavid E. O'Brien } 486c80476e4SDavid E. O'Brien else { 487c80476e4SDavid E. O'Brien edtty.d_t.sg_flags &= ~ttylist[ED_IO][M_CONTROL].t_clrmask; 488c80476e4SDavid E. O'Brien edtty.d_t.sg_flags |= 489c80476e4SDavid E. O'Brien (ttylist[ED_IO][M_CONTROL].t_setmask|XTABS); 490c80476e4SDavid E. O'Brien } 491c80476e4SDavid E. O'Brien 492c80476e4SDavid E. O'Brien edtty.d_lb = tstty.d_lb; 493c80476e4SDavid E. O'Brien edtty.d_lb &= ~ttylist[ED_IO][M_LOCAL].t_clrmask; 494c80476e4SDavid E. O'Brien edtty.d_lb |= ttylist[ED_IO][M_LOCAL].t_setmask; 495c80476e4SDavid E. O'Brien 496c80476e4SDavid E. O'Brien # endif /* TERMIO || POSIX */ 497c80476e4SDavid E. O'Brien 498c80476e4SDavid E. O'Brien { 499c80476e4SDavid E. O'Brien extern int didsetty; 500c80476e4SDavid E. O'Brien int i; 501c80476e4SDavid E. O'Brien 502c80476e4SDavid E. O'Brien tty_getchar(&tstty, ttychars[TS_IO]); 503c80476e4SDavid E. O'Brien /* 504c80476e4SDavid E. O'Brien * Check if the user made any changes. 505c80476e4SDavid E. O'Brien * If he did, then propagate the changes to the 506c80476e4SDavid E. O'Brien * edit and execute data structures. 507c80476e4SDavid E. O'Brien */ 508c80476e4SDavid E. O'Brien for (i = 0; i < C_NCC; i++) 509c80476e4SDavid E. O'Brien if (ttychars[TS_IO][i] != ttychars[EX_IO][i]) 510c80476e4SDavid E. O'Brien break; 511c80476e4SDavid E. O'Brien 512c80476e4SDavid E. O'Brien if (i != C_NCC || didsetty) { 513c80476e4SDavid E. O'Brien didsetty = 0; 514c80476e4SDavid E. O'Brien /* 515c80476e4SDavid E. O'Brien * Propagate changes only to the unprotected chars 516c80476e4SDavid E. O'Brien * that have been modified just now. 517c80476e4SDavid E. O'Brien */ 518c80476e4SDavid E. O'Brien for (i = 0; i < C_NCC; i++) { 519c80476e4SDavid E. O'Brien if (!((ttylist[ED_IO][M_CHAR].t_setmask & C_SH(i))) && 520c80476e4SDavid E. O'Brien (ttychars[TS_IO][i] != ttychars[EX_IO][i])) 521c80476e4SDavid E. O'Brien ttychars[ED_IO][i] = ttychars[TS_IO][i]; 522c80476e4SDavid E. O'Brien if (ttylist[ED_IO][M_CHAR].t_clrmask & C_SH(i)) 523c80476e4SDavid E. O'Brien ttychars[ED_IO][i] = vdisable; 524c80476e4SDavid E. O'Brien } 525c80476e4SDavid E. O'Brien tty_setchar(&edtty, ttychars[ED_IO]); 526c80476e4SDavid E. O'Brien 527c80476e4SDavid E. O'Brien for (i = 0; i < C_NCC; i++) { 528c80476e4SDavid E. O'Brien if (!((ttylist[EX_IO][M_CHAR].t_setmask & C_SH(i))) && 529c80476e4SDavid E. O'Brien (ttychars[TS_IO][i] != ttychars[EX_IO][i])) 530c80476e4SDavid E. O'Brien ttychars[EX_IO][i] = ttychars[TS_IO][i]; 531c80476e4SDavid E. O'Brien if (ttylist[EX_IO][M_CHAR].t_clrmask & C_SH(i)) 532c80476e4SDavid E. O'Brien ttychars[EX_IO][i] = vdisable; 533c80476e4SDavid E. O'Brien } 534c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 535c80476e4SDavid E. O'Brien } 536c80476e4SDavid E. O'Brien 537c80476e4SDavid E. O'Brien } 538c80476e4SDavid E. O'Brien } 539c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &edtty) == -1) { 540c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 541c80476e4SDavid E. O'Brien xprintf("Rawmode: tty_setty: %s\n", strerror(errno)); 542c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 543c80476e4SDavid E. O'Brien return(-1); 544c80476e4SDavid E. O'Brien } 545c80476e4SDavid E. O'Brien #endif /* WINNT */ 546c80476e4SDavid E. O'Brien Tty_raw_mode = 1; 547c80476e4SDavid E. O'Brien flush(); /* flush any buffered output */ 548c80476e4SDavid E. O'Brien return (0); 549c80476e4SDavid E. O'Brien } 550c80476e4SDavid E. O'Brien 551c80476e4SDavid E. O'Brien int 552c80476e4SDavid E. O'Brien Cookedmode() 553c80476e4SDavid E. O'Brien { /* set tty in normal setup */ 554c80476e4SDavid E. O'Brien #ifdef WINNT 555c80476e4SDavid E. O'Brien do_nt_cooked_mode(); 556c80476e4SDavid E. O'Brien #else 557c80476e4SDavid E. O'Brien signalfun_t orig_intr; 558c80476e4SDavid E. O'Brien 559c80476e4SDavid E. O'Brien # ifdef _IBMR2 560c80476e4SDavid E. O'Brien tty_setdisc(SHTTY, EX_IO); 561c80476e4SDavid E. O'Brien # endif /* _IBMR2 */ 562c80476e4SDavid E. O'Brien 563c80476e4SDavid E. O'Brien if (!Tty_raw_mode) 564c80476e4SDavid E. O'Brien return (0); 565c80476e4SDavid E. O'Brien 566c80476e4SDavid E. O'Brien /* hold this for reseting tty */ 567c80476e4SDavid E. O'Brien # ifdef BSDSIGS 568c80476e4SDavid E. O'Brien orig_intr = (signalfun_t) signal(SIGINT, SIG_IGN); 569c80476e4SDavid E. O'Brien # else 570c80476e4SDavid E. O'Brien # ifdef SIG_HOLD 571c80476e4SDavid E. O'Brien /* 572c80476e4SDavid E. O'Brien * sigset doesn't return the previous handler if the signal is held, 573c80476e4SDavid E. O'Brien * it will return SIG_HOLD instead. So instead of restoring the 574c80476e4SDavid E. O'Brien * the signal we would end up installing a blocked SIGINT with a 575c80476e4SDavid E. O'Brien * SIG_IGN signal handler. This is what happened when Cookedmode 576c80476e4SDavid E. O'Brien * was called from sched_run, disabling interrupt for the rest 577c80476e4SDavid E. O'Brien * of your session. 578c80476e4SDavid E. O'Brien * 579c80476e4SDavid E. O'Brien * This is what we do: 580c80476e4SDavid E. O'Brien * - if the signal is blocked, keep it that way 581c80476e4SDavid E. O'Brien * - else set it to SIG_IGN 582c80476e4SDavid E. O'Brien * 583c80476e4SDavid E. O'Brien * Casper Dik (casper@fwi.uva.nl) 584c80476e4SDavid E. O'Brien */ 585c80476e4SDavid E. O'Brien orig_intr = (signalfun_t) sigset(SIGINT, SIG_HOLD); 586c80476e4SDavid E. O'Brien if (orig_intr != SIG_HOLD) 587c80476e4SDavid E. O'Brien (void) sigset(SIGINT, SIG_IGN); /* returns SIG_HOLD */ 588c80476e4SDavid E. O'Brien # else /* !SIG_HOLD */ 589c80476e4SDavid E. O'Brien /* 590c80476e4SDavid E. O'Brien * No SIG_HOLD; probably no reliable signals as well. 591c80476e4SDavid E. O'Brien */ 592c80476e4SDavid E. O'Brien orig_intr = (signalfun_t) sigset(SIGINT, SIG_IGN); 593c80476e4SDavid E. O'Brien # endif /* SIG_HOLD */ 594c80476e4SDavid E. O'Brien # endif /* BSDSIGS */ 595c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &extty) == -1) { 596c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 597c80476e4SDavid E. O'Brien xprintf("Cookedmode: tty_setty: %s\n", strerror(errno)); 598c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 599c80476e4SDavid E. O'Brien return -1; 600c80476e4SDavid E. O'Brien } 601c80476e4SDavid E. O'Brien # ifdef BSDSIGS 602c80476e4SDavid E. O'Brien (void) signal(SIGINT, orig_intr); /* take these again */ 603c80476e4SDavid E. O'Brien # else 604c80476e4SDavid E. O'Brien (void) sigset(SIGINT, orig_intr); /* take these again */ 605c80476e4SDavid E. O'Brien # endif /* BSDSIGS */ 606c80476e4SDavid E. O'Brien #endif /* WINNT */ 607c80476e4SDavid E. O'Brien 608c80476e4SDavid E. O'Brien Tty_raw_mode = 0; 609c80476e4SDavid E. O'Brien return (0); 610c80476e4SDavid E. O'Brien } 611c80476e4SDavid E. O'Brien 612c80476e4SDavid E. O'Brien void 613c80476e4SDavid E. O'Brien ResetInLine(macro) 614c80476e4SDavid E. O'Brien int macro; 615c80476e4SDavid E. O'Brien { 616c80476e4SDavid E. O'Brien Cursor = InputBuf; /* reset cursor */ 617c80476e4SDavid E. O'Brien LastChar = InputBuf; 618c80476e4SDavid E. O'Brien InputLim = &InputBuf[INBUFSIZE - 2]; 619c80476e4SDavid E. O'Brien Mark = InputBuf; 620c80476e4SDavid E. O'Brien MetaNext = 0; 621c80476e4SDavid E. O'Brien CurrentKeyMap = CcKeyMap; 622c80476e4SDavid E. O'Brien AltKeyMap = 0; 623c80476e4SDavid E. O'Brien Hist_num = 0; 624c80476e4SDavid E. O'Brien DoingArg = 0; 625c80476e4SDavid E. O'Brien Argument = 1; 626c80476e4SDavid E. O'Brien #ifdef notdef 627c80476e4SDavid E. O'Brien LastKill = KillBuf; /* no kill buffer */ 628c80476e4SDavid E. O'Brien #endif 629c80476e4SDavid E. O'Brien LastCmd = F_UNASSIGNED; /* previous command executed */ 630c80476e4SDavid E. O'Brien if (macro) 631c80476e4SDavid E. O'Brien MacroLvl = -1; /* no currently active macros */ 632c80476e4SDavid E. O'Brien } 633c80476e4SDavid E. O'Brien 634c80476e4SDavid E. O'Brien static Char *Input_Line = NULL; 635c80476e4SDavid E. O'Brien int 636c80476e4SDavid E. O'Brien Load_input_line() 637c80476e4SDavid E. O'Brien { 638c80476e4SDavid E. O'Brien #ifdef SUNOS4 639c80476e4SDavid E. O'Brien long chrs = 0; 640c80476e4SDavid E. O'Brien #else /* !SUNOS4 */ 641c80476e4SDavid E. O'Brien /* 642c80476e4SDavid E. O'Brien * *Everyone* else has an int, but SunOS wants long! 643c80476e4SDavid E. O'Brien * This breaks where int != long (alpha) 644c80476e4SDavid E. O'Brien */ 645c80476e4SDavid E. O'Brien int chrs = 0; 646c80476e4SDavid E. O'Brien #endif /* SUNOS4 */ 647c80476e4SDavid E. O'Brien 648c80476e4SDavid E. O'Brien if (Input_Line) 649c80476e4SDavid E. O'Brien xfree((ptr_t) Input_Line); 650c80476e4SDavid E. O'Brien Input_Line = NULL; 651c80476e4SDavid E. O'Brien 652c80476e4SDavid E. O'Brien if (Tty_raw_mode) 653c80476e4SDavid E. O'Brien return 0; 654c80476e4SDavid E. O'Brien 655c80476e4SDavid E. O'Brien #if defined(FIONREAD) && !defined(OREO) 656c80476e4SDavid E. O'Brien (void) ioctl(SHIN, FIONREAD, (ioctl_t) &chrs); 657c80476e4SDavid E. O'Brien if (chrs > 0) { 658c80476e4SDavid E. O'Brien char buf[BUFSIZE]; 659c80476e4SDavid E. O'Brien 660c80476e4SDavid E. O'Brien chrs = read(SHIN, buf, (size_t) min(chrs, BUFSIZE - 1)); 661c80476e4SDavid E. O'Brien if (chrs > 0) { 662c80476e4SDavid E. O'Brien buf[chrs] = '\0'; 663c80476e4SDavid E. O'Brien Input_Line = Strsave(str2short(buf)); 664c80476e4SDavid E. O'Brien PushMacro(Input_Line); 665c80476e4SDavid E. O'Brien } 666c80476e4SDavid E. O'Brien #ifdef convex 667c80476e4SDavid E. O'Brien /* need to print errno message in case file is migrated */ 668c80476e4SDavid E. O'Brien if (chrs < 0) 669c80476e4SDavid E. O'Brien stderror(ERR_SYSTEM, progname, strerror(errno)); 670c80476e4SDavid E. O'Brien #endif 671c80476e4SDavid E. O'Brien } 672c80476e4SDavid E. O'Brien #endif /* FIONREAD && !OREO */ 673c80476e4SDavid E. O'Brien return chrs > 0; 674c80476e4SDavid E. O'Brien } 675c80476e4SDavid E. O'Brien 676c80476e4SDavid E. O'Brien /* 677c80476e4SDavid E. O'Brien * Bugfix (in Swedish) by: 678c80476e4SDavid E. O'Brien * Johan Widen 679c80476e4SDavid E. O'Brien * SICS, PO Box 1263, S-163 13 SPANGA, SWEDEN 680c80476e4SDavid E. O'Brien * {mcvax,munnari,cernvax,diku,inria,prlb2,penet,ukc,unido}!enea!sics.se!jw 681c80476e4SDavid E. O'Brien * Internet: jw@sics.se 682c80476e4SDavid E. O'Brien * 683c80476e4SDavid E. O'Brien * (via Hans J Albertsson (thanks)) 684c80476e4SDavid E. O'Brien */ 685c80476e4SDavid E. O'Brien void 686c80476e4SDavid E. O'Brien QuoteModeOn() 687c80476e4SDavid E. O'Brien { 688c80476e4SDavid E. O'Brien if (MacroLvl >= 0) 689c80476e4SDavid E. O'Brien return; 690c80476e4SDavid E. O'Brien 691c80476e4SDavid E. O'Brien #ifndef WINNT 692c80476e4SDavid E. O'Brien qutty = edtty; 693c80476e4SDavid E. O'Brien 694c80476e4SDavid E. O'Brien #if defined(TERMIO) || defined(POSIX) 695c80476e4SDavid E. O'Brien qutty.d_t.c_iflag &= ~ttylist[QU_IO][M_INPUT].t_clrmask; 696c80476e4SDavid E. O'Brien qutty.d_t.c_iflag |= ttylist[QU_IO][M_INPUT].t_setmask; 697c80476e4SDavid E. O'Brien 698c80476e4SDavid E. O'Brien qutty.d_t.c_oflag &= ~ttylist[QU_IO][M_OUTPUT].t_clrmask; 699c80476e4SDavid E. O'Brien qutty.d_t.c_oflag |= ttylist[QU_IO][M_OUTPUT].t_setmask; 700c80476e4SDavid E. O'Brien 701c80476e4SDavid E. O'Brien qutty.d_t.c_cflag &= ~ttylist[QU_IO][M_CONTROL].t_clrmask; 702c80476e4SDavid E. O'Brien qutty.d_t.c_cflag |= ttylist[QU_IO][M_CONTROL].t_setmask; 703c80476e4SDavid E. O'Brien 704c80476e4SDavid E. O'Brien qutty.d_t.c_lflag &= ~ttylist[QU_IO][M_LINED].t_clrmask; 705c80476e4SDavid E. O'Brien qutty.d_t.c_lflag |= ttylist[QU_IO][M_LINED].t_setmask; 706c80476e4SDavid E. O'Brien #else /* GSTTY */ 707c80476e4SDavid E. O'Brien qutty.d_t.sg_flags &= ~ttylist[QU_IO][M_CONTROL].t_clrmask; 708c80476e4SDavid E. O'Brien qutty.d_t.sg_flags |= ttylist[QU_IO][M_CONTROL].t_setmask; 709c80476e4SDavid E. O'Brien qutty.d_lb &= ~ttylist[QU_IO][M_LOCAL].t_clrmask; 710c80476e4SDavid E. O'Brien qutty.d_lb |= ttylist[QU_IO][M_LOCAL].t_setmask; 711c80476e4SDavid E. O'Brien 712c80476e4SDavid E. O'Brien #endif /* TERMIO || POSIX */ 713c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &qutty) == -1) { 714c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 715c80476e4SDavid E. O'Brien xprintf("QuoteModeOn: tty_setty: %s\n", strerror(errno)); 716c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 717c80476e4SDavid E. O'Brien return; 718c80476e4SDavid E. O'Brien } 719c80476e4SDavid E. O'Brien #endif /* !WINNT */ 720c80476e4SDavid E. O'Brien Tty_quote_mode = 1; 721c80476e4SDavid E. O'Brien return; 722c80476e4SDavid E. O'Brien } 723c80476e4SDavid E. O'Brien 724c80476e4SDavid E. O'Brien void 725c80476e4SDavid E. O'Brien QuoteModeOff() 726c80476e4SDavid E. O'Brien { 727c80476e4SDavid E. O'Brien if (!Tty_quote_mode) 728c80476e4SDavid E. O'Brien return; 729c80476e4SDavid E. O'Brien Tty_quote_mode = 0; 730c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &edtty) == -1) { 731c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 732c80476e4SDavid E. O'Brien xprintf("QuoteModeOff: tty_setty: %s\n", strerror(errno)); 733c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 734c80476e4SDavid E. O'Brien return; 735c80476e4SDavid E. O'Brien } 736c80476e4SDavid E. O'Brien return; 737c80476e4SDavid E. O'Brien } 738