diff options
author | blymn <blymn@NetBSD.org> | 2000-05-20 14:01:42 +0000 |
---|---|---|
committer | blymn <blymn@NetBSD.org> | 2000-05-20 14:01:42 +0000 |
commit | 72c340b256dc83ba3536b8ba39d22f7890312221 (patch) | |
tree | b430db7f528cab23e9246763f415929b3bac46a2 /hack | |
parent | 83dc0c19a174eb8e20c92246e5db40a67316ea17 (diff) | |
download | bsdgames-darwin-72c340b256dc83ba3536b8ba39d22f7890312221.tar.gz bsdgames-darwin-72c340b256dc83ba3536b8ba39d22f7890312221.tar.zst bsdgames-darwin-72c340b256dc83ba3536b8ba39d22f7890312221.zip |
* Fix termcap handling to use the new interface to avoid buffer
overflows with extended termcap entries.
* Made delay_output use usleep instead of the grungy tgoto hack it had.
Diffstat (limited to 'hack')
-rw-r--r-- | hack/hack.termcap.c | 105 |
1 files changed, 43 insertions, 62 deletions
diff --git a/hack/hack.termcap.c b/hack/hack.termcap.c index 2d48698d..09782246 100644 --- a/hack/hack.termcap.c +++ b/hack/hack.termcap.c @@ -1,4 +1,4 @@ -/* $NetBSD: hack.termcap.c,v 1.9 1999/10/04 23:27:01 lukem Exp $ */ +/* $NetBSD: hack.termcap.c,v 1.10 2000/05/20 14:01:42 blymn Exp $ */ /* * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. @@ -6,22 +6,25 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: hack.termcap.c,v 1.9 1999/10/04 23:27:01 lukem Exp $"); +__RCSID("$NetBSD: hack.termcap.c,v 1.10 2000/05/20 14:01:42 blymn Exp $"); #endif /* not lint */ #include <string.h> #include <termios.h> #include <termcap.h> #include <stdlib.h> +#include <unistd.h> #include "hack.h" #include "extern.h" #include "def.flag.h" /* for flags.nonull */ -static char tbuf[512]; +static char *tbuf; +static struct tinfo *info; 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'; +static char BC_char = '\b'; /* if bc is not set use this */ char *CD; /* tested in pri.c: docorner() */ int CO, LI; /* used in pri.c and whatis.c */ @@ -29,63 +32,56 @@ void startup() { char *term; - char *tptr; char *tbufptr, *pc; - tptr = (char *) alloc(1024); - - tbufptr = tbuf; - if (!(term = getenv("TERM"))) + tbuf = NULL; + + if (!(term = getenv("TERM"))) error("Can't get TERM."); if (!strncmp(term, "5620", 4)) flags.nonull = 1; /* this should be a termcap flag */ - if (tgetent(tptr, term) < 1) + if (t_getent(&info, term) < 1) error("Unknown terminal type: %s.", term); - if ((pc = tgetstr("pc", &tbufptr)) != NULL) + if ((pc = t_agetstr(info, "pc", &tbuf, &tbufptr)) != NULL) PC = *pc; - if (!(BC = tgetstr("bc", &tbufptr))) { - if (!tgetflag("bs")) + if (!(BC = t_agetstr(info, "bc", &tbuf, &tbufptr))) { + if (!t_getflag(info, "bs")) error("Terminal must backspace."); - BC = tbufptr; - tbufptr += 2; - *BC = '\b'; + BC = &BC_char; } - HO = tgetstr("ho", &tbufptr); - CO = tgetnum("co"); - LI = tgetnum("li"); + HO = t_agetstr(info, "ho", &tbuf, &tbufptr); + CO = t_getnum(info, "co"); + LI = t_getnum(info, "li"); if (CO < COLNO || LI < ROWNO + 2) setclipped(); - if (!(CL = tgetstr("cl", &tbufptr))) + if (!(CL = t_agetstr(info, "cl", &tbuf, &tbufptr))) error("Hack needs CL."); - ND = tgetstr("nd", &tbufptr); - if (tgetflag("os")) + ND = t_agetstr(info, "nd", &tbuf, &tbufptr); + if (t_getflag(info, "os")) error("Hack can't have OS."); - CE = tgetstr("ce", &tbufptr); - UP = tgetstr("up", &tbufptr); + CE = t_agetstr(info, "ce", &tbuf, &tbufptr); + UP = t_agetstr(info, "up", &tbuf, &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. */ - XD = tgetstr("xd", &tbufptr); - /* not: XD = tgetstr("do", &tbufptr); */ - if (!(CM = tgetstr("cm", &tbufptr))) { + XD = t_agetstr(info, "xd", &tbuf, &tbufptr); + /* not: XD = t_agetstr(info, "do", &tbuf, &tbufptr); */ + if (!(CM = t_agetstr(info, "cm", &tbuf, &tbufptr))) { if (!UP && !HO) error("Hack needs CM or UP or HO."); printf("Playing hack on terminals without cm is suspect...\n"); getret(); } - SO = tgetstr("so", &tbufptr); - SE = tgetstr("se", &tbufptr); - SG = tgetnum("sg"); /* -1: not fnd; else # of spaces left by so */ + SO = t_agetstr(info, "so", &tbuf, &tbufptr); + SE = t_agetstr(info, "se", &tbuf, &tbufptr); + SG = t_getnum(info, "sg"); /* -1: not fnd; else # of spaces left by so */ if (!SO || !SE || (SG > 0)) SO = SE = 0; - CD = tgetstr("cd", &tbufptr); + CD = t_agetstr(info, "cd", &tbuf, &tbufptr); set_whole_screen(); /* uses LI and CD */ - if (tbufptr - tbuf > sizeof(tbuf)) - error("TERMCAP entry too big...\n"); - free(tptr); } void @@ -180,9 +176,13 @@ void cmov(x, y) int x, y; { - xputs(tgoto(CM, x - 1, y - 1)); - cury = y; - curx = x; + char buf[256]; + + if (t_goto(info, CM, x - 1, y - 1, buf, 255) >= 0) { + xputs(buf); + cury = y; + curx = x; + } } int @@ -229,10 +229,12 @@ clear_screen() void home() { + char buf[256]; + if (HO) xputs(HO); - else if (CM) - xputs(tgoto(CM, 0, 0)); + else if ((CM) && (t_goto(info, CM, 0, 0, buf, 255) >= 0)) + xputs(buf); else curs(1, 1); /* using UP ... */ curx = cury = 1; @@ -269,31 +271,10 @@ bell() void delay_output() { + /* 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) - 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 - */ - int cmlen = strlen(tgoto(CM, curx - 1, cury - 1)); - int i = (ospeed + (100 * cmlen)) / (200 * cmlen); - - while (i > 0) { - cmov(curx, cury); - } - } + /* or the usleep call like this :-) */ + usleep(50000); } void |