source: trunk/athena/bin/ispell/term.c @ 5066

Revision 5066, 4.1 KB checked in by probe, 33 years ago (diff)
RIOS integration
Line 
1/*
2 * term.c - deal with termcap, and unix terminal mode settings
3 *
4 * Pace Willisson, 1983
5 */
6
7#include <stdio.h>
8#ifdef USG
9#include <termio.h>
10#else
11#include <sgtty.h>
12#endif
13#include <signal.h>
14#include "ispell.h"
15
16int putch();
17
18erase ()
19{
20        if (cl)
21                tputs(cl, li, putch);
22        else {
23                if (ho)
24                        tputs(ho, 100, putch);
25                else if (cm)
26                        tputs(tgoto(cm, 0, 0), 100, putch);
27                tputs(cd, li, putch);
28        }
29}
30
31move (row, col)
32{
33        tputs (tgoto (cm, col, row), 100, putch);
34}
35
36inverse ()
37{
38        tputs (so, 10, putch);
39}
40
41normal ()
42{
43        tputs (se, 10, putch);
44}
45
46backup ()
47{
48        if (BC)
49                tputs (BC, 1, putch);
50        else
51                putchar ('\b');
52}
53
54putch (c)
55{
56        putchar (c);
57}
58
59#ifdef USG
60struct termio sbuf, osbuf;
61#else
62struct sgttyb sbuf, osbuf;
63#endif
64static termchanged = 0;
65
66
67terminit ()
68{
69        int done();
70#ifdef USG
71        if (!isatty(0)) {
72                fprintf (stderr, "Can't deal with non interactive use yet.\n");
73                exit (1);
74        }
75        (void) ioctl (0, TCGETA, &osbuf);
76        termchanged = 1;
77
78        sbuf = osbuf;
79        sbuf.c_lflag &= ~(ECHO | ECHOK | ECHONL | ICANON);
80        sbuf.c_oflag &= ~(OPOST);
81        sbuf.c_iflag &= ~(INLCR | IGNCR | ICRNL);
82        sbuf.c_cc[VMIN] = 1;
83        sbuf.c_cc[VTIME] = 1;
84        (void) ioctl (0, TCSETAW, &sbuf);
85
86        erasechar = osbuf.c_cc[VERASE];
87        killchar = osbuf.c_cc[VKILL];
88
89        (void) signal (SIGINT, done);
90#else
91        int tpgrp;
92        int onstop();
93#ifndef _IBMR2
94/* Only fakes termcap- doesn't have ospeed. */
95        extern short ospeed; */
96#endif
97retry:
98        (void) sigsetmask(1<<SIGTSTP | 1<<SIGTTIN | 1<<SIGTTOU);
99        if (ioctl(0, TIOCGPGRP, &tpgrp) != 0) {
100                fprintf (stderr, "Can't deal with non interactive use yet.\n");
101                exit (1);
102        }
103        if (tpgrp != getpgrp(0)) { /* not in foreground */
104                (void) sigsetmask(1<<SIGTSTP | 1<<SIGTTIN);
105                (void) signal(SIGTTOU, SIG_DFL);
106                (void) kill(0, SIGTTOU);
107                /* job stops here waiting for SIGCONT */
108                goto retry;
109        }
110
111        (void) ioctl (0, TIOCGETP, &osbuf);
112        termchanged = 1;
113
114        sbuf = osbuf;
115        sbuf.sg_flags &= ~ECHO;
116        sbuf.sg_flags |= RAW;
117        (void) ioctl (0, TIOCSETP, &sbuf);
118
119        erasechar = sbuf.sg_erase;
120        killchar = sbuf.sg_kill;
121#ifndef _IBMR2
122        ospeed = sbuf.sg_ospeed;
123#endif
124        (void) signal (SIGINT, done);
125
126        (void) sigsetmask(0);
127        (void) signal(SIGTTIN, onstop);
128        (void) signal(SIGTTOU, onstop);
129        (void) signal(SIGTSTP, onstop);
130#endif
131
132        tgetent(termcap, getenv("TERM"));
133        termptr = termstr;
134        bs = tgetflag("bs");
135        BC = tgetstr("bc", &termptr);
136        UP = tgetstr("up", &termptr);
137        cd = tgetstr("cd", &termptr);
138        ce = tgetstr("ce", &termptr);   
139        cl = tgetstr("cl", &termptr);
140        cm = tgetstr("cm", &termptr);
141        dc = tgetstr("dc", &termptr);
142        dl = tgetstr("dl", &termptr);
143        dm = tgetstr("dm", &termptr);
144        ed = tgetstr("ed", &termptr);
145        ei = tgetstr("ei", &termptr);
146        ho = tgetstr("ho", &termptr);
147        ic = tgetstr("ic", &termptr);
148        il = tgetstr("al", &termptr);
149        im = tgetstr("im", &termptr);
150        ip = tgetstr("ip", &termptr);
151        nd = tgetstr("nd", &termptr);
152        vb = tgetstr("vb", &termptr);
153        so = tgetstr("so", &termptr);   /* inverse video on */
154        se = tgetstr("se", &termptr);   /* inverse video off */
155        co = tgetnum("co");
156        li = tgetnum("li");     
157
158}
159
160done ()
161{
162        (void) unlink (tempfile);
163        if (termchanged)
164#ifdef USG
165                (void) ioctl (0, TCSETAW, &osbuf);
166#else
167                (void) ioctl (0, TIOCSETP, &osbuf);
168#endif
169        exit (0);
170}
171
172#ifndef USG
173onstop(signo)
174int signo;
175{
176        (void) ioctl (0, TIOCSETP, &osbuf);
177        (void) signal(signo, SIG_DFL);
178        (void) kill(0, signo);
179        /* stop here until continued */
180        (void) signal(signo, onstop);
181        (void) ioctl (0, TIOCSETP, &sbuf);
182}
183
184stop ()
185{
186        onstop (SIGTSTP);
187}
188#endif
189
190shellescape (buf)
191char *buf;
192{
193#ifdef USG
194        (void) ioctl (0, TCSETAW, &osbuf);
195        (void) signal (SIGINT, SIG_IGN);
196        (void) signal (SIGQUIT, SIG_IGN);
197#else
198        (void) ioctl (0, TIOCSETP, &osbuf);
199        (void) signal (SIGINT, 1);
200        (void) signal (SIGQUIT, 1);
201        (void) signal(SIGTTIN, SIG_DFL);
202        (void) signal(SIGTTOU, SIG_DFL);
203        (void) signal(SIGTSTP, SIG_DFL);
204#endif
205
206        (void) system (buf);
207
208#ifndef USG
209        (void) signal(SIGTTIN, onstop);
210        (void) signal(SIGTTOU, onstop);
211        (void) signal(SIGTSTP, onstop);
212#endif
213        (void) signal (SIGINT, done);
214        (void) signal (SIGQUIT, SIG_DFL);
215
216#ifdef USG
217        (void) ioctl (0, TCSETAW, &sbuf);
218#else
219        (void) ioctl (0, TIOCSETP, &sbuf);
220#endif
221        printf ("\n-- Type space to continue --");
222        getchar ();
223}
Note: See TracBrowser for help on using the repository browser.