|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 3781 (0xec5)
Types: TextFile
Names: »term.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦this⟧ »EUUGD11/euug-87hel/sec1/ispell/term.c«
/* -*- Mode:Text -*- */
/*
* term.c - deal with termcap, and unix terminal mode settings
*
* Pace Willisson, 1983
*/
#include <stdio.h>
#ifdef USG
#include <termio.h>
#else
#include <sgtty.h>
#endif
#include <signal.h>
#include "ispell.h"
int putch();
erase ()
{
if (cl)
tputs(cl, li, putch);
else {
if (ho)
tputs(ho, 100, putch);
else if (cm)
tputs(tgoto(cm, 0, 0), 100, putch);
tputs(cd, li, putch);
}
}
move (row, col)
{
tputs (tgoto (cm, col, row), 100, putch);
}
inverse ()
{
tputs (so, 10, putch);
}
normal ()
{
tputs (se, 10, putch);
}
backup ()
{
if (BC)
tputs (BC, 1, putch);
else
putchar ('\b');
}
putch (c)
{
putchar (c);
}
#ifdef USG
struct termio sbuf, osbuf;
#else
struct sgttyb sbuf, osbuf;
#endif
static termchanged = 0;
terminit ()
{
int done();
#ifdef USG
if (!isatty(0)) {
fprintf (stderr, "Can't deal with non interactive use yet.\n");
exit (1);
}
ioctl (0, TCGETA, &osbuf);
termchanged = 1;
sbuf = osbuf;
sbuf.c_lflag &= ~(ECHO | ECHOK | ECHONL | ICANON);
sbuf.c_oflag &= ~(OPOST);
sbuf.c_iflag &= ~(INLCR | IGNCR | ICRNL);
sbuf.c_cc[VMIN] = 1;
sbuf.c_cc[VTIME] = 1;
ioctl (0, TCSETAW, &sbuf);
erasechar = osbuf.c_cc[VERASE];
killchar = osbuf.c_cc[VKILL];
signal (SIGINT, done);
#else
int tpgrp;
int onstop();
retry:
sigsetmask(1<<SIGTSTP | 1<<SIGTTIN | 1<<SIGTTOU);
if (ioctl(0, TIOCGPGRP, &tpgrp) != 0) {
fprintf (stderr, "Can't deal with non interactive use yet.\n");
exit (1);
}
if (tpgrp != getpgrp(0)) { /* not in foreground */
sigsetmask(1<<SIGTSTP | 1<<SIGTTIN);
signal(SIGTTOU, SIG_DFL);
kill(0, SIGTTOU);
/* job stops here waiting for SIGCONT */
goto retry;
}
ioctl (0, TIOCGETP, &osbuf);
termchanged = 1;
sbuf = osbuf;
sbuf.sg_flags &= ~ECHO;
sbuf.sg_flags |= RAW;
ioctl (0, TIOCSETP, &sbuf);
erasechar = sbuf.sg_erase;
killchar = sbuf.sg_kill;
signal (SIGINT, done);
sigsetmask(0);
signal(SIGTTIN, onstop);
signal(SIGTTOU, onstop);
signal(SIGTSTP, onstop);
#endif
tgetent(termcap, getenv("TERM"));
termptr = termstr;
bs = tgetflag("bs");
BC = tgetstr("bc", &termptr);
UP = tgetstr("up", &termptr);
cd = tgetstr("cd", &termptr);
ce = tgetstr("ce", &termptr);
cl = tgetstr("cl", &termptr);
cm = tgetstr("cm", &termptr);
dc = tgetstr("dc", &termptr);
dl = tgetstr("dl", &termptr);
dm = tgetstr("dm", &termptr);
ed = tgetstr("ed", &termptr);
ei = tgetstr("ei", &termptr);
ho = tgetstr("ho", &termptr);
ic = tgetstr("ic", &termptr);
il = tgetstr("al", &termptr);
im = tgetstr("im", &termptr);
ip = tgetstr("ip", &termptr);
nd = tgetstr("nd", &termptr);
vb = tgetstr("vb", &termptr);
so = tgetstr("so", &termptr); /* inverse video on */
se = tgetstr("se", &termptr); /* inverse video off */
co = tgetnum("co");
li = tgetnum("li");
}
done ()
{
unlink (tempfile);
if (termchanged)
#ifdef USG
ioctl (0, TCSETAW, &osbuf);
#else
ioctl (0, TIOCSETP, &osbuf);
#endif
exit (0);
}
#ifndef USG
onstop(signo)
int signo;
{
ioctl (0, TIOCSETP, &osbuf);
signal(signo, SIG_DFL);
kill(0, signo);
/* stop here until continued */
signal(signo, onstop);
ioctl (0, TIOCSETP, &sbuf);
}
stop ()
{
onstop (SIGTSTP);
}
#endif
shellescape (buf)
char *buf;
{
#ifdef USG
ioctl (0, TCSETAW, &osbuf);
signal (SIGINT, SIG_IGN);
signal (SIGQUIT, SIG_IGN);
#else
ioctl (0, TIOCSETP, &osbuf);
signal (SIGINT, 1);
signal (SIGQUIT, 1);
signal(SIGTTIN, SIG_DFL);
signal(SIGTTOU, SIG_DFL);
signal(SIGTSTP, SIG_DFL);
#endif
system (buf);
#ifndef USG
signal(SIGTTIN, onstop);
signal(SIGTTOU, onstop);
signal(SIGTSTP, onstop);
#endif
signal (SIGINT, done);
signal (SIGQUIT, SIG_DFL);
#ifdef USG
ioctl (0, TCSETAW, &sbuf);
#else
ioctl (0, TIOCSETP, &sbuf);
#endif
printf ("\n-- Type space to continue --");
getchar ();
}