Annotation of 43BSDReno/games/hack/hack.termcap.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.termcap.c - version 1.0.3 */
        !             3: 
        !             4: #include <stdio.h>
        !             5: #include "config.h"    /* for ROWNO and COLNO */
        !             6: #include "def.flag.h"  /* for flags.nonull */
        !             7: extern char *tgetstr(), *tgoto(), *getenv();
        !             8: extern long *alloc();
        !             9: 
        !            10: #ifndef lint
        !            11: extern                 /* it is defined in libtermlib (libtermcap) */
        !            12: #endif lint
        !            13:        short ospeed;           /* terminal baudrate; used by tputs */
        !            14: static char tbuf[512];
        !            15: static char *HO, *CL, *CE, *UP, *CM, *ND, *XD, *BC, *SO, *SE, *TI, *TE;
        !            16: static char *VS, *VE;
        !            17: static int SG;
        !            18: static char PC = '\0';
        !            19: char *CD;              /* tested in pri.c: docorner() */
        !            20: int CO, LI;            /* used in pri.c and whatis.c */
        !            21: 
        !            22: startup()
        !            23: {
        !            24:        register char *term;
        !            25:        register char *tptr;
        !            26:        char *tbufptr, *pc;
        !            27: 
        !            28:        tptr = (char *) alloc(1024);
        !            29: 
        !            30:        tbufptr = tbuf;
        !            31:        if(!(term = getenv("TERM")))
        !            32:                error("Can't get TERM.");
        !            33:        if(!strncmp(term, "5620", 4))
        !            34:                flags.nonull = 1;       /* this should be a termcap flag */
        !            35:        if(tgetent(tptr, term) < 1)
        !            36:                error("Unknown terminal type: %s.", term);
        !            37:        if(pc = tgetstr("pc", &tbufptr))
        !            38:                PC = *pc;
        !            39:        if(!(BC = tgetstr("bc", &tbufptr))) {   
        !            40:                if(!tgetflag("bs"))
        !            41:                        error("Terminal must backspace.");
        !            42:                BC = tbufptr;
        !            43:                tbufptr += 2;
        !            44:                *BC = '\b';
        !            45:        }
        !            46:        HO = tgetstr("ho", &tbufptr);
        !            47:        CO = tgetnum("co");
        !            48:        LI = tgetnum("li");
        !            49:        if(CO < COLNO || LI < ROWNO+2)
        !            50:                setclipped();
        !            51:        if(!(CL = tgetstr("cl", &tbufptr)))
        !            52:                error("Hack needs CL.");
        !            53:        ND = tgetstr("nd", &tbufptr);
        !            54:        if(tgetflag("os"))
        !            55:                error("Hack can't have OS.");
        !            56:        CE = tgetstr("ce", &tbufptr);
        !            57:        UP = tgetstr("up", &tbufptr);
        !            58:        /* It seems that xd is no longer supported, and we should use
        !            59:           a linefeed instead; unfortunately this requires resetting
        !            60:           CRMOD, and many output routines will have to be modified
        !            61:           slightly. Let's leave that till the next release. */
        !            62:        XD = tgetstr("xd", &tbufptr);
        !            63: /* not:                XD = tgetstr("do", &tbufptr); */
        !            64:        if(!(CM = tgetstr("cm", &tbufptr))) {
        !            65:                if(!UP && !HO)
        !            66:                        error("Hack needs CM or UP or HO.");
        !            67:                printf("Playing hack on terminals without cm is suspect...\n");
        !            68:                getret();
        !            69:        }
        !            70:        SO = tgetstr("so", &tbufptr);
        !            71:        SE = tgetstr("se", &tbufptr);
        !            72:        SG = tgetnum("sg");     /* -1: not fnd; else # of spaces left by so */
        !            73:        if(!SO || !SE || (SG > 0)) SO = SE = 0;
        !            74:        CD = tgetstr("cd", &tbufptr);
        !            75:        set_whole_screen();             /* uses LI and CD */
        !            76:        if(tbufptr-tbuf > sizeof(tbuf)) error("TERMCAP entry too big...\n");
        !            77:        free(tptr);
        !            78: }
        !            79: 
        !            80: start_screen()
        !            81: {
        !            82:        xputs(TI);
        !            83:        xputs(VS);
        !            84: }
        !            85: 
        !            86: end_screen()
        !            87: {
        !            88:        xputs(VE);
        !            89:        xputs(TE);
        !            90: }
        !            91: 
        !            92: /* Cursor movements */
        !            93: extern xchar curx, cury;
        !            94: 
        !            95: curs(x, y)
        !            96: register int x, y;     /* not xchar: perhaps xchar is unsigned and
        !            97:                           curx-x would be unsigned as well */
        !            98: {
        !            99: 
        !           100:        if (y == cury && x == curx)
        !           101:                return;
        !           102:        if(!ND && (curx != x || x <= 3)) {      /* Extremely primitive */
        !           103:                cmov(x, y);                     /* bunker!wtm */
        !           104:                return;
        !           105:        }
        !           106:        if(abs(cury-y) <= 3 && abs(curx-x) <= 3)
        !           107:                nocmov(x, y);
        !           108:        else if((x <= 3 && abs(cury-y)<= 3) || (!CM && x<abs(curx-x))) {
        !           109:                (void) putchar('\r');
        !           110:                curx = 1;
        !           111:                nocmov(x, y);
        !           112:        } else if(!CM) {
        !           113:                nocmov(x, y);
        !           114:        } else
        !           115:                cmov(x, y);
        !           116: }
        !           117: 
        !           118: nocmov(x, y)
        !           119: {
        !           120:        if (cury > y) {
        !           121:                if(UP) {
        !           122:                        while (cury > y) {      /* Go up. */
        !           123:                                xputs(UP);
        !           124:                                cury--;
        !           125:                        }
        !           126:                } else if(CM) {
        !           127:                        cmov(x, y);
        !           128:                } else if(HO) {
        !           129:                        home();
        !           130:                        curs(x, y);
        !           131:                } /* else impossible("..."); */
        !           132:        } else if (cury < y) {
        !           133:                if(XD) {
        !           134:                        while(cury < y) {
        !           135:                                xputs(XD);
        !           136:                                cury++;
        !           137:                        }
        !           138:                } else if(CM) {
        !           139:                        cmov(x, y);
        !           140:                } else {
        !           141:                        while(cury < y) {
        !           142:                                xputc('\n');
        !           143:                                curx = 1;
        !           144:                                cury++;
        !           145:                        }
        !           146:                }
        !           147:        }
        !           148:        if (curx < x) {         /* Go to the right. */
        !           149:                if(!ND) cmov(x, y); else        /* bah */
        !           150:                        /* should instead print what is there already */
        !           151:                while (curx < x) {
        !           152:                        xputs(ND);
        !           153:                        curx++;
        !           154:                }
        !           155:        } else if (curx > x) {
        !           156:                while (curx > x) {      /* Go to the left. */
        !           157:                        xputs(BC);
        !           158:                        curx--;
        !           159:                }
        !           160:        }
        !           161: }
        !           162: 
        !           163: cmov(x, y)
        !           164: register x, y;
        !           165: {
        !           166:        xputs(tgoto(CM, x-1, y-1));
        !           167:        cury = y;
        !           168:        curx = x;
        !           169: }
        !           170: 
        !           171: xputc(c) char c; {
        !           172:        (void) fputc(c, stdout);
        !           173: }
        !           174: 
        !           175: xputs(s) char *s; {
        !           176:        tputs(s, 1, xputc);
        !           177: }
        !           178: 
        !           179: cl_end() {
        !           180:        if(CE)
        !           181:                xputs(CE);
        !           182:        else {  /* no-CE fix - free after Harold Rynes */
        !           183:                /* this looks terrible, especially on a slow terminal
        !           184:                   but is better than nothing */
        !           185:                register cx = curx, cy = cury;
        !           186: 
        !           187:                while(curx < COLNO) {
        !           188:                        xputc(' ');
        !           189:                        curx++;
        !           190:                }
        !           191:                curs(cx, cy);
        !           192:        }
        !           193: }
        !           194: 
        !           195: clear_screen() {
        !           196:        xputs(CL);
        !           197:        curx = cury = 1;
        !           198: }
        !           199: 
        !           200: home()
        !           201: {
        !           202:        if(HO)
        !           203:                xputs(HO);
        !           204:        else if(CM)
        !           205:                xputs(tgoto(CM, 0, 0));
        !           206:        else
        !           207:                curs(1, 1);     /* using UP ... */
        !           208:        curx = cury = 1;
        !           209: }
        !           210: 
        !           211: standoutbeg()
        !           212: {
        !           213:        if(SO) xputs(SO);
        !           214: }
        !           215: 
        !           216: standoutend()
        !           217: {
        !           218:        if(SE) xputs(SE);
        !           219: }
        !           220: 
        !           221: backsp()
        !           222: {
        !           223:        xputs(BC);
        !           224:        curx--;
        !           225: }
        !           226: 
        !           227: bell()
        !           228: {
        !           229:        (void) putchar('\007');         /* curx does not change */
        !           230:        (void) fflush(stdout);
        !           231: }
        !           232: 
        !           233: static short tmspc10[] = {             /* from termcap */
        !           234:        0, 2000, 1333, 909, 743, 666, 500, 333, 166, 83, 55, 41, 20, 10, 5
        !           235: };
        !           236: 
        !           237: delay_output() {
        !           238:        /* delay 50 ms - could also use a 'nap'-system call */
        !           239:        /* BUG: if the padding character is visible, as it is on the 5620
        !           240:           then this looks terrible. */
        !           241:        if(!flags.nonull)
        !           242:                tputs("50", 1, xputc);
        !           243: 
        !           244:                /* cbosgd!cbcephus!pds for SYS V R2 */
        !           245:                /* is this terminfo, or what? */
        !           246:                /* tputs("$<50>", 1, xputc); */
        !           247: 
        !           248:        else if(ospeed > 0 || ospeed < SIZE(tmspc10)) if(CM) {
        !           249:                /* delay by sending cm(here) an appropriate number of times */
        !           250:                register int cmlen = strlen(tgoto(CM, curx-1, cury-1));
        !           251:                register int i = 500 + tmspc10[ospeed]/2;
        !           252: 
        !           253:                while(i > 0) {
        !           254:                        cmov(curx, cury);
        !           255:                        i -= cmlen*tmspc10[ospeed];
        !           256:                }
        !           257:        }
        !           258: }
        !           259: 
        !           260: cl_eos()                       /* free after Robert Viduya */
        !           261: {                              /* must only be called with curx = 1 */
        !           262: 
        !           263:        if(CD)
        !           264:                xputs(CD);
        !           265:        else {
        !           266:                register int cx = curx, cy = cury;
        !           267:                while(cury <= LI-2) {
        !           268:                        cl_end();
        !           269:                        xputc('\n');
        !           270:                        curx = 1;
        !           271:                        cury++;
        !           272:                }
        !           273:                cl_end();
        !           274:                curs(cx, cy);
        !           275:        }
        !           276: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.