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

Revision 362, 4.0 KB checked in by ambar, 37 years ago (diff)
Initial revision
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        extern short ospeed;
94
95retry:
96        (void) sigsetmask(1<<SIGTSTP | 1<<SIGTTIN | 1<<SIGTTOU);
97        if (ioctl(0, TIOCGPGRP, &tpgrp) != 0) {
98                fprintf (stderr, "Can't deal with non interactive use yet.\n");
99                exit (1);
100        }
101        if (tpgrp != getpgrp(0)) { /* not in foreground */
102                (void) sigsetmask(1<<SIGTSTP | 1<<SIGTTIN);
103                (void) signal(SIGTTOU, SIG_DFL);
104                (void) kill(0, SIGTTOU);
105                /* job stops here waiting for SIGCONT */
106                goto retry;
107        }
108
109        (void) ioctl (0, TIOCGETP, &osbuf);
110        termchanged = 1;
111
112        sbuf = osbuf;
113        sbuf.sg_flags &= ~ECHO;
114        sbuf.sg_flags |= RAW;
115        (void) ioctl (0, TIOCSETP, &sbuf);
116
117        erasechar = sbuf.sg_erase;
118        killchar = sbuf.sg_kill;
119        ospeed = sbuf.sg_ospeed;
120
121        (void) signal (SIGINT, done);
122
123        (void) sigsetmask(0);
124        (void) signal(SIGTTIN, onstop);
125        (void) signal(SIGTTOU, onstop);
126        (void) signal(SIGTSTP, onstop);
127#endif
128
129        tgetent(termcap, getenv("TERM"));
130        termptr = termstr;
131        bs = tgetflag("bs");
132        BC = tgetstr("bc", &termptr);
133        UP = tgetstr("up", &termptr);
134        cd = tgetstr("cd", &termptr);
135        ce = tgetstr("ce", &termptr);   
136        cl = tgetstr("cl", &termptr);
137        cm = tgetstr("cm", &termptr);
138        dc = tgetstr("dc", &termptr);
139        dl = tgetstr("dl", &termptr);
140        dm = tgetstr("dm", &termptr);
141        ed = tgetstr("ed", &termptr);
142        ei = tgetstr("ei", &termptr);
143        ho = tgetstr("ho", &termptr);
144        ic = tgetstr("ic", &termptr);
145        il = tgetstr("al", &termptr);
146        im = tgetstr("im", &termptr);
147        ip = tgetstr("ip", &termptr);
148        nd = tgetstr("nd", &termptr);
149        vb = tgetstr("vb", &termptr);
150        so = tgetstr("so", &termptr);   /* inverse video on */
151        se = tgetstr("se", &termptr);   /* inverse video off */
152        co = tgetnum("co");
153        li = tgetnum("li");     
154
155}
156
157done ()
158{
159        (void) unlink (tempfile);
160        if (termchanged)
161#ifdef USG
162                (void) ioctl (0, TCSETAW, &osbuf);
163#else
164                (void) ioctl (0, TIOCSETP, &osbuf);
165#endif
166        exit (0);
167}
168
169#ifndef USG
170onstop(signo)
171int signo;
172{
173        (void) ioctl (0, TIOCSETP, &osbuf);
174        (void) signal(signo, SIG_DFL);
175        (void) kill(0, signo);
176        /* stop here until continued */
177        (void) signal(signo, onstop);
178        (void) ioctl (0, TIOCSETP, &sbuf);
179}
180
181stop ()
182{
183        onstop (SIGTSTP);
184}
185#endif
186
187shellescape (buf)
188char *buf;
189{
190#ifdef USG
191        (void) ioctl (0, TCSETAW, &osbuf);
192        (void) signal (SIGINT, SIG_IGN);
193        (void) signal (SIGQUIT, SIG_IGN);
194#else
195        (void) ioctl (0, TIOCSETP, &osbuf);
196        (void) signal (SIGINT, 1);
197        (void) signal (SIGQUIT, 1);
198        (void) signal(SIGTTIN, SIG_DFL);
199        (void) signal(SIGTTOU, SIG_DFL);
200        (void) signal(SIGTSTP, SIG_DFL);
201#endif
202
203        (void) system (buf);
204
205#ifndef USG
206        (void) signal(SIGTTIN, onstop);
207        (void) signal(SIGTTOU, onstop);
208        (void) signal(SIGTSTP, onstop);
209#endif
210        (void) signal (SIGINT, done);
211        (void) signal (SIGQUIT, SIG_DFL);
212
213#ifdef USG
214        (void) ioctl (0, TCSETAW, &sbuf);
215#else
216        (void) ioctl (0, TIOCSETP, &sbuf);
217#endif
218        printf ("\n-- Type space to continue --");
219        getchar ();
220}
Note: See TracBrowser for help on using the repository browser.