145e5710bSMark Peek /* $Header: /p/tcsh/cvsroot/tcsh/ed.init.c,v 3.60 2006/08/24 20:56:31 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. 1729301572SMark Peek * 3. Neither the name of the University nor the names of its contributors 18c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 19c80476e4SDavid E. O'Brien * without specific prior written permission. 20c80476e4SDavid E. O'Brien * 21c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTS_ION) 28c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31c80476e4SDavid E. O'Brien * SUCH DAMAGE. 32c80476e4SDavid E. O'Brien */ 33c80476e4SDavid E. O'Brien #include "sh.h" 34c80476e4SDavid E. O'Brien 3545e5710bSMark Peek RCSID("$tcsh: ed.init.c,v 3.60 2006/08/24 20:56:31 christos Exp $") 36c80476e4SDavid E. O'Brien 37c80476e4SDavid E. O'Brien #include "ed.h" 38c80476e4SDavid E. O'Brien #include "tc.h" 39c80476e4SDavid E. O'Brien #include "ed.defns.h" 40c80476e4SDavid E. O'Brien 41c80476e4SDavid E. O'Brien /* ed.init.c -- init routines for the line editor */ 42c80476e4SDavid E. O'Brien /* #define DEBUG_TTY */ 43c80476e4SDavid E. O'Brien 44c80476e4SDavid E. O'Brien int Tty_raw_mode = 0; /* Last tty change was to raw mode */ 45c80476e4SDavid E. O'Brien int MacroLvl = -1; /* pointer to current macro nesting level; */ 46c80476e4SDavid E. O'Brien /* (-1 == none) */ 47c80476e4SDavid E. O'Brien static int Tty_quote_mode = 0; /* Last tty change was to quote mode */ 48c80476e4SDavid E. O'Brien static unsigned char vdisable; /* The value of _POSIX_VDISABLE from 49c80476e4SDavid E. O'Brien * pathconf(2) */ 50c80476e4SDavid E. O'Brien 51c80476e4SDavid E. O'Brien int Tty_eight_bit = -1; /* does the tty handle eight bits */ 52c80476e4SDavid E. O'Brien 5323338178SMark Peek extern int GotTermCaps; 54c80476e4SDavid E. O'Brien 55c80476e4SDavid E. O'Brien static ttydata_t extty, edtty, tstty; 56c80476e4SDavid E. O'Brien #define qutty tstty 57c80476e4SDavid E. O'Brien 58c80476e4SDavid E. O'Brien #define SHTTY (insource ? OLDSTD : SHIN) 59c80476e4SDavid E. O'Brien 60c80476e4SDavid E. O'Brien #define uc unsigned char 61c80476e4SDavid E. O'Brien static unsigned char ttychars[NN_IO][C_NCC] = { 62c80476e4SDavid E. O'Brien { 63c80476e4SDavid E. O'Brien (uc)CINTR, (uc)CQUIT, (uc)CERASE, (uc)CKILL, 64c80476e4SDavid E. O'Brien (uc)CEOF, (uc)CEOL, (uc)CEOL2, (uc)CSWTCH, 65c80476e4SDavid E. O'Brien (uc)CDSWTCH, (uc)CERASE2, (uc)CSTART, (uc)CSTOP, 66c80476e4SDavid E. O'Brien (uc)CWERASE, (uc)CSUSP, (uc)CDSUSP, (uc)CREPRINT, 67c80476e4SDavid E. O'Brien (uc)CDISCARD, (uc)CLNEXT, (uc)CSTATUS, (uc)CPAGE, 68c80476e4SDavid E. O'Brien (uc)CPGOFF, (uc)CKILL2, (uc)CBRK, (uc)CMIN, 69c80476e4SDavid E. O'Brien (uc)CTIME 70c80476e4SDavid E. O'Brien }, 71c80476e4SDavid E. O'Brien { 72c80476e4SDavid E. O'Brien CINTR, CQUIT, CERASE, CKILL, 73c80476e4SDavid E. O'Brien _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 74c80476e4SDavid E. O'Brien _POSIX_VDISABLE, CERASE2, CSTART, CSTOP, 75c80476e4SDavid E. O'Brien _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 76c80476e4SDavid E. O'Brien CDISCARD, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 77c80476e4SDavid E. O'Brien _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1, 78c80476e4SDavid E. O'Brien 0 79c80476e4SDavid E. O'Brien }, 80c80476e4SDavid E. O'Brien { 81c80476e4SDavid E. O'Brien 0, 0, 0, 0, 82c80476e4SDavid E. O'Brien 0, 0, 0, 0, 83c80476e4SDavid E. O'Brien 0, 0, 0, 0, 84c80476e4SDavid E. O'Brien 0, 0, 0, 0, 85c80476e4SDavid E. O'Brien 0, 0, 0, 0, 86c80476e4SDavid E. O'Brien 0, 0, 0, 0, 87c80476e4SDavid E. O'Brien 0 88c80476e4SDavid E. O'Brien } 89c80476e4SDavid E. O'Brien }; 90c80476e4SDavid E. O'Brien 91c80476e4SDavid E. O'Brien #ifdef SIG_WINDOW 92c80476e4SDavid E. O'Brien void 9345e5710bSMark Peek check_window_size(int force) 94c80476e4SDavid E. O'Brien { 95c80476e4SDavid E. O'Brien int lins, cols; 96c80476e4SDavid E. O'Brien 97c80476e4SDavid E. O'Brien /* don't want to confuse things here */ 9845e5710bSMark Peek pintr_disabled++; 9945e5710bSMark Peek cleanup_push(&pintr_disabled, disabled_cleanup); 100c80476e4SDavid E. O'Brien /* 101c80476e4SDavid E. O'Brien * From: bret@shark.agps.lanl.gov (Bret Thaeler) Avoid sunview bug, where a 102c80476e4SDavid E. O'Brien * partially hidden window gets a SIG_WINDOW every time the text is 103c80476e4SDavid E. O'Brien * scrolled 104c80476e4SDavid E. O'Brien */ 105c80476e4SDavid E. O'Brien if (GetSize(&lins, &cols) || force) { 106c80476e4SDavid E. O'Brien if (GettingInput) { 107c80476e4SDavid E. O'Brien ClearLines(); 108c80476e4SDavid E. O'Brien ClearDisp(); 109c80476e4SDavid E. O'Brien MoveToLine(0); 110c80476e4SDavid E. O'Brien MoveToChar(0); 111c80476e4SDavid E. O'Brien ChangeSize(lins, cols); 112c80476e4SDavid E. O'Brien Refresh(); 113c80476e4SDavid E. O'Brien } 114c80476e4SDavid E. O'Brien else 115c80476e4SDavid E. O'Brien ChangeSize(lins, cols); 116c80476e4SDavid E. O'Brien } 11723338178SMark Peek windowchg = 0; 11845e5710bSMark Peek cleanup_until(&pintr_disabled); /* can change it again */ 119c80476e4SDavid E. O'Brien } 120c80476e4SDavid E. O'Brien 12145e5710bSMark Peek void 122c80476e4SDavid E. O'Brien /*ARGSUSED*/ 12345e5710bSMark Peek window_change(int snum) 124c80476e4SDavid E. O'Brien { 1258e66bd9eSDavid E. O'Brien USE(snum); 12629301572SMark Peek windowchg = 1; 127c80476e4SDavid E. O'Brien } 128c80476e4SDavid E. O'Brien 129c80476e4SDavid E. O'Brien #endif /* SIG_WINDOW */ 130c80476e4SDavid E. O'Brien 131c80476e4SDavid E. O'Brien void 13245e5710bSMark Peek ed_set_tty_eight_bit(void) 133c80476e4SDavid E. O'Brien { 134c80476e4SDavid E. O'Brien if (tty_getty(SHTTY, &extty) == -1) { 135c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 136c80476e4SDavid E. O'Brien xprintf("ed_set_tty_eight_bit: tty_getty: %s\n", strerror(errno)); 137c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 138c80476e4SDavid E. O'Brien return; 139c80476e4SDavid E. O'Brien } 140c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&extty); 141c80476e4SDavid E. O'Brien } 142c80476e4SDavid E. O'Brien 143c80476e4SDavid E. O'Brien 144c80476e4SDavid E. O'Brien int 14545e5710bSMark Peek ed_Setup(int rst) 146c80476e4SDavid E. O'Brien { 147c80476e4SDavid E. O'Brien static int havesetup = 0; 148c80476e4SDavid E. O'Brien struct varent *imode; 149c80476e4SDavid E. O'Brien 150c80476e4SDavid E. O'Brien if (havesetup) /* if we have never been called */ 151c80476e4SDavid E. O'Brien return(0); 152c80476e4SDavid E. O'Brien 153c80476e4SDavid E. O'Brien #if defined(POSIX) && defined(_PC_VDISABLE) && !defined(BSD4_4) && \ 1543b6eaa7bSAndrey A. Chernov !defined(WINNT_NATIVE) 155c80476e4SDavid E. O'Brien { 156c80476e4SDavid E. O'Brien long pcret; 157c80476e4SDavid E. O'Brien 158c80476e4SDavid E. O'Brien if ((pcret = fpathconf(SHTTY, _PC_VDISABLE)) == -1L) 159c80476e4SDavid E. O'Brien vdisable = (unsigned char) _POSIX_VDISABLE; 160c80476e4SDavid E. O'Brien else 161c80476e4SDavid E. O'Brien vdisable = (unsigned char) pcret; 162c80476e4SDavid E. O'Brien if (vdisable != (unsigned char) _POSIX_VDISABLE && rst != 0) 163c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC; rst++) { 164c80476e4SDavid E. O'Brien if (ttychars[ED_IO][rst] == (unsigned char) _POSIX_VDISABLE) 165c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] = vdisable; 166c80476e4SDavid E. O'Brien if (ttychars[EX_IO][rst] == (unsigned char) _POSIX_VDISABLE) 167c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] = vdisable; 168c80476e4SDavid E. O'Brien } 169c80476e4SDavid E. O'Brien } 1703b6eaa7bSAndrey A. Chernov #else /* ! POSIX || !_PC_VDISABLE || BSD4_4 || WINNT_NATIVE */ 171c80476e4SDavid E. O'Brien vdisable = (unsigned char) _POSIX_VDISABLE; 1723b6eaa7bSAndrey A. Chernov #endif /* POSIX && _PC_VDISABLE && !BSD4_4 && !WINNT_NATIVE */ 173c80476e4SDavid E. O'Brien 17429301572SMark Peek if ((imode = adrof(STRinputmode)) != NULL && imode->vec != NULL) { 175c80476e4SDavid E. O'Brien if (!Strcmp(*(imode->vec), STRinsert)) 176c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 177c80476e4SDavid E. O'Brien else if (!Strcmp(*(imode->vec), STRoverwrite)) 178c80476e4SDavid E. O'Brien inputmode = MODE_REPLACE; 179c80476e4SDavid E. O'Brien } 180c80476e4SDavid E. O'Brien else 181c80476e4SDavid E. O'Brien inputmode = MODE_INSERT; 182c80476e4SDavid E. O'Brien ed_InitMaps(); 183c80476e4SDavid E. O'Brien Hist_num = 0; 184c80476e4SDavid E. O'Brien Expand = 0; 1856767bd61SMark Peek SetKillRing(getn(varval(STRkillring))); 186c80476e4SDavid E. O'Brien 1873b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 188c80476e4SDavid E. O'Brien if (tty_getty(SHTTY, &extty) == -1) { 189c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 190c80476e4SDavid E. O'Brien xprintf("ed_Setup: tty_getty: %s\n", strerror(errno)); 191c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 192c80476e4SDavid E. O'Brien return(-1); 193c80476e4SDavid E. O'Brien } 194c80476e4SDavid E. O'Brien 195c80476e4SDavid E. O'Brien tstty = edtty = extty; 196c80476e4SDavid E. O'Brien 197c80476e4SDavid E. O'Brien T_Speed = tty_getspeed(&extty); 198c80476e4SDavid E. O'Brien T_Tabs = tty_gettabs(&extty); 199c80476e4SDavid E. O'Brien Tty_eight_bit = tty_geteightbit(&extty); 200c80476e4SDavid E. O'Brien 201c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO) 202c80476e4SDavid E. O'Brien extty.d_t.c_iflag &= ~ttylist[EX_IO][M_INPUT].t_clrmask; 203c80476e4SDavid E. O'Brien extty.d_t.c_iflag |= ttylist[EX_IO][M_INPUT].t_setmask; 204c80476e4SDavid E. O'Brien 205c80476e4SDavid E. O'Brien extty.d_t.c_oflag &= ~ttylist[EX_IO][M_OUTPUT].t_clrmask; 206c80476e4SDavid E. O'Brien extty.d_t.c_oflag |= ttylist[EX_IO][M_OUTPUT].t_setmask; 207c80476e4SDavid E. O'Brien 208c80476e4SDavid E. O'Brien extty.d_t.c_cflag &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 209c80476e4SDavid E. O'Brien extty.d_t.c_cflag |= ttylist[EX_IO][M_CONTROL].t_setmask; 210c80476e4SDavid E. O'Brien 211c80476e4SDavid E. O'Brien extty.d_t.c_lflag &= ~ttylist[EX_IO][M_LINED].t_clrmask; 212c80476e4SDavid E. O'Brien extty.d_t.c_lflag |= ttylist[EX_IO][M_LINED].t_setmask; 213c80476e4SDavid E. O'Brien 214c80476e4SDavid E. O'Brien # if defined(IRIX3_3) && SYSVREL < 4 215c80476e4SDavid E. O'Brien extty.d_t.c_line = NTTYDISC; 216c80476e4SDavid E. O'Brien # endif /* IRIX3_3 && SYSVREL < 4 */ 217c80476e4SDavid E. O'Brien 218c80476e4SDavid E. O'Brien # else /* GSTTY */ /* V7, Berkeley style tty */ 219c80476e4SDavid E. O'Brien 220c80476e4SDavid E. O'Brien if (T_Tabs) { /* order of &= and |= is important to XTABS */ 221c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~(ttylist[EX_IO][M_CONTROL].t_clrmask|XTABS); 222c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= ttylist[EX_IO][M_CONTROL].t_setmask; 223c80476e4SDavid E. O'Brien } 224c80476e4SDavid E. O'Brien else { 225c80476e4SDavid E. O'Brien extty.d_t.sg_flags &= ~ttylist[EX_IO][M_CONTROL].t_clrmask; 226c80476e4SDavid E. O'Brien extty.d_t.sg_flags |= (ttylist[EX_IO][M_CONTROL].t_setmask|XTABS); 227c80476e4SDavid E. O'Brien } 228c80476e4SDavid E. O'Brien 229c80476e4SDavid E. O'Brien extty.d_lb &= ~ttylist[EX_IO][M_LOCAL].t_clrmask; 230c80476e4SDavid E. O'Brien extty.d_lb |= ttylist[EX_IO][M_LOCAL].t_setmask; 231c80476e4SDavid E. O'Brien 232c80476e4SDavid E. O'Brien # endif /* GSTTY */ 233c80476e4SDavid E. O'Brien /* 234c80476e4SDavid E. O'Brien * Reset the tty chars to reasonable defaults 235c80476e4SDavid E. O'Brien * If they are disabled, then enable them. 236c80476e4SDavid E. O'Brien */ 237c80476e4SDavid E. O'Brien if (rst) { 238c80476e4SDavid E. O'Brien if (tty_cooked_mode(&tstty)) { 239c80476e4SDavid E. O'Brien tty_getchar(&tstty, ttychars[TS_IO]); 240c80476e4SDavid E. O'Brien /* 241c80476e4SDavid E. O'Brien * Don't affect CMIN and CTIME for the editor mode 242c80476e4SDavid E. O'Brien */ 243c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC - 2; rst++) 244c80476e4SDavid E. O'Brien if (ttychars[TS_IO][rst] != vdisable && 245c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] != vdisable) 246c80476e4SDavid E. O'Brien ttychars[ED_IO][rst] = ttychars[TS_IO][rst]; 247c80476e4SDavid E. O'Brien for (rst = 0; rst < C_NCC; rst++) 248c80476e4SDavid E. O'Brien if (ttychars[TS_IO][rst] != vdisable && 249c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] != vdisable) 250c80476e4SDavid E. O'Brien ttychars[EX_IO][rst] = ttychars[TS_IO][rst]; 251c80476e4SDavid E. O'Brien } 252c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 253c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &extty) == -1) { 254c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 255c80476e4SDavid E. O'Brien xprintf("ed_Setup: tty_setty: %s\n", strerror(errno)); 256c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 257c80476e4SDavid E. O'Brien return(-1); 258c80476e4SDavid E. O'Brien } 259c80476e4SDavid E. O'Brien } 260c80476e4SDavid E. O'Brien else 261c80476e4SDavid E. O'Brien tty_setchar(&extty, ttychars[EX_IO]); 262c80476e4SDavid E. O'Brien 263c80476e4SDavid E. O'Brien # ifdef SIG_WINDOW 26445e5710bSMark Peek { 26545e5710bSMark Peek sigset_t set; 26645e5710bSMark Peek (void)signal(SIG_WINDOW, window_change); /* for window systems */ 26745e5710bSMark Peek sigemptyset(&set); 26845e5710bSMark Peek sigaddset(&set, SIG_WINDOW); 26945e5710bSMark Peek (void)sigprocmask(SIG_UNBLOCK, &set, NULL); 27045e5710bSMark Peek } 271c80476e4SDavid E. O'Brien # endif 2723b6eaa7bSAndrey A. Chernov #else /* WINNT_NATIVE */ 273c80476e4SDavid E. O'Brien # ifdef DEBUG 274c80476e4SDavid E. O'Brien if (rst) 275c80476e4SDavid E. O'Brien xprintf("rst received in ed_Setup() %d\n", rst); 276c80476e4SDavid E. O'Brien # endif 2773b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 278c80476e4SDavid E. O'Brien havesetup = 1; 279c80476e4SDavid E. O'Brien return(0); 280c80476e4SDavid E. O'Brien } 281c80476e4SDavid E. O'Brien 282c80476e4SDavid E. O'Brien void 28345e5710bSMark Peek ed_Init(void) 284c80476e4SDavid E. O'Brien { 285c80476e4SDavid E. O'Brien ResetInLine(1); /* reset the input pointers */ 286c80476e4SDavid E. O'Brien GettingInput = 0; /* just in case */ 2876767bd61SMark Peek #ifdef notdef 2886767bd61SMark Peek /* XXX This code was here before the kill ring: 289c80476e4SDavid E. O'Brien LastKill = KillBuf; / * no kill buffer * / 2906767bd61SMark Peek If there was any reason for that other than to make sure LastKill 2916767bd61SMark Peek was initialized, the code below should go in here instead - but 2926767bd61SMark Peek it doesn't seem reasonable to lose the entire kill ring (which is 2936767bd61SMark Peek "self-initializing") just because you set $term or whatever, so 2946767bd61SMark Peek presumably this whole '#ifdef notdef' should just be taken out. */ 2956767bd61SMark Peek 2966767bd61SMark Peek { /* no kill ring - why? */ 2976767bd61SMark Peek int i; 2986767bd61SMark Peek for (i = 0; i < KillRingMax; i++) { 29945e5710bSMark Peek xfree(KillRing[i].buf); 3006767bd61SMark Peek KillRing[i].buf = NULL; 3016767bd61SMark Peek KillRing[i].len = 0; 3026767bd61SMark Peek } 3036767bd61SMark Peek YankPos = KillPos = 0; 3046767bd61SMark Peek KillRingLen = 0; 3056767bd61SMark Peek } 3066767bd61SMark Peek #endif 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 3243b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 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]); 3593b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 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 36645e5710bSMark Peek Rawmode(void) 367c80476e4SDavid E. O'Brien { 368c80476e4SDavid E. O'Brien if (Tty_raw_mode) 369c80476e4SDavid E. O'Brien return (0); 370c80476e4SDavid E. O'Brien 3713b6eaa7bSAndrey A. Chernov #ifdef WINNT_NATIVE 372c80476e4SDavid E. O'Brien do_nt_raw_mode(); 3733b6eaa7bSAndrey A. Chernov #else /* !WINNT_NATIVE */ 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 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 } 5443b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 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 55145e5710bSMark Peek Cookedmode(void) 552c80476e4SDavid E. O'Brien { /* set tty in normal setup */ 5533b6eaa7bSAndrey A. Chernov #ifdef WINNT_NATIVE 554c80476e4SDavid E. O'Brien do_nt_cooked_mode(); 555c80476e4SDavid E. O'Brien #else 55645e5710bSMark Peek sigset_t set, oset; 55745e5710bSMark Peek int res; 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 */ 56745e5710bSMark Peek sigemptyset(&set); 56845e5710bSMark Peek sigaddset(&set, SIGINT); 56945e5710bSMark Peek (void)sigprocmask(SIG_BLOCK, &set, &oset); 57045e5710bSMark Peek cleanup_push(&oset, sigprocmask_cleanup); 57145e5710bSMark Peek res = tty_setty(SHTTY, &extty); 57245e5710bSMark Peek cleanup_until(&oset); 57345e5710bSMark Peek if (res == -1) { 574c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY 575c80476e4SDavid E. O'Brien xprintf("Cookedmode: tty_setty: %s\n", strerror(errno)); 576c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */ 577c80476e4SDavid E. O'Brien return -1; 578c80476e4SDavid E. O'Brien } 5793b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */ 580c80476e4SDavid E. O'Brien 581c80476e4SDavid E. O'Brien Tty_raw_mode = 0; 582c80476e4SDavid E. O'Brien return (0); 583c80476e4SDavid E. O'Brien } 584c80476e4SDavid E. O'Brien 585c80476e4SDavid E. O'Brien void 58645e5710bSMark Peek ResetInLine(int macro) 587c80476e4SDavid E. O'Brien { 588c80476e4SDavid E. O'Brien Cursor = InputBuf; /* reset cursor */ 589c80476e4SDavid E. O'Brien LastChar = InputBuf; 59045e5710bSMark Peek InputLim = &InputBuf[INBUFSIZE - 2];/*FIXBUF*/ 591c80476e4SDavid E. O'Brien Mark = InputBuf; 59245e5710bSMark Peek MarkIsSet = 0; 593c80476e4SDavid E. O'Brien MetaNext = 0; 594c80476e4SDavid E. O'Brien CurrentKeyMap = CcKeyMap; 595c80476e4SDavid E. O'Brien AltKeyMap = 0; 596c80476e4SDavid E. O'Brien Hist_num = 0; 597c80476e4SDavid E. O'Brien DoingArg = 0; 598c80476e4SDavid E. O'Brien Argument = 1; 599c80476e4SDavid E. O'Brien LastCmd = F_UNASSIGNED; /* previous command executed */ 60045e5710bSMark Peek IncMatchLen = 0; 601c80476e4SDavid E. O'Brien if (macro) 602c80476e4SDavid E. O'Brien MacroLvl = -1; /* no currently active macros */ 603c80476e4SDavid E. O'Brien } 604c80476e4SDavid E. O'Brien 605c80476e4SDavid E. O'Brien int 60645e5710bSMark Peek Load_input_line(void) 607c80476e4SDavid E. O'Brien { 60845e5710bSMark Peek static Char *Input_Line = NULL; 609c80476e4SDavid E. O'Brien #ifdef SUNOS4 610c80476e4SDavid E. O'Brien long chrs = 0; 611c80476e4SDavid E. O'Brien #else /* !SUNOS4 */ 612c80476e4SDavid E. O'Brien /* 613c80476e4SDavid E. O'Brien * *Everyone* else has an int, but SunOS wants long! 614c80476e4SDavid E. O'Brien * This breaks where int != long (alpha) 615c80476e4SDavid E. O'Brien */ 616c80476e4SDavid E. O'Brien int chrs = 0; 617c80476e4SDavid E. O'Brien #endif /* SUNOS4 */ 618c80476e4SDavid E. O'Brien 619c80476e4SDavid E. O'Brien if (Input_Line) 62045e5710bSMark Peek xfree(Input_Line); 621c80476e4SDavid E. O'Brien Input_Line = NULL; 622c80476e4SDavid E. O'Brien 623c80476e4SDavid E. O'Brien if (Tty_raw_mode) 624c80476e4SDavid E. O'Brien return 0; 625c80476e4SDavid E. O'Brien 626c80476e4SDavid E. O'Brien #if defined(FIONREAD) && !defined(OREO) 627c80476e4SDavid E. O'Brien (void) ioctl(SHIN, FIONREAD, (ioctl_t) &chrs); 628c80476e4SDavid E. O'Brien if (chrs > 0) { 629c80476e4SDavid E. O'Brien char buf[BUFSIZE]; 630c80476e4SDavid E. O'Brien 63145e5710bSMark Peek chrs = xread(SHIN, buf, min(chrs, BUFSIZE - 1)); 632c80476e4SDavid E. O'Brien if (chrs > 0) { 633c80476e4SDavid E. O'Brien buf[chrs] = '\0'; 634c80476e4SDavid E. O'Brien Input_Line = Strsave(str2short(buf)); 635c80476e4SDavid E. O'Brien PushMacro(Input_Line); 636c80476e4SDavid E. O'Brien } 637c80476e4SDavid E. O'Brien #ifdef convex 638c80476e4SDavid E. O'Brien /* need to print errno message in case file is migrated */ 639c80476e4SDavid E. O'Brien if (chrs < 0) 640c80476e4SDavid E. O'Brien stderror(ERR_SYSTEM, progname, strerror(errno)); 641c80476e4SDavid E. O'Brien #endif 642c80476e4SDavid E. O'Brien } 643c80476e4SDavid E. O'Brien #endif /* FIONREAD && !OREO */ 644c80476e4SDavid E. O'Brien return chrs > 0; 645c80476e4SDavid E. O'Brien } 646c80476e4SDavid E. O'Brien 647c80476e4SDavid E. O'Brien /* 648c80476e4SDavid E. O'Brien * Bugfix (in Swedish) by: 649c80476e4SDavid E. O'Brien * Johan Widen 650c80476e4SDavid E. O'Brien * SICS, PO Box 1263, S-163 13 SPANGA, SWEDEN 651c80476e4SDavid E. O'Brien * {mcvax,munnari,cernvax,diku,inria,prlb2,penet,ukc,unido}!enea!sics.se!jw 652c80476e4SDavid E. O'Brien * Internet: jw@sics.se 653c80476e4SDavid E. O'Brien * 654c80476e4SDavid E. O'Brien * (via Hans J Albertsson (thanks)) 655c80476e4SDavid E. O'Brien */ 656c80476e4SDavid E. O'Brien void 65745e5710bSMark Peek QuoteModeOn(void) 658c80476e4SDavid E. O'Brien { 659c80476e4SDavid E. O'Brien if (MacroLvl >= 0) 660c80476e4SDavid E. O'Brien return; 661c80476e4SDavid E. O'Brien 6623b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE 663c80476e4SDavid E. O'Brien qutty = edtty; 664c80476e4SDavid E. O'Brien 665c80476e4SDavid E. O'Brien #if defined(TERMIO) || defined(POSIX) 666c80476e4SDavid E. O'Brien qutty.d_t.c_iflag &= ~ttylist[QU_IO][M_INPUT].t_clrmask; 667c80476e4SDavid E. O'Brien qutty.d_t.c_iflag |= ttylist[QU_IO][M_INPUT].t_setmask; 668c80476e4SDavid E. O'Brien 669c80476e4SDavid E. O'Brien qutty.d_t.c_oflag &= ~ttylist[QU_IO][M_OUTPUT].t_clrmask; 670c80476e4SDavid E. O'Brien qutty.d_t.c_oflag |= ttylist[QU_IO][M_OUTPUT].t_setmask; 671c80476e4SDavid E. O'Brien 672c80476e4SDavid E. O'Brien qutty.d_t.c_cflag &= ~ttylist[QU_IO][M_CONTROL].t_clrmask; 673c80476e4SDavid E. O'Brien qutty.d_t.c_cflag |= ttylist[QU_IO][M_CONTROL].t_setmask; 674c80476e4SDavid E. O'Brien 675c80476e4SDavid E. O'Brien qutty.d_t.c_lflag &= ~ttylist[QU_IO][M_LINED].t_clrmask; 676c80476e4SDavid E. O'Brien qutty.d_t.c_lflag |= ttylist[QU_IO][M_LINED].t_setmask; 677c80476e4SDavid E. O'Brien #else /* GSTTY */ 678c80476e4SDavid E. O'Brien qutty.d_t.sg_flags &= ~ttylist[QU_IO][M_CONTROL].t_clrmask; 679c80476e4SDavid E. O'Brien qutty.d_t.sg_flags |= ttylist[QU_IO][M_CONTROL].t_setmask; 680c80476e4SDavid E. O'Brien qutty.d_lb &= ~ttylist[QU_IO][M_LOCAL].t_clrmask; 681c80476e4SDavid E. O'Brien qutty.d_lb |= ttylist[QU_IO][M_LOCAL].t_setmask; 682c80476e4SDavid E. O'Brien 683c80476e4SDavid E. O'Brien #endif /* TERMIO || POSIX */ 684c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &qutty) == -1) { 685c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 686c80476e4SDavid E. O'Brien xprintf("QuoteModeOn: tty_setty: %s\n", strerror(errno)); 687c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 688c80476e4SDavid E. O'Brien return; 689c80476e4SDavid E. O'Brien } 6903b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */ 691c80476e4SDavid E. O'Brien Tty_quote_mode = 1; 692c80476e4SDavid E. O'Brien return; 693c80476e4SDavid E. O'Brien } 694c80476e4SDavid E. O'Brien 695c80476e4SDavid E. O'Brien void 69645e5710bSMark Peek QuoteModeOff(void) 697c80476e4SDavid E. O'Brien { 698c80476e4SDavid E. O'Brien if (!Tty_quote_mode) 699c80476e4SDavid E. O'Brien return; 700c80476e4SDavid E. O'Brien Tty_quote_mode = 0; 701c80476e4SDavid E. O'Brien if (tty_setty(SHTTY, &edtty) == -1) { 702c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY 703c80476e4SDavid E. O'Brien xprintf("QuoteModeOff: tty_setty: %s\n", strerror(errno)); 704c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */ 705c80476e4SDavid E. O'Brien return; 706c80476e4SDavid E. O'Brien } 707c80476e4SDavid E. O'Brien return; 708c80476e4SDavid E. O'Brien } 709