home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Source Code 1992 March
/
Source_Code_CD-ROM_Walnut_Creek_March_1992.iso
/
usenet
/
altsrcs
/
0
/
0979
/
screen.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-12-28
|
6KB
|
319 lines
#include <stdio.h>
#include "system.h"
#ifdef USG
# ifdef M_XENIX
# include <sys/types.h>
# include <sys/ioctl.h>
# endif
# include <termio.h>
struct termio rawbuf;
struct termio cookedbuf;
#else
# include <sgtty.h> /* terminal modes for tinit(), tend() */
struct sgttyb sgbuf; /* buffer for terminal mode info */
int rawflags, cookflags; /* flags for raw & cooked tty mode */
#endif
#include <signal.h>
#define TERMBUF 1024 /* Size of term buf for termcap */
extern int nlines;
extern char *tgetstr(), *tgoto();
extern int display_up;
extern int intrup; /* Have we been interrupted? */
char *tent; /* Pointer to tbuf */
char PC; /* Pad character */
char *UP, *BC; /* Upline, backsapce character */
short ospeed; /* Terminal output speed */
char termbuf[TERMBUF]; /* Place to put term info */
char *cm, /* Cursor motion */
*cs, /* Change scrolling region */
*sf, /* - scroll forward */
*sr, /* - scroll backwards */
*ce, /* Clear to end of line */
*cl, /* Clear screen */
*al, /* Insert line */
*dl, /* delete ditto */
*so, /* standout */
*se, /* standout end */
*us, /* underline */
*ue, /* underline end */
*ti, /* Init terminal */
*te; /* Reset terminal */
int li, /* lines on screen */
co; /* columns ditto */
char xn; /* Magic cookie kludge */
/* Screen manipulation primitives: dumb set for smart terminals */
at(x, y)
int x, y;
{
outs(tgoto(cm, x, y));
}
nl()
{
outs(ce);
outc('\n');
}
/* Scroll lines in window (from:to) n lines */
scroll(from, to, n)
int from, to, n;
{
if(cs && sf && sr) {
outs(tgoto(cs, from, to-1));
if(n<0) {
at(0, from);
while(n++)
outs(sr);
}
else {
at(0, to-1);
while(n--)
outs(sf);
}
outs(tgoto(cs, 0, li-1));
}
else if(al && dl) {
if(n<0) {
int i=n;
outs(tgoto(cm, 0, to+n));
while(i++)
outs(dl);
outs(tgoto(cm, 0, from));
while(n++)
outs(al);
}
else {
int i=n;
outs(tgoto(cm, 0, from));
while(i--)
outs(dl);
outs(tgoto(cm, 0, to-n));
while(n--)
outs(al);
}
}
}
tinit(name)
char *name;
{
char *termptr;
char tbuf[TERMBUF], *tmp;
SIGNAL intr();
SIGNAL term();
#ifdef BSD
SIGNAL stop();
#endif
termptr = termbuf;
tgetent(tbuf, name);
tmp = tgetstr("pc", &termptr);
if(tmp) PC = *tmp;
UP = tgetstr("up", &termptr);
BC = tgetstr("bc", &termptr);
cm = tgetstr("cm", &termptr);
cs = tgetstr("cs", &termptr);
sf = tgetstr("sf", &termptr);
sr = tgetstr("sr", &termptr);
ce = tgetstr("ce", &termptr);
cl = tgetstr("cl", &termptr);
al = tgetstr("al", &termptr);
dl = tgetstr("dl", &termptr);
us = tgetstr("us", &termptr);
ue = tgetstr("ue", &termptr);
so = tgetstr("so", &termptr);
se = tgetstr("se", &termptr);
ti = tgetstr("ti", &termptr);
te = tgetstr("te", &termptr);
li = tgetnum("li");
co = tgetnum("co");
xn = tgetflag("xn");
nlines=li-3;
#ifdef USG
ioctl(1, TCGETA, &rawbuf);
cookedbuf = rawbuf;
rawbuf.c_lflag &= ~(ICANON|ECHO|ECHOE|ECHOK|ECHONL);
rawbuf.c_cc[VMIN] = 1;
rawbuf.c_cc[VTIME] = 0;
#else
gtty(1, &sgbuf);
ospeed=sgbuf.sg_ospeed;
quickmode=ospeed<10;
cookflags=sgbuf.sg_flags;
sgbuf.sg_flags = (sgbuf.sg_flags&~ECHO)|CBREAK;
rawflags=sgbuf.sg_flags;
#endif
signal(SIGINT, intr);
signal(SIGTERM, term);
#ifdef BSD
signal(SIGTSTP, stop);
#endif
rawtty();
}
int tmode=0;
entty()
{
if(!tmode)
outs(ti);
tmode=1;
}
extty()
{
if(tmode)
outs(te);
tmode=0;
}
rawtty()
{
#ifdef USG
ioctl(1, TCSETA, &rawbuf);
#else
sgbuf.sg_flags=rawflags;
stty(1, &sgbuf);
#endif
entty();
}
cooktty()
{
#ifdef USG
ioctl(1, TCSETA, &cookedbuf);
#else
sgbuf.sg_flags=cookflags;
stty(1, &sgbuf);
#endif
extty();
}
SIGNAL intr()
{
signal(SIGINT, intr);
intrup=1;
}
SIGNAL term()
{
tend();
tcl_end();
exit(0);
}
#ifdef BSD
SIGNAL stop()
{
signal(SIGTSTP, stop);
intrup=1;
tend();
kill(getpid(), SIGSTOP);
rawtty();
display_up=0;
}
#endif
tend()
{
end_screenmode();
cooktty();
fflush(stdout);
}
outs(s)
char *s;
{
int outc();
if(s)
tputs(s, 0, outc);
}
outc(c)
char c;
{
putchar(c);
}
int somode = 0;
int ulmode = 0;
standout()
{
if(!somode) {
outs(so);
somode = 1;
if(xn) return 1;
}
return 0;
}
underline()
{
if(!ulmode) {
outs(us);
ulmode = 1;
if(xn) return 1;
}
return 0;
}
standend()
{
int cnt = 0;
if(somode) {
outs(se);
somode = 0;
if(xn) cnt++;
}
if(ulmode) {
outs(ue);
ulmode = 0;
if(xn) cnt++;
}
return cnt;
}
cmdline()
{
at(0, li-1);
outs(ce);
}
end_screenmode()
{
if(display_up) {
at(0, li-1);
outc('\n');
display_up = 0;
}
}
end_linemode()
{
if(!display_up) {
redraw();
display_up = 1;
}
}
clear_screen()
{
outs(cl);
}