xref: /freebsd/contrib/tcsh/ed.init.c (revision 45e5710bbb3676c9d945e9df78019b2c58930a59)
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