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