[362] | 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 | |
---|
| 16 | int putch(); |
---|
| 17 | |
---|
| 18 | erase () |
---|
| 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 | |
---|
| 31 | move (row, col) |
---|
| 32 | { |
---|
| 33 | tputs (tgoto (cm, col, row), 100, putch); |
---|
| 34 | } |
---|
| 35 | |
---|
| 36 | inverse () |
---|
| 37 | { |
---|
| 38 | tputs (so, 10, putch); |
---|
| 39 | } |
---|
| 40 | |
---|
| 41 | normal () |
---|
| 42 | { |
---|
| 43 | tputs (se, 10, putch); |
---|
| 44 | } |
---|
| 45 | |
---|
| 46 | backup () |
---|
| 47 | { |
---|
| 48 | if (BC) |
---|
| 49 | tputs (BC, 1, putch); |
---|
| 50 | else |
---|
| 51 | putchar ('\b'); |
---|
| 52 | } |
---|
| 53 | |
---|
| 54 | putch (c) |
---|
| 55 | { |
---|
| 56 | putchar (c); |
---|
| 57 | } |
---|
| 58 | |
---|
| 59 | #ifdef USG |
---|
| 60 | struct termio sbuf, osbuf; |
---|
| 61 | #else |
---|
| 62 | struct sgttyb sbuf, osbuf; |
---|
| 63 | #endif |
---|
| 64 | static termchanged = 0; |
---|
| 65 | |
---|
| 66 | |
---|
| 67 | terminit () |
---|
| 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 | |
---|
| 95 | retry: |
---|
| 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 | |
---|
| 157 | done () |
---|
| 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 |
---|
| 170 | onstop(signo) |
---|
| 171 | int 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 | |
---|
| 181 | stop () |
---|
| 182 | { |
---|
| 183 | onstop (SIGTSTP); |
---|
| 184 | } |
---|
| 185 | #endif |
---|
| 186 | |
---|
| 187 | shellescape (buf) |
---|
| 188 | char *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 | } |
---|