diff options
Diffstat (limited to 'hack/hack.termcap.c')
| -rw-r--r-- | hack/hack.termcap.c | 236 |
1 files changed, 138 insertions, 98 deletions
diff --git a/hack/hack.termcap.c b/hack/hack.termcap.c index f1314a0e..79de41b2 100644 --- a/hack/hack.termcap.c +++ b/hack/hack.termcap.c @@ -1,50 +1,50 @@ +/* $NetBSD: hack.termcap.c,v 1.7 1997/10/19 16:59:06 christos Exp $ */ + /* * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +#include <sys/cdefs.h> #ifndef lint -static char rcsid[] = "$NetBSD: hack.termcap.c,v 1.6 1995/04/29 01:20:00 mycroft Exp $"; -#endif /* not lint */ +__RCSID("$NetBSD: hack.termcap.c,v 1.7 1997/10/19 16:59:06 christos Exp $"); +#endif /* not lint */ -#include <stdio.h> #include <string.h> #include <termios.h> -#include "config.h" /* for ROWNO and COLNO */ -#include "def.flag.h" /* for flags.nonull */ -extern char *tgetstr(), *tgoto(), *getenv(); -extern long *alloc(); +#include <termcap.h> +#include <stdlib.h> +#include "hack.h" +#include "extern.h" +#include "def.flag.h" /* for flags.nonull */ -#ifndef lint -extern /* it is defined in libtermlib (libtermcap) */ -#endif lint - speed_t ospeed; /* terminal baudrate; used by tputs */ -static char tbuf[512]; -static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE; -static char *VS, *VE; -static int SG; -static char PC = '\0'; -char *CD; /* tested in pri.c: docorner() */ -int CO, LI; /* used in pri.c and whatis.c */ +static char tbuf[512]; +static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE; +static char *VS, *VE; +static int SG; +static char PC = '\0'; +char *CD; /* tested in pri.c: docorner() */ +int CO, LI; /* used in pri.c and whatis.c */ +void startup() { - register char *term; - register char *tptr; - char *tbufptr, *pc; + char *term; + char *tptr; + char *tbufptr, *pc; tptr = (char *) alloc(1024); tbufptr = tbuf; - if(!(term = getenv("TERM"))) + if (!(term = getenv("TERM"))) error("Can't get TERM."); - if(!strncmp(term, "5620", 4)) + if (!strncmp(term, "5620", 4)) flags.nonull = 1; /* this should be a termcap flag */ - if(tgetent(tptr, term) < 1) + if (tgetent(tptr, term) < 1) error("Unknown terminal type: %s.", term); - if(pc = tgetstr("pc", &tbufptr)) + if ((pc = tgetstr("pc", &tbufptr)) != NULL) PC = *pc; - if(!(BC = tgetstr("bc", &tbufptr))) { - if(!tgetflag("bs")) + if (!(BC = tgetstr("bc", &tbufptr))) { + if (!tgetflag("bs")) error("Terminal must backspace."); BC = tbufptr; tbufptr += 2; @@ -53,23 +53,25 @@ startup() HO = tgetstr("ho", &tbufptr); CO = tgetnum("co"); LI = tgetnum("li"); - if(CO < COLNO || LI < ROWNO+2) + if (CO < COLNO || LI < ROWNO + 2) setclipped(); - if(!(CL = tgetstr("cl", &tbufptr))) + if (!(CL = tgetstr("cl", &tbufptr))) error("Hack needs CL."); ND = tgetstr("nd", &tbufptr); - if(tgetflag("os")) + if (tgetflag("os")) error("Hack can't have OS."); CE = tgetstr("ce", &tbufptr); UP = tgetstr("up", &tbufptr); - /* It seems that xd is no longer supported, and we should use - a linefeed instead; unfortunately this requires resetting - CRMOD, and many output routines will have to be modified - slightly. Let's leave that till the next release. */ + /* + * It seems that xd is no longer supported, and we should use a + * linefeed instead; unfortunately this requires resetting CRMOD, and + * many output routines will have to be modified slightly. Let's + * leave that till the next release. + */ XD = tgetstr("xd", &tbufptr); -/* not: XD = tgetstr("do", &tbufptr); */ - if(!(CM = tgetstr("cm", &tbufptr))) { - if(!UP && !HO) + /* not: XD = tgetstr("do", &tbufptr); */ + if (!(CM = tgetstr("cm", &tbufptr))) { + if (!UP && !HO) error("Hack needs CM or UP or HO."); printf("Playing hack on terminals without cm is suspect...\n"); getret(); @@ -77,19 +79,23 @@ startup() SO = tgetstr("so", &tbufptr); SE = tgetstr("se", &tbufptr); SG = tgetnum("sg"); /* -1: not fnd; else # of spaces left by so */ - if(!SO || !SE || (SG > 0)) SO = SE = 0; + if (!SO || !SE || (SG > 0)) + SO = SE = 0; CD = tgetstr("cd", &tbufptr); - set_whole_screen(); /* uses LI and CD */ - if(tbufptr-tbuf > sizeof(tbuf)) error("TERMCAP entry too big...\n"); + set_whole_screen(); /* uses LI and CD */ + if (tbufptr - tbuf > sizeof(tbuf)) + error("TERMCAP entry too big...\n"); free(tptr); } +void start_screen() { xputs(TI); xputs(VS); } +void end_screen() { xputs(VE); @@ -97,55 +103,56 @@ end_screen() } /* Cursor movements */ -extern xchar curx, cury; - +void curs(x, y) -register int x, y; /* not xchar: perhaps xchar is unsigned and - curx-x would be unsigned as well */ + int x, y; /* not xchar: perhaps xchar is unsigned and + * curx-x would be unsigned as well */ { if (y == cury && x == curx) return; - if(!ND && (curx != x || x <= 3)) { /* Extremely primitive */ - cmov(x, y); /* bunker!wtm */ + if (!ND && (curx != x || x <= 3)) { /* Extremely primitive */ + cmov(x, y); /* bunker!wtm */ return; } - if(abs(cury-y) <= 3 && abs(curx-x) <= 3) + if (abs(cury - y) <= 3 && abs(curx - x) <= 3) nocmov(x, y); - else if((x <= 3 && abs(cury-y)<= 3) || (!CM && x<abs(curx-x))) { + else if ((x <= 3 && abs(cury - y) <= 3) || (!CM && x < abs(curx - x))) { (void) putchar('\r'); curx = 1; nocmov(x, y); - } else if(!CM) { + } else if (!CM) { nocmov(x, y); } else cmov(x, y); } +void nocmov(x, y) + int x, y; { if (cury > y) { - if(UP) { + if (UP) { while (cury > y) { /* Go up. */ xputs(UP); cury--; } - } else if(CM) { + } else if (CM) { cmov(x, y); - } else if(HO) { + } else if (HO) { home(); curs(x, y); - } /* else impossible("..."); */ + } /* else impossible("..."); */ } else if (cury < y) { - if(XD) { - while(cury < y) { + if (XD) { + while (cury < y) { xputs(XD); cury++; } - } else if(CM) { + } else if (CM) { cmov(x, y); } else { - while(cury < y) { + while (cury < y) { xputc('\n'); curx = 1; cury++; @@ -153,12 +160,14 @@ nocmov(x, y) } } if (curx < x) { /* Go to the right. */ - if(!ND) cmov(x, y); else /* bah */ + if (!ND) + cmov(x, y); + else /* bah */ /* should instead print what is there already */ - while (curx < x) { - xputs(ND); - curx++; - } + while (curx < x) { + xputs(ND); + curx++; + } } else if (curx > x) { while (curx > x) { /* Go to the left. */ xputs(BC); @@ -167,31 +176,42 @@ nocmov(x, y) } } +void cmov(x, y) -register x, y; + int x, y; { - xputs(tgoto(CM, x-1, y-1)); + xputs(tgoto(CM, x - 1, y - 1)); cury = y; curx = x; } -xputc(c) char c; { +void +xputc(c) + char c; +{ (void) fputc(c, stdout); } -xputs(s) char *s; { +void +xputs(s) + char *s; +{ tputs(s, 1, xputc); } -cl_end() { - if(CE) +void +cl_end() +{ + if (CE) xputs(CE); - else { /* no-CE fix - free after Harold Rynes */ - /* this looks terrible, especially on a slow terminal - but is better than nothing */ - register cx = curx, cy = cury; + else { /* no-CE fix - free after Harold Rynes */ + /* + * this looks terrible, especially on a slow terminal but is + * better than nothing + */ + int cx = curx, cy = cury; - while(curx < COLNO) { + while (curx < COLNO) { xputc(' '); curx++; } @@ -199,74 +219,94 @@ cl_end() { } } -clear_screen() { +void +clear_screen() +{ xputs(CL); curx = cury = 1; } +void home() { - if(HO) + if (HO) xputs(HO); - else if(CM) + else if (CM) xputs(tgoto(CM, 0, 0)); else curs(1, 1); /* using UP ... */ curx = cury = 1; } +void standoutbeg() { - if(SO) xputs(SO); + if (SO) + xputs(SO); } +void standoutend() { - if(SE) xputs(SE); + if (SE) + xputs(SE); } +void backsp() { xputs(BC); curx--; } +void bell() { - (void) putchar('\007'); /* curx does not change */ + (void) putchar('\007'); /* curx does not change */ (void) fflush(stdout); } -delay_output() { +void +delay_output() +{ + extern speed_t ospeed; /* delay 50 ms - could also use a 'nap'-system call */ - /* BUG: if the padding character is visible, as it is on the 5620 - then this looks terrible. */ - if(!flags.nonull) + /* + * BUG: if the padding character is visible, as it is on the 5620 + * then this looks terrible. + */ + if (!flags.nonull) tputs("50", 1, xputc); - /* cbosgd!cbcephus!pds for SYS V R2 */ - /* is this terminfo, or what? */ - /* tputs("$<50>", 1, xputc); */ + /* cbosgd!cbcephus!pds for SYS V R2 */ + /* is this terminfo, or what? */ + /* tputs("$<50>", 1, xputc); */ - else if(ospeed > 0) if(CM) { - /* delay by sending cm(here) an appropriate number of times */ - register int cmlen = strlen(tgoto(CM, curx-1, cury-1)); - register int i = (ospeed + (100 * cmlen)) / (200 * cmlen); + else if (ospeed > 0) + if (CM) { + /* + * delay by sending cm(here) an appropriate number of + * times + */ + int cmlen = strlen(tgoto(CM, curx - 1, cury - 1)); + int i = (ospeed + (100 * cmlen)) / (200 * cmlen); - while(i > 0) { - cmov(curx, cury); + while (i > 0) { + cmov(curx, cury); + } } - } } -cl_eos() /* free after Robert Viduya */ -{ /* must only be called with curx = 1 */ +void +cl_eos() +{ /* free after Robert Viduya *//* must only be + * called with curx = 1 */ - if(CD) + if (CD) xputs(CD); else { - register int cx = curx, cy = cury; - while(cury <= LI-2) { + int cx = curx, cy = cury; + while (cury <= LI - 2) { cl_end(); xputc('\n'); curx = 1; |
