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