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