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