-/* $NetBSD: hack.termcap.c,v 1.9 1999/10/04 23:27:01 lukem Exp $ */
+/* $NetBSD: hack.termcap.c,v 1.12 2003/04/02 18:36:40 jsm Exp $ */
/*
- * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
+ * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
+ * Amsterdam
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * - Neither the name of the Stichting Centrum voor Wiskunde en
+ * Informatica, nor the names of its contributors may be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+ * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#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.12 2003/04/02 18:36:40 jsm 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 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 */
startup()
{
char *term;
- char *tptr;
- char *tbufptr, *pc;
-
- tptr = (char *) alloc(1024);
+ char *pc;
- tbufptr = tbuf;
- if (!(term = getenv("TERM")))
+
+ 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")) != NULL)
PC = *pc;
- if (!(BC = tgetstr("bc", &tbufptr))) {
- if (!tgetflag("bs"))
+ if (!(BC = t_agetstr(info, "bc"))) {
+ 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");
+ 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")))
error("Hack needs CL.");
- ND = tgetstr("nd", &tbufptr);
- if (tgetflag("os"))
+ ND = t_agetstr(info, "nd");
+ if (t_getflag(info, "os"))
error("Hack can't have OS.");
- CE = tgetstr("ce", &tbufptr);
- UP = tgetstr("up", &tbufptr);
+ CE = t_agetstr(info, "ce");
+ UP = t_agetstr(info, "up");
/*
* 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");
+ /* not: XD = t_agetstr(info, "do"); */
+ if (!(CM = t_agetstr(info, "cm"))) {
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");
+ SE = t_agetstr(info, "se");
+ 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");
set_whole_screen(); /* uses LI and CD */
- if (tbufptr - tbuf > sizeof(tbuf))
- error("TERMCAP entry too big...\n");
- free(tptr);
}
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
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;
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