]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - hack/hack.termcap.c
ANSIfy function definitions.
[bsdgames-darwin.git] / hack / hack.termcap.c
index 2d48698d82c60a4af853444454a2d28fb65153f0..6e7e9662f7d3cacf7a6bb214a5804b58a92174f5 100644 (file)
-/*     $NetBSD: hack.termcap.c,v 1.9 1999/10/04 23:27:01 lukem Exp $   */
+/*     $NetBSD: hack.termcap.c,v 1.18 2009/08/12 07:28:41 dholland 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.18 2009/08/12 07:28:41 dholland 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    *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE;
-static char    *VS, *VE;
+static struct tinfo *info;
+static const char    *HO, *CL, *CE, *CM, *ND, *XD, *BC_BS, *SO, *SE, *TI, *TE;
+static const 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 void nocmov(int, int);
+static void cmov(int, int);
+static int xputc(int);
+static void xputs(const char *);
+
 void
-startup()
+startup(void)
 {
        char           *term;
-       char           *tptr;
-       char           *tbufptr, *pc;
-
-       tptr = (char *) alloc(1024);
-
-       tbufptr = tbuf;
-       if (!(term = getenv("TERM")))
+       
+       /* UP, BC, PC already set */
+       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)
-               PC = *pc;
-       if (!(BC = tgetstr("bc", &tbufptr))) {
-               if (!tgetflag("bs"))
+       BC_BS = t_agetstr(info, "bc");
+       if (!BC_BS) {
+               if (!t_getflag(info, "bs"))
                        error("Terminal must backspace.");
-               BC = tbufptr;
-               tbufptr += 2;
-               *BC = '\b';
+               BC_BS = "\b";
        }
-       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");
        /*
         * 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
-start_screen()
+start_screen(void)
 {
        xputs(TI);
        xputs(VS);
 }
 
 void
-end_screen()
+end_screen(void)
 {
        xputs(VE);
        xputs(TE);
 }
 
-/* Cursor movements */
+/*
+ * Cursor movements
+ *
+ * x,y not xchar: perhaps xchar is unsigned and
+ * curx-x would be unsigned as well
+ */
 void
-curs(x, y)
-       int             x, y;   /* not xchar: perhaps xchar is unsigned and
-                                * curx-x would be unsigned as well */
+curs(int x, int y)
 {
 
        if (y == cury && x == curx)
@@ -127,9 +181,8 @@ curs(x, y)
                cmov(x, y);
 }
 
-void
-nocmov(x, y)
-       int x, y;
+static void
+nocmov(int x, int y)
 {
        if (cury > y) {
                if (UP) {
@@ -170,37 +223,38 @@ nocmov(x, y)
                        }
        } else if (curx > x) {
                while (curx > x) {      /* Go to the left. */
-                       xputs(BC);
+                       xputs(BC_BS);
                        curx--;
                }
        }
 }
 
-void
-cmov(x, y)
-       int x, y;
+static void
+cmov(int x, int 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
-xputc(c)
-       char            c;
+static int
+xputc(int c)
 {
        return (fputc(c, stdout));
 }
 
-void
-xputs(s)
-       char           *s;
+static void
+xputs(const char *s)
 {
        tputs(s, 1, xputc);
 }
 
 void
-cl_end()
+cl_end(void)
 {
        if (CE)
                xputs(CE);
@@ -220,84 +274,65 @@ cl_end()
 }
 
 void
-clear_screen()
+clear_screen(void)
 {
        xputs(CL);
        curx = cury = 1;
 }
 
 void
-home()
+home(void)
 {
+       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
-standoutbeg()
+standoutbeg(void)
 {
        if (SO)
                xputs(SO);
 }
 
 void
-standoutend()
+standoutend(void)
 {
        if (SE)
                xputs(SE);
 }
 
 void
-backsp()
+backsp(void)
 {
-       xputs(BC);
+       xputs(BC_BS);
        curx--;
 }
 
 void
-bell()
+bell(void)
 {
        (void) putchar('\007'); /* curx does not change */
        (void) fflush(stdout);
 }
 
 void
-delay_output()
+delay_output(void)
 {
+       
        /* 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
-cl_eos()
+cl_eos(void)
 {                              /* free after Robert Viduya *//* must only be
                                 * called with curx = 1 */