xref: /freebsd/contrib/tcsh/ed.init.c (revision 6560ac57ce879857203bc456cdc3849808dc0700)
1c80476e4SDavid E. O'Brien /*
2c80476e4SDavid E. O'Brien  * ed.init.c: Editor initializations
3c80476e4SDavid E. O'Brien  */
4c80476e4SDavid E. O'Brien /*-
5c80476e4SDavid E. O'Brien  * Copyright (c) 1980, 1991 The Regents of the University of California.
6c80476e4SDavid E. O'Brien  * All rights reserved.
7c80476e4SDavid E. O'Brien  *
8c80476e4SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
9c80476e4SDavid E. O'Brien  * modification, are permitted provided that the following conditions
10c80476e4SDavid E. O'Brien  * are met:
11c80476e4SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
12c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
13c80476e4SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
14c80476e4SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
15c80476e4SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
1629301572SMark Peek  * 3. Neither the name of the University nor the names of its contributors
17c80476e4SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
18c80476e4SDavid E. O'Brien  *    without specific prior written permission.
19c80476e4SDavid E. O'Brien  *
20c80476e4SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21c80476e4SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22c80476e4SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23c80476e4SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24c80476e4SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25c80476e4SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26c80476e4SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTS_ION)
27c80476e4SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28c80476e4SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29c80476e4SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30c80476e4SDavid E. O'Brien  * SUCH DAMAGE.
31c80476e4SDavid E. O'Brien  */
32c80476e4SDavid E. O'Brien #include "sh.h"
33c80476e4SDavid E. O'Brien #include "ed.h"
34c80476e4SDavid E. O'Brien #include "tc.h"
35c80476e4SDavid E. O'Brien #include "ed.defns.h"
36c80476e4SDavid E. O'Brien 
37c80476e4SDavid E. O'Brien /* ed.init.c -- init routines for the line editor */
38c80476e4SDavid E. O'Brien /* #define DEBUG_TTY */
39c80476e4SDavid E. O'Brien 
40c80476e4SDavid E. O'Brien int     Tty_raw_mode = 0;	/* Last tty change was to raw mode */
41c80476e4SDavid E. O'Brien int     MacroLvl = -1;		/* pointer to current macro nesting level; */
42c80476e4SDavid E. O'Brien 				/* (-1 == none) */
43c80476e4SDavid E. O'Brien static int Tty_quote_mode = 0;	/* Last tty change was to quote mode */
44c80476e4SDavid E. O'Brien static unsigned char vdisable;	/* The value of _POSIX_VDISABLE from
45c80476e4SDavid E. O'Brien 				 * pathconf(2) */
46c80476e4SDavid E. O'Brien 
47c80476e4SDavid E. O'Brien int     Tty_eight_bit = -1;	/* does the tty handle eight bits */
48c80476e4SDavid E. O'Brien 
4923338178SMark Peek extern int GotTermCaps;
50c80476e4SDavid E. O'Brien 
51c80476e4SDavid E. O'Brien static ttydata_t extty, edtty, tstty;
52c80476e4SDavid E. O'Brien #define qutty tstty
53c80476e4SDavid E. O'Brien 
54c80476e4SDavid E. O'Brien #define SHTTY (insource ? OLDSTD : SHIN)
55c80476e4SDavid E. O'Brien 
56c80476e4SDavid E. O'Brien #define uc unsigned char
57c80476e4SDavid E. O'Brien static unsigned char ttychars[NN_IO][C_NCC] = {
58c80476e4SDavid E. O'Brien     {
59c80476e4SDavid E. O'Brien 	(uc)CINTR,	(uc)CQUIT, 	 (uc)CERASE, 	   (uc)CKILL,
60c80476e4SDavid E. O'Brien 	(uc)CEOF, 	(uc)CEOL, 	 (uc)CEOL2, 	   (uc)CSWTCH,
61c80476e4SDavid E. O'Brien 	(uc)CDSWTCH,	(uc)CERASE2,	 (uc)CSTART, 	   (uc)CSTOP,
62c80476e4SDavid E. O'Brien 	(uc)CWERASE, 	(uc)CSUSP, 	 (uc)CDSUSP, 	   (uc)CREPRINT,
63c80476e4SDavid E. O'Brien 	(uc)CDISCARD, 	(uc)CLNEXT,	 (uc)CSTATUS,	   (uc)CPAGE,
64c80476e4SDavid E. O'Brien 	(uc)CPGOFF,	(uc)CKILL2, 	 (uc)CBRK, 	   (uc)CMIN,
65c80476e4SDavid E. O'Brien 	(uc)CTIME
66c80476e4SDavid E. O'Brien     },
67c80476e4SDavid E. O'Brien     {
68c80476e4SDavid E. O'Brien 	CINTR, 		 CQUIT, 	  CERASE, 	   CKILL,
69c80476e4SDavid E. O'Brien 	_POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
70c80476e4SDavid E. O'Brien 	_POSIX_VDISABLE, CERASE2,	  CSTART, 	   CSTOP,
71c80476e4SDavid E. O'Brien 	_POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
72c80476e4SDavid E. O'Brien 	CDISCARD, 	 _POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE,
73c80476e4SDavid E. O'Brien 	_POSIX_VDISABLE, _POSIX_VDISABLE, _POSIX_VDISABLE, 1,
74c80476e4SDavid E. O'Brien 	0
75c80476e4SDavid E. O'Brien     },
76c80476e4SDavid E. O'Brien     {
77c80476e4SDavid E. O'Brien 	0,		 0,		  0,		   0,
78c80476e4SDavid E. O'Brien 	0,		 0,		  0,		   0,
79c80476e4SDavid E. O'Brien 	0,		 0,		  0,		   0,
80c80476e4SDavid E. O'Brien 	0,		 0,		  0,		   0,
81c80476e4SDavid E. O'Brien 	0,		 0,		  0,		   0,
82c80476e4SDavid E. O'Brien 	0,		 0,		  0,		   0,
83c80476e4SDavid E. O'Brien 	0
84c80476e4SDavid E. O'Brien     }
85c80476e4SDavid E. O'Brien };
86c80476e4SDavid E. O'Brien 
87c80476e4SDavid E. O'Brien #ifdef SIG_WINDOW
88c80476e4SDavid E. O'Brien void
check_window_size(int force)8945e5710bSMark Peek check_window_size(int force)
90c80476e4SDavid E. O'Brien {
91c80476e4SDavid E. O'Brien     int     lins, cols;
92c80476e4SDavid E. O'Brien 
93c80476e4SDavid E. O'Brien     /* don't want to confuse things here */
9445e5710bSMark Peek     pintr_disabled++;
9545e5710bSMark Peek     cleanup_push(&pintr_disabled, disabled_cleanup);
96c80476e4SDavid E. O'Brien     /*
97c80476e4SDavid E. O'Brien      * From: bret@shark.agps.lanl.gov (Bret Thaeler) Avoid sunview bug, where a
98c80476e4SDavid E. O'Brien      * partially hidden window gets a SIG_WINDOW every time the text is
99c80476e4SDavid E. O'Brien      * scrolled
100c80476e4SDavid E. O'Brien      */
101c80476e4SDavid E. O'Brien     if (GetSize(&lins, &cols) || force) {
102c80476e4SDavid E. O'Brien 	if (GettingInput) {
103c80476e4SDavid E. O'Brien 	    ClearLines();
104c80476e4SDavid E. O'Brien 	    ClearDisp();
105c80476e4SDavid E. O'Brien 	    MoveToLine(0);
106c80476e4SDavid E. O'Brien 	    MoveToChar(0);
107c80476e4SDavid E. O'Brien 	    ChangeSize(lins, cols);
108c80476e4SDavid E. O'Brien 	    Refresh();
109c80476e4SDavid E. O'Brien 	}
110c80476e4SDavid E. O'Brien 	else
111c80476e4SDavid E. O'Brien 	    ChangeSize(lins, cols);
112c80476e4SDavid E. O'Brien     }
11323338178SMark Peek     windowchg = 0;
11445e5710bSMark Peek     cleanup_until(&pintr_disabled);	/* can change it again */
115c80476e4SDavid E. O'Brien }
116c80476e4SDavid E. O'Brien 
11745e5710bSMark Peek void
118c80476e4SDavid E. O'Brien /*ARGSUSED*/
window_change(int snum)11945e5710bSMark Peek window_change(int snum)
120c80476e4SDavid E. O'Brien {
1218e66bd9eSDavid E. O'Brien     USE(snum);
12229301572SMark Peek     windowchg = 1;
123c80476e4SDavid E. O'Brien }
124c80476e4SDavid E. O'Brien 
125c80476e4SDavid E. O'Brien #endif /* SIG_WINDOW */
126c80476e4SDavid E. O'Brien 
127c80476e4SDavid E. O'Brien void
ed_set_tty_eight_bit(void)12845e5710bSMark Peek ed_set_tty_eight_bit(void)
129c80476e4SDavid E. O'Brien {
130c80476e4SDavid E. O'Brien     if (tty_getty(SHTTY, &extty) == -1) {
131c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY
132c80476e4SDavid E. O'Brien 	xprintf("ed_set_tty_eight_bit: tty_getty: %s\n", strerror(errno));
133c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */
134c80476e4SDavid E. O'Brien 	return;
135c80476e4SDavid E. O'Brien     }
136c80476e4SDavid E. O'Brien     Tty_eight_bit = tty_geteightbit(&extty);
137c80476e4SDavid E. O'Brien }
138c80476e4SDavid E. O'Brien 
139c80476e4SDavid E. O'Brien 
140c80476e4SDavid E. O'Brien int
ed_Setup(int rst)14145e5710bSMark Peek ed_Setup(int rst)
142c80476e4SDavid E. O'Brien {
143c80476e4SDavid E. O'Brien     static int havesetup = 0;
144c80476e4SDavid E. O'Brien     struct varent *imode;
145c80476e4SDavid E. O'Brien 
146c80476e4SDavid E. O'Brien     if (havesetup) 	/* if we have never been called */
147c80476e4SDavid E. O'Brien 	return(0);
148c80476e4SDavid E. O'Brien 
149c80476e4SDavid E. O'Brien #if defined(POSIX) && defined(_PC_VDISABLE) && !defined(BSD4_4) && \
1503b6eaa7bSAndrey A. Chernov     !defined(WINNT_NATIVE)
151c80476e4SDavid E. O'Brien     {
152c80476e4SDavid E. O'Brien 	long pcret;
153c80476e4SDavid E. O'Brien 
154c80476e4SDavid E. O'Brien 	if ((pcret = fpathconf(SHTTY, _PC_VDISABLE)) == -1L)
155c80476e4SDavid E. O'Brien 	    vdisable = (unsigned char) _POSIX_VDISABLE;
156c80476e4SDavid E. O'Brien 	else
157c80476e4SDavid E. O'Brien 	    vdisable = (unsigned char) pcret;
158c80476e4SDavid E. O'Brien 	if (vdisable != (unsigned char) _POSIX_VDISABLE && rst != 0)
159c80476e4SDavid E. O'Brien 	    for (rst = 0; rst < C_NCC; rst++) {
160c80476e4SDavid E. O'Brien 		if (ttychars[ED_IO][rst] == (unsigned char) _POSIX_VDISABLE)
161c80476e4SDavid E. O'Brien 		    ttychars[ED_IO][rst] = vdisable;
162c80476e4SDavid E. O'Brien 		if (ttychars[EX_IO][rst] == (unsigned char) _POSIX_VDISABLE)
163c80476e4SDavid E. O'Brien 		    ttychars[EX_IO][rst] = vdisable;
164c80476e4SDavid E. O'Brien 	    }
165c80476e4SDavid E. O'Brien     }
1663b6eaa7bSAndrey A. Chernov #else /* ! POSIX || !_PC_VDISABLE || BSD4_4 || WINNT_NATIVE */
167c80476e4SDavid E. O'Brien     vdisable = (unsigned char) _POSIX_VDISABLE;
1683b6eaa7bSAndrey A. Chernov #endif /* POSIX && _PC_VDISABLE && !BSD4_4 && !WINNT_NATIVE */
169c80476e4SDavid E. O'Brien 
17029301572SMark Peek     if ((imode = adrof(STRinputmode)) != NULL && imode->vec != NULL) {
171c80476e4SDavid E. O'Brien 	if (!Strcmp(*(imode->vec), STRinsert))
172c80476e4SDavid E. O'Brien 	    inputmode = MODE_INSERT;
173c80476e4SDavid E. O'Brien 	else if (!Strcmp(*(imode->vec), STRoverwrite))
174c80476e4SDavid E. O'Brien 	    inputmode = MODE_REPLACE;
175c80476e4SDavid E. O'Brien     }
176c80476e4SDavid E. O'Brien     else
177c80476e4SDavid E. O'Brien 	inputmode = MODE_INSERT;
178c80476e4SDavid E. O'Brien     ed_InitMaps();
179c80476e4SDavid E. O'Brien     Hist_num = 0;
180c80476e4SDavid E. O'Brien     Expand = 0;
1816767bd61SMark Peek     SetKillRing(getn(varval(STRkillring)));
182c80476e4SDavid E. O'Brien 
1833b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
184c80476e4SDavid E. O'Brien     if (tty_getty(SHTTY, &extty) == -1) {
185c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY
186c80476e4SDavid E. O'Brien 	xprintf("ed_Setup: tty_getty: %s\n", strerror(errno));
187c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */
188c80476e4SDavid E. O'Brien 	return(-1);
189c80476e4SDavid E. O'Brien     }
190c80476e4SDavid E. O'Brien 
191c80476e4SDavid E. O'Brien     tstty = edtty = extty;
192c80476e4SDavid E. O'Brien 
193c80476e4SDavid E. O'Brien     T_Speed = tty_getspeed(&extty);
194c80476e4SDavid E. O'Brien     T_Tabs = tty_gettabs(&extty);
195c80476e4SDavid E. O'Brien     Tty_eight_bit = tty_geteightbit(&extty);
196c80476e4SDavid E. O'Brien 
197c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO)
198c80476e4SDavid E. O'Brien     extty.d_t.c_iflag &= ~ttylist[EX_IO][M_INPUT].t_clrmask;
199c80476e4SDavid E. O'Brien     extty.d_t.c_iflag |=  ttylist[EX_IO][M_INPUT].t_setmask;
200c80476e4SDavid E. O'Brien 
201c80476e4SDavid E. O'Brien     extty.d_t.c_oflag &= ~ttylist[EX_IO][M_OUTPUT].t_clrmask;
202c80476e4SDavid E. O'Brien     extty.d_t.c_oflag |=  ttylist[EX_IO][M_OUTPUT].t_setmask;
203c80476e4SDavid E. O'Brien 
204c80476e4SDavid E. O'Brien     extty.d_t.c_cflag &= ~ttylist[EX_IO][M_CONTROL].t_clrmask;
205c80476e4SDavid E. O'Brien     extty.d_t.c_cflag |=  ttylist[EX_IO][M_CONTROL].t_setmask;
206c80476e4SDavid E. O'Brien 
207c80476e4SDavid E. O'Brien     extty.d_t.c_lflag &= ~ttylist[EX_IO][M_LINED].t_clrmask;
208c80476e4SDavid E. O'Brien     extty.d_t.c_lflag |=  ttylist[EX_IO][M_LINED].t_setmask;
209c80476e4SDavid E. O'Brien 
210c80476e4SDavid E. O'Brien #  if defined(IRIX3_3) && SYSVREL < 4
211c80476e4SDavid E. O'Brien     extty.d_t.c_line = NTTYDISC;
212c80476e4SDavid E. O'Brien #  endif /* IRIX3_3 && SYSVREL < 4 */
213c80476e4SDavid E. O'Brien 
214c80476e4SDavid E. O'Brien # else	/* GSTTY */		/* V7, Berkeley style tty */
215c80476e4SDavid E. O'Brien 
216c80476e4SDavid E. O'Brien     if (T_Tabs) {	/* order of &= and |= is important to XTABS */
217c80476e4SDavid E. O'Brien 	extty.d_t.sg_flags &= ~(ttylist[EX_IO][M_CONTROL].t_clrmask|XTABS);
218c80476e4SDavid E. O'Brien 	extty.d_t.sg_flags |=   ttylist[EX_IO][M_CONTROL].t_setmask;
219c80476e4SDavid E. O'Brien     }
220c80476e4SDavid E. O'Brien     else {
221c80476e4SDavid E. O'Brien 	extty.d_t.sg_flags &= ~ttylist[EX_IO][M_CONTROL].t_clrmask;
222c80476e4SDavid E. O'Brien 	extty.d_t.sg_flags |= (ttylist[EX_IO][M_CONTROL].t_setmask|XTABS);
223c80476e4SDavid E. O'Brien     }
224c80476e4SDavid E. O'Brien 
225c80476e4SDavid E. O'Brien     extty.d_lb &= ~ttylist[EX_IO][M_LOCAL].t_clrmask;
226c80476e4SDavid E. O'Brien     extty.d_lb |=  ttylist[EX_IO][M_LOCAL].t_setmask;
227c80476e4SDavid E. O'Brien 
228c80476e4SDavid E. O'Brien # endif /* GSTTY */
229c80476e4SDavid E. O'Brien     /*
230c80476e4SDavid E. O'Brien      * Reset the tty chars to reasonable defaults
231c80476e4SDavid E. O'Brien      * If they are disabled, then enable them.
232c80476e4SDavid E. O'Brien      */
233c80476e4SDavid E. O'Brien     if (rst) {
234c80476e4SDavid E. O'Brien 	if (tty_cooked_mode(&tstty)) {
235c80476e4SDavid E. O'Brien 	    tty_getchar(&tstty, ttychars[TS_IO]);
236c80476e4SDavid E. O'Brien 	    /*
237c80476e4SDavid E. O'Brien 	     * Don't affect CMIN and CTIME for the editor mode
238c80476e4SDavid E. O'Brien 	     */
239c80476e4SDavid E. O'Brien 	    for (rst = 0; rst < C_NCC - 2; rst++)
240c80476e4SDavid E. O'Brien 		if (ttychars[TS_IO][rst] != vdisable &&
241c80476e4SDavid E. O'Brien 		    ttychars[ED_IO][rst] != vdisable)
242c80476e4SDavid E. O'Brien 		    ttychars[ED_IO][rst] = ttychars[TS_IO][rst];
243c80476e4SDavid E. O'Brien 	    for (rst = 0; rst < C_NCC; rst++)
244c80476e4SDavid E. O'Brien 		if (ttychars[TS_IO][rst] != vdisable &&
245c80476e4SDavid E. O'Brien 		    ttychars[EX_IO][rst] != vdisable)
246c80476e4SDavid E. O'Brien 		    ttychars[EX_IO][rst] = ttychars[TS_IO][rst];
247c80476e4SDavid E. O'Brien 	}
248c80476e4SDavid E. O'Brien 	tty_setchar(&extty, ttychars[EX_IO]);
249c80476e4SDavid E. O'Brien 	if (tty_setty(SHTTY, &extty) == -1) {
250c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY
251c80476e4SDavid E. O'Brien 	    xprintf("ed_Setup: tty_setty: %s\n", strerror(errno));
252c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */
253c80476e4SDavid E. O'Brien 	    return(-1);
254c80476e4SDavid E. O'Brien 	}
255c80476e4SDavid E. O'Brien     }
256c80476e4SDavid E. O'Brien     else
257c80476e4SDavid E. O'Brien 	tty_setchar(&extty, ttychars[EX_IO]);
258c80476e4SDavid E. O'Brien 
259c80476e4SDavid E. O'Brien # ifdef SIG_WINDOW
26045e5710bSMark Peek     {
26145e5710bSMark Peek 	sigset_t set;
26245e5710bSMark Peek 	(void)signal(SIG_WINDOW, window_change);	/* for window systems */
26345e5710bSMark Peek 	sigemptyset(&set);
26445e5710bSMark Peek 	sigaddset(&set, SIG_WINDOW);
26545e5710bSMark Peek 	(void)sigprocmask(SIG_UNBLOCK, &set, NULL);
26645e5710bSMark Peek     }
267c80476e4SDavid E. O'Brien # endif
2683b6eaa7bSAndrey A. Chernov #else /* WINNT_NATIVE */
269c80476e4SDavid E. O'Brien # ifdef DEBUG
270c80476e4SDavid E. O'Brien     if (rst)
271c80476e4SDavid E. O'Brien 	xprintf("rst received in ed_Setup() %d\n", rst);
272c80476e4SDavid E. O'Brien # endif
2733b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
274c80476e4SDavid E. O'Brien     havesetup = 1;
275c80476e4SDavid E. O'Brien     return(0);
276c80476e4SDavid E. O'Brien }
277c80476e4SDavid E. O'Brien 
278c80476e4SDavid E. O'Brien void
ed_Init(void)27945e5710bSMark Peek ed_Init(void)
280c80476e4SDavid E. O'Brien {
281c80476e4SDavid E. O'Brien     ResetInLine(1);		/* reset the input pointers */
282c80476e4SDavid E. O'Brien     GettingInput = 0;		/* just in case */
2836767bd61SMark Peek #ifdef notdef
2846767bd61SMark Peek     /* XXX This code was here before the kill ring:
285c80476e4SDavid E. O'Brien     LastKill = KillBuf;		/ * no kill buffer * /
2866767bd61SMark Peek        If there was any reason for that other than to make sure LastKill
2876767bd61SMark Peek        was initialized, the code below should go in here instead - but
2886767bd61SMark Peek        it doesn't seem reasonable to lose the entire kill ring (which is
2896767bd61SMark Peek        "self-initializing") just because you set $term or whatever, so
2906767bd61SMark Peek        presumably this whole '#ifdef notdef' should just be taken out.  */
2916767bd61SMark Peek 
2926767bd61SMark Peek     {				/* no kill ring - why? */
2936767bd61SMark Peek 	int i;
2946767bd61SMark Peek 	for (i = 0; i < KillRingMax; i++) {
29545e5710bSMark Peek 	    xfree(KillRing[i].buf);
2966767bd61SMark Peek 	    KillRing[i].buf = NULL;
2976767bd61SMark Peek 	    KillRing[i].len = 0;
2986767bd61SMark Peek 	}
2996767bd61SMark Peek 	YankPos = KillPos = 0;
3006767bd61SMark Peek 	KillRingLen = 0;
3016767bd61SMark Peek     }
3026767bd61SMark Peek #endif
303c80476e4SDavid E. O'Brien 
304c80476e4SDavid E. O'Brien #ifdef DEBUG_EDIT
305c80476e4SDavid E. O'Brien     CheckMaps();		/* do a little error checking on key maps */
306c80476e4SDavid E. O'Brien #endif
307c80476e4SDavid E. O'Brien 
308c80476e4SDavid E. O'Brien     if (ed_Setup(0) == -1)
309c80476e4SDavid E. O'Brien 	return;
310c80476e4SDavid E. O'Brien 
311c80476e4SDavid E. O'Brien     /*
312c80476e4SDavid E. O'Brien      * if we have been called before but GotTermCaps isn't set, our TERM has
313c80476e4SDavid E. O'Brien      * changed, so get new termcaps and try again
314c80476e4SDavid E. O'Brien      */
315c80476e4SDavid E. O'Brien 
316c80476e4SDavid E. O'Brien     if (!GotTermCaps)
317c80476e4SDavid E. O'Brien 	GetTermCaps();		/* does the obvious, but gets term type each
318c80476e4SDavid E. O'Brien 				 * time */
319c80476e4SDavid E. O'Brien 
3203b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
321c80476e4SDavid E. O'Brien # if defined(TERMIO) || defined(POSIX)
322c80476e4SDavid E. O'Brien     edtty.d_t.c_iflag &= ~ttylist[ED_IO][M_INPUT].t_clrmask;
323c80476e4SDavid E. O'Brien     edtty.d_t.c_iflag |=  ttylist[ED_IO][M_INPUT].t_setmask;
324c80476e4SDavid E. O'Brien 
325c80476e4SDavid E. O'Brien     edtty.d_t.c_oflag &= ~ttylist[ED_IO][M_OUTPUT].t_clrmask;
326c80476e4SDavid E. O'Brien     edtty.d_t.c_oflag |=  ttylist[ED_IO][M_OUTPUT].t_setmask;
327c80476e4SDavid E. O'Brien 
328c80476e4SDavid E. O'Brien     edtty.d_t.c_cflag &= ~ttylist[ED_IO][M_CONTROL].t_clrmask;
329c80476e4SDavid E. O'Brien     edtty.d_t.c_cflag |=  ttylist[ED_IO][M_CONTROL].t_setmask;
330c80476e4SDavid E. O'Brien 
331c80476e4SDavid E. O'Brien     edtty.d_t.c_lflag &= ~ttylist[ED_IO][M_LINED].t_clrmask;
332c80476e4SDavid E. O'Brien     edtty.d_t.c_lflag |=  ttylist[ED_IO][M_LINED].t_setmask;
333c80476e4SDavid E. O'Brien 
334c80476e4SDavid E. O'Brien 
335c80476e4SDavid E. O'Brien #  if defined(IRIX3_3) && SYSVREL < 4
336c80476e4SDavid E. O'Brien     edtty.d_t.c_line = NTTYDISC;
337c80476e4SDavid E. O'Brien #  endif /* IRIX3_3 && SYSVREL < 4 */
338c80476e4SDavid E. O'Brien 
339c80476e4SDavid E. O'Brien # else /* GSTTY */
340c80476e4SDavid E. O'Brien 
341c80476e4SDavid E. O'Brien     if (T_Tabs) {	/* order of &= and |= is important to XTABS */
342c80476e4SDavid E. O'Brien 	edtty.d_t.sg_flags &= ~(ttylist[ED_IO][M_CONTROL].t_clrmask | XTABS);
343c80476e4SDavid E. O'Brien 	edtty.d_t.sg_flags |=   ttylist[ED_IO][M_CONTROL].t_setmask;
344c80476e4SDavid E. O'Brien     }
345c80476e4SDavid E. O'Brien     else {
346c80476e4SDavid E. O'Brien 	edtty.d_t.sg_flags &= ~ttylist[ED_IO][M_CONTROL].t_clrmask;
347c80476e4SDavid E. O'Brien 	edtty.d_t.sg_flags |= (ttylist[ED_IO][M_CONTROL].t_setmask | XTABS);
348c80476e4SDavid E. O'Brien     }
349c80476e4SDavid E. O'Brien 
350c80476e4SDavid E. O'Brien     edtty.d_lb &= ~ttylist[ED_IO][M_LOCAL].t_clrmask;
351c80476e4SDavid E. O'Brien     edtty.d_lb |=  ttylist[ED_IO][M_LOCAL].t_setmask;
352c80476e4SDavid E. O'Brien # endif /* POSIX || TERMIO */
353c80476e4SDavid E. O'Brien 
354c80476e4SDavid E. O'Brien     tty_setchar(&edtty, ttychars[ED_IO]);
3553b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
356c80476e4SDavid E. O'Brien }
357c80476e4SDavid E. O'Brien 
358c80476e4SDavid E. O'Brien /*
359c80476e4SDavid E. O'Brien  * Check and re-init the line. set the terminal into 1 char at a time mode.
360c80476e4SDavid E. O'Brien  */
361c80476e4SDavid E. O'Brien int
Rawmode(void)36245e5710bSMark Peek Rawmode(void)
363c80476e4SDavid E. O'Brien {
364c80476e4SDavid E. O'Brien     if (Tty_raw_mode)
365c80476e4SDavid E. O'Brien 	return (0);
366c80476e4SDavid E. O'Brien 
3673b6eaa7bSAndrey A. Chernov #ifdef WINNT_NATIVE
368c80476e4SDavid E. O'Brien     do_nt_raw_mode();
3693b6eaa7bSAndrey A. Chernov #else /* !WINNT_NATIVE */
370c80476e4SDavid E. O'Brien # ifdef _IBMR2
371c80476e4SDavid E. O'Brien     tty_setdisc(SHTTY, ED_IO);
372c80476e4SDavid E. O'Brien # endif /* _IBMR2 */
373c80476e4SDavid E. O'Brien 
374c80476e4SDavid E. O'Brien     if (tty_getty(SHTTY, &tstty) == -1) {
375c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY
376c80476e4SDavid E. O'Brien 	xprintf("Rawmode: tty_getty: %s\n", strerror(errno));
377c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */
378c80476e4SDavid E. O'Brien 	return(-1);
379c80476e4SDavid E. O'Brien     }
380c80476e4SDavid E. O'Brien 
381c80476e4SDavid E. O'Brien     /*
382c80476e4SDavid E. O'Brien      * We always keep up with the eight bit setting and the speed of the
383c80476e4SDavid E. O'Brien      * tty. But only we only believe changes that are made to cooked mode!
384c80476e4SDavid E. O'Brien      */
385c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO)
386c80476e4SDavid E. O'Brien     Tty_eight_bit = tty_geteightbit(&tstty);
387c80476e4SDavid E. O'Brien     T_Speed = tty_getspeed(&tstty);
388c80476e4SDavid E. O'Brien 
389c80476e4SDavid E. O'Brien #  ifdef POSIX
390c80476e4SDavid E. O'Brien     /*
391c80476e4SDavid E. O'Brien      * Fix from: Steven (Steve) B. Green <xrsbg@charney.gsfc.nasa.gov>
392c80476e4SDavid E. O'Brien      * Speed was not being set up correctly under POSIX.
393c80476e4SDavid E. O'Brien      */
394c80476e4SDavid E. O'Brien     if (tty_getspeed(&extty) != T_Speed || tty_getspeed(&edtty) != T_Speed) {
395c80476e4SDavid E. O'Brien 	(void) cfsetispeed(&extty.d_t, T_Speed);
396c80476e4SDavid E. O'Brien 	(void) cfsetospeed(&extty.d_t, T_Speed);
397c80476e4SDavid E. O'Brien 	(void) cfsetispeed(&edtty.d_t, T_Speed);
398c80476e4SDavid E. O'Brien 	(void) cfsetospeed(&edtty.d_t, T_Speed);
399c80476e4SDavid E. O'Brien     }
400c80476e4SDavid E. O'Brien #  endif /* POSIX */
401c80476e4SDavid E. O'Brien # else /* GSTTY */
402c80476e4SDavid E. O'Brien 
403c80476e4SDavid E. O'Brien     T_Speed = tty_getspeed(&tstty);
404c80476e4SDavid E. O'Brien     Tty_eight_bit = tty_geteightbit(&tstty);
405c80476e4SDavid E. O'Brien 
406c80476e4SDavid E. O'Brien     if (extty.d_t.sg_ispeed != tstty.d_t.sg_ispeed) {
407c80476e4SDavid E. O'Brien 	extty.d_t.sg_ispeed = tstty.d_t.sg_ispeed;
408c80476e4SDavid E. O'Brien 	edtty.d_t.sg_ispeed = tstty.d_t.sg_ispeed;
409c80476e4SDavid E. O'Brien     }
410c80476e4SDavid E. O'Brien 
411c80476e4SDavid E. O'Brien     if (extty.d_t.sg_ospeed != tstty.d_t.sg_ospeed) {
412c80476e4SDavid E. O'Brien 	extty.d_t.sg_ospeed = tstty.d_t.sg_ospeed;
413c80476e4SDavid E. O'Brien 	edtty.d_t.sg_ospeed = tstty.d_t.sg_ospeed;
414c80476e4SDavid E. O'Brien     }
415c80476e4SDavid E. O'Brien # endif /* POSIX || TERMIO */
416c80476e4SDavid E. O'Brien 
417c80476e4SDavid E. O'Brien     if (tty_cooked_mode(&tstty)) {
418c80476e4SDavid E. O'Brien 	/*
419c80476e4SDavid E. O'Brien 	 * re-test for some things here (like maybe the user typed
420c80476e4SDavid E. O'Brien 	 * "stty -tabs"
421c80476e4SDavid E. O'Brien 	 */
422c80476e4SDavid E. O'Brien 	if (tty_gettabs(&tstty) == 0)
423c80476e4SDavid E. O'Brien 	    T_Tabs = 0;
424c80476e4SDavid E. O'Brien 	else
425c80476e4SDavid E. O'Brien 	    T_Tabs = CanWeTab();
426c80476e4SDavid E. O'Brien 
427c80476e4SDavid E. O'Brien # if defined(POSIX) || defined(TERMIO)
428c80476e4SDavid E. O'Brien 	extty.d_t.c_cflag  = tstty.d_t.c_cflag;
429c80476e4SDavid E. O'Brien 	extty.d_t.c_cflag &= ~ttylist[EX_IO][M_CONTROL].t_clrmask;
430c80476e4SDavid E. O'Brien 	extty.d_t.c_cflag |=  ttylist[EX_IO][M_CONTROL].t_setmask;
431c80476e4SDavid E. O'Brien 
432c80476e4SDavid E. O'Brien 	edtty.d_t.c_cflag  = tstty.d_t.c_cflag;
433c80476e4SDavid E. O'Brien 	edtty.d_t.c_cflag &= ~ttylist[ED_IO][M_CONTROL].t_clrmask;
434c80476e4SDavid E. O'Brien 	edtty.d_t.c_cflag |=  ttylist[ED_IO][M_CONTROL].t_setmask;
435c80476e4SDavid E. O'Brien 
436c80476e4SDavid E. O'Brien 	extty.d_t.c_lflag = tstty.d_t.c_lflag;
437c80476e4SDavid E. O'Brien 	extty.d_t.c_lflag &= ~ttylist[EX_IO][M_LINED].t_clrmask;
438c80476e4SDavid E. O'Brien 	extty.d_t.c_lflag |=  ttylist[EX_IO][M_LINED].t_setmask;
439c80476e4SDavid E. O'Brien 
440c80476e4SDavid E. O'Brien 	edtty.d_t.c_lflag = tstty.d_t.c_lflag;
441c80476e4SDavid E. O'Brien 	edtty.d_t.c_lflag &= ~ttylist[ED_IO][M_LINED].t_clrmask;
442c80476e4SDavid E. O'Brien 	edtty.d_t.c_lflag |=  ttylist[ED_IO][M_LINED].t_setmask;
443c80476e4SDavid E. O'Brien 
444c80476e4SDavid E. O'Brien 	extty.d_t.c_iflag = tstty.d_t.c_iflag;
445c80476e4SDavid E. O'Brien 	extty.d_t.c_iflag &= ~ttylist[EX_IO][M_INPUT].t_clrmask;
446c80476e4SDavid E. O'Brien 	extty.d_t.c_iflag |=  ttylist[EX_IO][M_INPUT].t_setmask;
447c80476e4SDavid E. O'Brien 
448c80476e4SDavid E. O'Brien 	edtty.d_t.c_iflag = tstty.d_t.c_iflag;
449c80476e4SDavid E. O'Brien 	edtty.d_t.c_iflag &= ~ttylist[ED_IO][M_INPUT].t_clrmask;
450c80476e4SDavid E. O'Brien 	edtty.d_t.c_iflag |=  ttylist[ED_IO][M_INPUT].t_setmask;
451c80476e4SDavid E. O'Brien 
452c80476e4SDavid E. O'Brien 	extty.d_t.c_oflag = tstty.d_t.c_oflag;
453c80476e4SDavid E. O'Brien 	extty.d_t.c_oflag &= ~ttylist[EX_IO][M_OUTPUT].t_clrmask;
454c80476e4SDavid E. O'Brien 	extty.d_t.c_oflag |=  ttylist[EX_IO][M_OUTPUT].t_setmask;
455c80476e4SDavid E. O'Brien 
456c80476e4SDavid E. O'Brien 	edtty.d_t.c_oflag = tstty.d_t.c_oflag;
457c80476e4SDavid E. O'Brien 	edtty.d_t.c_oflag &= ~ttylist[ED_IO][M_OUTPUT].t_clrmask;
458c80476e4SDavid E. O'Brien 	edtty.d_t.c_oflag |=  ttylist[ED_IO][M_OUTPUT].t_setmask;
459c80476e4SDavid E. O'Brien 
460c80476e4SDavid E. O'Brien # else /* GSTTY */
461c80476e4SDavid E. O'Brien 
462c80476e4SDavid E. O'Brien 	extty.d_t.sg_flags = tstty.d_t.sg_flags;
463c80476e4SDavid E. O'Brien 
464c80476e4SDavid E. O'Brien 	extty.d_t.sg_flags &= ~ttylist[EX_IO][M_CONTROL].t_clrmask;
465c80476e4SDavid E. O'Brien 	extty.d_t.sg_flags |=  ttylist[EX_IO][M_CONTROL].t_setmask;
466c80476e4SDavid E. O'Brien 
467c80476e4SDavid E. O'Brien 	if (T_Tabs)		/* order of &= and |= is important to XTABS */
468c80476e4SDavid E. O'Brien 	    extty.d_t.sg_flags &= ~XTABS;
469c80476e4SDavid E. O'Brien 	else
470c80476e4SDavid E. O'Brien 	    extty.d_t.sg_flags |= XTABS;
471c80476e4SDavid E. O'Brien 
472c80476e4SDavid E. O'Brien 	extty.d_lb = tstty.d_lb;
473c80476e4SDavid E. O'Brien 	extty.d_lb &= ~ttylist[EX_IO][M_LOCAL].t_clrmask;
474c80476e4SDavid E. O'Brien 	extty.d_lb |= ttylist[EX_IO][M_LOCAL].t_setmask;
475c80476e4SDavid E. O'Brien 
476c80476e4SDavid E. O'Brien 	edtty.d_t.sg_flags = extty.d_t.sg_flags;
477c80476e4SDavid E. O'Brien 	if (T_Tabs) {	/* order of &= and |= is important to XTABS */
478c80476e4SDavid E. O'Brien 	    edtty.d_t.sg_flags &=
479c80476e4SDavid E. O'Brien 		    ~(ttylist[ED_IO][M_CONTROL].t_clrmask|XTABS);
480c80476e4SDavid E. O'Brien 	    edtty.d_t.sg_flags |=   ttylist[ED_IO][M_CONTROL].t_setmask;
481c80476e4SDavid E. O'Brien 	}
482c80476e4SDavid E. O'Brien 	else {
483c80476e4SDavid E. O'Brien 	    edtty.d_t.sg_flags &= ~ttylist[ED_IO][M_CONTROL].t_clrmask;
484c80476e4SDavid E. O'Brien 	    edtty.d_t.sg_flags |=
485c80476e4SDavid E. O'Brien 		    (ttylist[ED_IO][M_CONTROL].t_setmask|XTABS);
486c80476e4SDavid E. O'Brien 	}
487c80476e4SDavid E. O'Brien 
488c80476e4SDavid E. O'Brien 	edtty.d_lb = tstty.d_lb;
489c80476e4SDavid E. O'Brien 	edtty.d_lb &= ~ttylist[ED_IO][M_LOCAL].t_clrmask;
490c80476e4SDavid E. O'Brien 	edtty.d_lb |= ttylist[ED_IO][M_LOCAL].t_setmask;
491c80476e4SDavid E. O'Brien 
492c80476e4SDavid E. O'Brien # endif /* TERMIO || POSIX */
493c80476e4SDavid E. O'Brien 
494c80476e4SDavid E. O'Brien 	{
495c80476e4SDavid E. O'Brien 	    int i;
496c80476e4SDavid E. O'Brien 
497c80476e4SDavid E. O'Brien 	    tty_getchar(&tstty, ttychars[TS_IO]);
498c80476e4SDavid E. O'Brien 	    /*
499c80476e4SDavid E. O'Brien 	     * Check if the user made any changes.
500c80476e4SDavid E. O'Brien 	     * If he did, then propagate the changes to the
501c80476e4SDavid E. O'Brien 	     * edit and execute data structures.
502c80476e4SDavid E. O'Brien 	     */
503c80476e4SDavid E. O'Brien 	    for (i = 0; i < C_NCC; i++)
504c80476e4SDavid E. O'Brien 		if (ttychars[TS_IO][i] != ttychars[EX_IO][i])
505c80476e4SDavid E. O'Brien 		    break;
506c80476e4SDavid E. O'Brien 
507c80476e4SDavid E. O'Brien 	    if (i != C_NCC || didsetty) {
508c80476e4SDavid E. O'Brien 		didsetty = 0;
509c80476e4SDavid E. O'Brien 		/*
510c80476e4SDavid E. O'Brien 		 * Propagate changes only to the unprotected chars
511c80476e4SDavid E. O'Brien 		 * that have been modified just now.
512c80476e4SDavid E. O'Brien 		 */
513c80476e4SDavid E. O'Brien 		for (i = 0; i < C_NCC; i++) {
514c80476e4SDavid E. O'Brien 		    if (!((ttylist[ED_IO][M_CHAR].t_setmask & C_SH(i))) &&
515c80476e4SDavid E. O'Brien 			(ttychars[TS_IO][i] != ttychars[EX_IO][i]))
516c80476e4SDavid E. O'Brien 			ttychars[ED_IO][i] = ttychars[TS_IO][i];
517c80476e4SDavid E. O'Brien 		    if (ttylist[ED_IO][M_CHAR].t_clrmask & C_SH(i))
518c80476e4SDavid E. O'Brien 			ttychars[ED_IO][i] = vdisable;
519c80476e4SDavid E. O'Brien 		}
520c80476e4SDavid E. O'Brien 		tty_setchar(&edtty, ttychars[ED_IO]);
521c80476e4SDavid E. O'Brien 
522c80476e4SDavid E. O'Brien 		for (i = 0; i < C_NCC; i++) {
523c80476e4SDavid E. O'Brien 		    if (!((ttylist[EX_IO][M_CHAR].t_setmask & C_SH(i))) &&
524c80476e4SDavid E. O'Brien 			(ttychars[TS_IO][i] != ttychars[EX_IO][i]))
525c80476e4SDavid E. O'Brien 			ttychars[EX_IO][i] = ttychars[TS_IO][i];
526c80476e4SDavid E. O'Brien 		    if (ttylist[EX_IO][M_CHAR].t_clrmask & C_SH(i))
527c80476e4SDavid E. O'Brien 			ttychars[EX_IO][i] = vdisable;
528c80476e4SDavid E. O'Brien 		}
529c80476e4SDavid E. O'Brien 		tty_setchar(&extty, ttychars[EX_IO]);
530c80476e4SDavid E. O'Brien 	    }
531c80476e4SDavid E. O'Brien 
532c80476e4SDavid E. O'Brien 	}
533c80476e4SDavid E. O'Brien     }
534c80476e4SDavid E. O'Brien     if (tty_setty(SHTTY, &edtty) == -1) {
535c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY
536c80476e4SDavid E. O'Brien 	xprintf("Rawmode: tty_setty: %s\n", strerror(errno));
537c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */
538c80476e4SDavid E. O'Brien 	return(-1);
539c80476e4SDavid E. O'Brien     }
5403b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
541c80476e4SDavid E. O'Brien     Tty_raw_mode = 1;
542c80476e4SDavid E. O'Brien     flush();			/* flush any buffered output */
543c80476e4SDavid E. O'Brien     return (0);
544c80476e4SDavid E. O'Brien }
545c80476e4SDavid E. O'Brien 
546c80476e4SDavid E. O'Brien int
Cookedmode(void)54745e5710bSMark Peek Cookedmode(void)
548c80476e4SDavid E. O'Brien {				/* set tty in normal setup */
5493b6eaa7bSAndrey A. Chernov #ifdef WINNT_NATIVE
550c80476e4SDavid E. O'Brien     do_nt_cooked_mode();
551c80476e4SDavid E. O'Brien #else
55245e5710bSMark Peek     sigset_t set, oset;
55345e5710bSMark Peek     int res;
554c80476e4SDavid E. O'Brien 
555c80476e4SDavid E. O'Brien # ifdef _IBMR2
556c80476e4SDavid E. O'Brien     tty_setdisc(SHTTY, EX_IO);
557c80476e4SDavid E. O'Brien # endif /* _IBMR2 */
558c80476e4SDavid E. O'Brien 
559c80476e4SDavid E. O'Brien     if (!Tty_raw_mode)
560c80476e4SDavid E. O'Brien 	return (0);
561c80476e4SDavid E. O'Brien 
562c80476e4SDavid E. O'Brien     /* hold this for reseting tty */
56345e5710bSMark Peek     sigemptyset(&set);
56445e5710bSMark Peek     sigaddset(&set, SIGINT);
56545e5710bSMark Peek     (void)sigprocmask(SIG_BLOCK, &set, &oset);
56645e5710bSMark Peek     cleanup_push(&oset, sigprocmask_cleanup);
56745e5710bSMark Peek     res = tty_setty(SHTTY, &extty);
56845e5710bSMark Peek     cleanup_until(&oset);
56945e5710bSMark Peek     if (res == -1) {
570c80476e4SDavid E. O'Brien # ifdef DEBUG_TTY
571c80476e4SDavid E. O'Brien 	xprintf("Cookedmode: tty_setty: %s\n", strerror(errno));
572c80476e4SDavid E. O'Brien # endif /* DEBUG_TTY */
573c80476e4SDavid E. O'Brien 	return -1;
574c80476e4SDavid E. O'Brien     }
5753b6eaa7bSAndrey A. Chernov #endif /* WINNT_NATIVE */
576c80476e4SDavid E. O'Brien 
577c80476e4SDavid E. O'Brien     Tty_raw_mode = 0;
578c80476e4SDavid E. O'Brien     return (0);
579c80476e4SDavid E. O'Brien }
580c80476e4SDavid E. O'Brien 
581c80476e4SDavid E. O'Brien void
ResetInLine(int macro)58245e5710bSMark Peek ResetInLine(int macro)
583c80476e4SDavid E. O'Brien {
584c80476e4SDavid E. O'Brien     Cursor = InputBuf;		/* reset cursor */
585c80476e4SDavid E. O'Brien     LastChar = InputBuf;
58645e5710bSMark Peek     InputLim = &InputBuf[INBUFSIZE - 2];/*FIXBUF*/
587c80476e4SDavid E. O'Brien     Mark = InputBuf;
58845e5710bSMark Peek     MarkIsSet = 0;
589c80476e4SDavid E. O'Brien     MetaNext = 0;
590c80476e4SDavid E. O'Brien     CurrentKeyMap = CcKeyMap;
591c80476e4SDavid E. O'Brien     AltKeyMap = 0;
592c80476e4SDavid E. O'Brien     Hist_num = 0;
593c80476e4SDavid E. O'Brien     DoingArg = 0;
594c80476e4SDavid E. O'Brien     Argument = 1;
595c80476e4SDavid E. O'Brien     LastCmd = F_UNASSIGNED;	/* previous command executed */
59645e5710bSMark Peek     IncMatchLen = 0;
597c80476e4SDavid E. O'Brien     if (macro)
598c80476e4SDavid E. O'Brien 	MacroLvl = -1;		/* no currently active macros */
599c80476e4SDavid E. O'Brien }
600c80476e4SDavid E. O'Brien 
601c80476e4SDavid E. O'Brien int
Load_input_line(void)60245e5710bSMark Peek Load_input_line(void)
603c80476e4SDavid E. O'Brien {
60445e5710bSMark Peek     static Char *Input_Line = NULL;
605c80476e4SDavid E. O'Brien #ifdef SUNOS4
606c80476e4SDavid E. O'Brien     long chrs = 0;
607c80476e4SDavid E. O'Brien #else /* !SUNOS4 */
608c80476e4SDavid E. O'Brien     /*
609c80476e4SDavid E. O'Brien      * *Everyone* else has an int, but SunOS wants long!
610c80476e4SDavid E. O'Brien      * This breaks where int != long (alpha)
611c80476e4SDavid E. O'Brien      */
612c80476e4SDavid E. O'Brien     int chrs = 0;
613c80476e4SDavid E. O'Brien #endif /* SUNOS4 */
614c80476e4SDavid E. O'Brien 
615c80476e4SDavid E. O'Brien     if (Input_Line)
61645e5710bSMark Peek 	xfree(Input_Line);
617c80476e4SDavid E. O'Brien     Input_Line = NULL;
618c80476e4SDavid E. O'Brien 
619c80476e4SDavid E. O'Brien     if (Tty_raw_mode)
620c80476e4SDavid E. O'Brien 	return 0;
621c80476e4SDavid E. O'Brien 
622c80476e4SDavid E. O'Brien #if defined(FIONREAD) && !defined(OREO)
623c80476e4SDavid E. O'Brien     (void) ioctl(SHIN, FIONREAD, (ioctl_t) &chrs);
624c80476e4SDavid E. O'Brien     if (chrs > 0) {
625c80476e4SDavid E. O'Brien         char    buf[BUFSIZE];
626c80476e4SDavid E. O'Brien 
62745e5710bSMark Peek 	chrs = xread(SHIN, buf, min(chrs, BUFSIZE - 1));
628c80476e4SDavid E. O'Brien 	if (chrs > 0) {
629c80476e4SDavid E. O'Brien 	    buf[chrs] = '\0';
630c80476e4SDavid E. O'Brien 	    Input_Line = Strsave(str2short(buf));
631c80476e4SDavid E. O'Brien 	    PushMacro(Input_Line);
632c80476e4SDavid E. O'Brien 	}
633c80476e4SDavid E. O'Brien #ifdef convex
634c80476e4SDavid E. O'Brien         /* need to print errno message in case file is migrated */
635c80476e4SDavid E. O'Brien         if (chrs < 0)
636c80476e4SDavid E. O'Brien             stderror(ERR_SYSTEM, progname, strerror(errno));
637c80476e4SDavid E. O'Brien #endif
638c80476e4SDavid E. O'Brien     }
639c80476e4SDavid E. O'Brien #endif  /* FIONREAD && !OREO */
640c80476e4SDavid E. O'Brien     return chrs > 0;
641c80476e4SDavid E. O'Brien }
642c80476e4SDavid E. O'Brien 
643c80476e4SDavid E. O'Brien /*
644c80476e4SDavid E. O'Brien  * Bugfix (in Swedish) by:
645c80476e4SDavid E. O'Brien  * Johan Widen
646c80476e4SDavid E. O'Brien  * SICS, PO Box 1263, S-163 13 SPANGA, SWEDEN
647c80476e4SDavid E. O'Brien  * {mcvax,munnari,cernvax,diku,inria,prlb2,penet,ukc,unido}!enea!sics.se!jw
648c80476e4SDavid E. O'Brien  * Internet: jw@sics.se
649c80476e4SDavid E. O'Brien  *
650c80476e4SDavid E. O'Brien  * (via Hans J Albertsson (thanks))
651c80476e4SDavid E. O'Brien  */
652c80476e4SDavid E. O'Brien void
QuoteModeOn(void)65345e5710bSMark Peek QuoteModeOn(void)
654c80476e4SDavid E. O'Brien {
655c80476e4SDavid E. O'Brien     if (MacroLvl >= 0)
656c80476e4SDavid E. O'Brien 	return;
657c80476e4SDavid E. O'Brien 
6583b6eaa7bSAndrey A. Chernov #ifndef WINNT_NATIVE
659c80476e4SDavid E. O'Brien     qutty = edtty;
660c80476e4SDavid E. O'Brien 
661c80476e4SDavid E. O'Brien #if defined(TERMIO) || defined(POSIX)
662c80476e4SDavid E. O'Brien     qutty.d_t.c_iflag &= ~ttylist[QU_IO][M_INPUT].t_clrmask;
663c80476e4SDavid E. O'Brien     qutty.d_t.c_iflag |=  ttylist[QU_IO][M_INPUT].t_setmask;
664c80476e4SDavid E. O'Brien 
665c80476e4SDavid E. O'Brien     qutty.d_t.c_oflag &= ~ttylist[QU_IO][M_OUTPUT].t_clrmask;
666c80476e4SDavid E. O'Brien     qutty.d_t.c_oflag |=  ttylist[QU_IO][M_OUTPUT].t_setmask;
667c80476e4SDavid E. O'Brien 
668c80476e4SDavid E. O'Brien     qutty.d_t.c_cflag &= ~ttylist[QU_IO][M_CONTROL].t_clrmask;
669c80476e4SDavid E. O'Brien     qutty.d_t.c_cflag |=  ttylist[QU_IO][M_CONTROL].t_setmask;
670c80476e4SDavid E. O'Brien 
671c80476e4SDavid E. O'Brien     qutty.d_t.c_lflag &= ~ttylist[QU_IO][M_LINED].t_clrmask;
672c80476e4SDavid E. O'Brien     qutty.d_t.c_lflag |=  ttylist[QU_IO][M_LINED].t_setmask;
673c80476e4SDavid E. O'Brien #else /* GSTTY */
674c80476e4SDavid E. O'Brien     qutty.d_t.sg_flags &= ~ttylist[QU_IO][M_CONTROL].t_clrmask;
675c80476e4SDavid E. O'Brien     qutty.d_t.sg_flags |= ttylist[QU_IO][M_CONTROL].t_setmask;
676c80476e4SDavid E. O'Brien     qutty.d_lb &= ~ttylist[QU_IO][M_LOCAL].t_clrmask;
677c80476e4SDavid E. O'Brien     qutty.d_lb |= ttylist[QU_IO][M_LOCAL].t_setmask;
678c80476e4SDavid E. O'Brien 
679c80476e4SDavid E. O'Brien #endif /* TERMIO || POSIX */
680c80476e4SDavid E. O'Brien     if (tty_setty(SHTTY, &qutty) == -1) {
681c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY
682c80476e4SDavid E. O'Brien 	xprintf("QuoteModeOn: tty_setty: %s\n", strerror(errno));
683c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */
684c80476e4SDavid E. O'Brien 	return;
685c80476e4SDavid E. O'Brien     }
6863b6eaa7bSAndrey A. Chernov #endif /* !WINNT_NATIVE */
687c80476e4SDavid E. O'Brien     Tty_quote_mode = 1;
688c80476e4SDavid E. O'Brien     return;
689c80476e4SDavid E. O'Brien }
690c80476e4SDavid E. O'Brien 
691c80476e4SDavid E. O'Brien void
QuoteModeOff(void)69245e5710bSMark Peek QuoteModeOff(void)
693c80476e4SDavid E. O'Brien {
694c80476e4SDavid E. O'Brien     if (!Tty_quote_mode)
695c80476e4SDavid E. O'Brien 	return;
696c80476e4SDavid E. O'Brien     Tty_quote_mode = 0;
697c80476e4SDavid E. O'Brien     if (tty_setty(SHTTY, &edtty) == -1) {
698c80476e4SDavid E. O'Brien #ifdef DEBUG_TTY
699c80476e4SDavid E. O'Brien 	xprintf("QuoteModeOff: tty_setty: %s\n", strerror(errno));
700c80476e4SDavid E. O'Brien #endif /* DEBUG_TTY */
701c80476e4SDavid E. O'Brien 	return;
702c80476e4SDavid E. O'Brien     }
703c80476e4SDavid E. O'Brien     return;
704c80476e4SDavid E. O'Brien }
705