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