]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - hack/hack.termcap.c
Generate <>& symbolically. I'm avoiding .../dist/... directories for now.
[bsdgames-darwin.git] / hack / hack.termcap.c
index e94d6729c17b5775c912fc3152684ca64dbc5c06..c9ccb9e18dbfe661aa189a798bdd835224d5a6a6 100644 (file)
@@ -1,88 +1,95 @@
-/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
-/* hack.termcap.c - version 1.0.3 */
+/*     $NetBSD: hack.termcap.c,v 1.11 2001/11/02 18:27:00 christos Exp $       */
 
-#include <stdio.h>
-#include "config.h"    /* for ROWNO and COLNO */
-#include "def.flag.h"  /* for flags.nonull */
-extern char *tgetstr(), *tgoto(), *getenv();
-extern long *alloc();
+/*
+ * Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.
+ */
 
+#include <sys/cdefs.h>
 #ifndef lint
-extern                 /* it is defined in libtermlib (libtermcap) */
-#endif lint
-       short 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 */
+__RCSID("$NetBSD: hack.termcap.c,v 1.11 2001/11/02 18:27:00 christos 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 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 */
+
+void
 startup()
 {
-       register char *term;
-       register char *tptr;
-       char *tbufptr, *pc;
-
-       tptr = (char *) alloc(1024);
+       char           *term;
+       char           *pc;
 
-       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 (t_getent(&info, term) < 1)
                error("Unknown terminal type: %s.", term);
-       if(pc = tgetstr("pc", &tbufptr))
+       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");
-       if(CO < COLNO || LI < ROWNO+2)
+       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);
-       /* 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)
+       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 = 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 */
-       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");
-       free(tptr);
+       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 = t_agetstr(info, "cd");
+       set_whole_screen();     /* uses LI and CD */
 }
 
+void
 start_screen()
 {
        xputs(TI);
        xputs(VS);
 }
 
+void
 end_screen()
 {
        xputs(VE);
@@ -90,55 +97,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++;
@@ -146,12 +154,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);
@@ -160,31 +170,46 @@ nocmov(x, y)
        }
 }
 
+void
 cmov(x, y)
-register 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;
+       }
 }
 
-xputc(c) char c; {
-       (void) fputc(c, stdout);
+int
+xputc(c)
+       char            c;
+{
+       return (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++;
                }
@@ -192,79 +217,74 @@ cl_end() {
        }
 }
 
-clear_screen() {
+void
+clear_screen()
+{
        xputs(CL);
        curx = cury = 1;
 }
 
+void
 home()
 {
-       if(HO)
+       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()
 {
-       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);
 }
 
-static short tmspc10[] = {             /* from termcap */
-       0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5
-};
-
-delay_output() {
+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 || ospeed < SIZE(tmspc10)) 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 = 500 + tmspc10[ospeed]/2;
-
-               while(i > 0) {
-                       cmov(curx, cury);
-                       i -= cmlen*tmspc10[ospeed];
-               }
-       }
+         /* or the usleep call like this :-) */
+       usleep(50000);
 }
 
-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;