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

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
        !             2: /* hack.topl.c - version 1.0.2 */
        !             3: 
        !             4: #include "hack.h"
        !             5: #include <stdio.h>
        !             6: extern char *eos();
        !             7: extern int CO;
        !             8: 
        !             9: char toplines[BUFSZ];
        !            10: xchar tlx, tly;                        /* set by pline; used by addtopl */
        !            11: 
        !            12: struct topl {
        !            13:        struct topl *next_topl;
        !            14:        char *topl_text;
        !            15: } *old_toplines, *last_redone_topl;
        !            16: #define        OTLMAX  20              /* max nr of old toplines remembered */
        !            17: 
        !            18: doredotopl(){
        !            19:        if(last_redone_topl)
        !            20:                last_redone_topl = last_redone_topl->next_topl;
        !            21:        if(!last_redone_topl)
        !            22:                last_redone_topl = old_toplines;
        !            23:        if(last_redone_topl){
        !            24:                (void) strcpy(toplines, last_redone_topl->topl_text);
        !            25:        }
        !            26:        redotoplin();
        !            27:        return(0);
        !            28: }
        !            29: 
        !            30: redotoplin() {
        !            31:        home();
        !            32:        if(index(toplines, '\n')) cl_end();
        !            33:        putstr(toplines);
        !            34:        cl_end();
        !            35:        tlx = curx;
        !            36:        tly = cury;
        !            37:        flags.toplin = 1;
        !            38:        if(tly > 1)
        !            39:                more();
        !            40: }
        !            41: 
        !            42: remember_topl() {
        !            43: register struct topl *tl;
        !            44: register int cnt = OTLMAX;
        !            45:        if(last_redone_topl &&
        !            46:           !strcmp(toplines, last_redone_topl->topl_text)) return;
        !            47:        if(old_toplines &&
        !            48:           !strcmp(toplines, old_toplines->topl_text)) return;
        !            49:        last_redone_topl = 0;
        !            50:        tl = (struct topl *)
        !            51:                alloc((unsigned)(strlen(toplines) + sizeof(struct topl) + 1));
        !            52:        tl->next_topl = old_toplines;
        !            53:        tl->topl_text = (char *)(tl + 1);
        !            54:        (void) strcpy(tl->topl_text, toplines);
        !            55:        old_toplines = tl;
        !            56:        while(cnt && tl){
        !            57:                cnt--;
        !            58:                tl = tl->next_topl;
        !            59:        }
        !            60:        if(tl && tl->next_topl){
        !            61:                free((char *) tl->next_topl);
        !            62:                tl->next_topl = 0;
        !            63:        }
        !            64: }
        !            65: 
        !            66: addtopl(s) char *s; {
        !            67:        curs(tlx,tly);
        !            68:        if(tlx + strlen(s) > CO) putsym('\n');
        !            69:        putstr(s);
        !            70:        tlx = curx;
        !            71:        tly = cury;
        !            72:        flags.toplin = 1;
        !            73: }
        !            74: 
        !            75: xmore(s)
        !            76: char *s;       /* allowed chars besides space/return */
        !            77: {
        !            78:        if(flags.toplin) {
        !            79:                curs(tlx, tly);
        !            80:                if(tlx + 8 > CO) putsym('\n'), tly++;
        !            81:        }
        !            82: 
        !            83:        if(flags.standout)
        !            84:                standoutbeg();
        !            85:        putstr("--More--");
        !            86:        if(flags.standout)
        !            87:                standoutend();
        !            88: 
        !            89:        xwaitforspace(s);
        !            90:        if(flags.toplin && tly > 1) {
        !            91:                home();
        !            92:                cl_end();
        !            93:                docorner(1, tly-1);
        !            94:        }
        !            95:        flags.toplin = 0;
        !            96: }
        !            97: 
        !            98: more(){
        !            99:        xmore("");
        !           100: }
        !           101: 
        !           102: cmore(s)
        !           103: register char *s;
        !           104: {
        !           105:        xmore(s);
        !           106: }
        !           107: 
        !           108: clrlin(){
        !           109:        if(flags.toplin) {
        !           110:                home();
        !           111:                cl_end();
        !           112:                if(tly > 1) docorner(1, tly-1);
        !           113:                remember_topl();
        !           114:        }
        !           115:        flags.toplin = 0;
        !           116: }
        !           117: 
        !           118: /*VARARGS1*/
        !           119: pline(line,arg1,arg2,arg3,arg4,arg5,arg6)
        !           120: register char *line,*arg1,*arg2,*arg3,*arg4,*arg5,*arg6;
        !           121: {
        !           122:        char pbuf[BUFSZ];
        !           123:        register char *bp = pbuf, *tl;
        !           124:        register int n,n0;
        !           125: 
        !           126:        if(!line || !*line) return;
        !           127:        if(!index(line, '%')) (void) strcpy(pbuf,line); else
        !           128:        (void) sprintf(pbuf,line,arg1,arg2,arg3,arg4,arg5,arg6);
        !           129:        if(flags.toplin == 1 && !strcmp(pbuf, toplines)) return;
        !           130:        nscr();         /* %% */
        !           131: 
        !           132:        /* If there is room on the line, print message on same line */
        !           133:        /* But messages like "You die..." deserve their own line */
        !           134:        n0 = strlen(bp);
        !           135:        if(flags.toplin == 1 && tly == 1 &&
        !           136:            n0 + strlen(toplines) + 3 < CO-8 &&  /* leave room for --More-- */
        !           137:            strncmp(bp, "You ", 4)) {
        !           138:                (void) strcat(toplines, "  ");
        !           139:                (void) strcat(toplines, bp);
        !           140:                tlx += 2;
        !           141:                addtopl(bp);
        !           142:                return;
        !           143:        }
        !           144:        if(flags.toplin == 1) more();
        !           145:        remember_topl();
        !           146:        toplines[0] = 0;
        !           147:        while(n0){
        !           148:                if(n0 >= CO){
        !           149:                        /* look for appropriate cut point */
        !           150:                        n0 = 0;
        !           151:                        for(n = 0; n < CO; n++) if(bp[n] == ' ')
        !           152:                                n0 = n;
        !           153:                        if(!n0) for(n = 0; n < CO-1; n++)
        !           154:                                if(!letter(bp[n])) n0 = n;
        !           155:                        if(!n0) n0 = CO-2;
        !           156:                }
        !           157:                (void) strncpy((tl = eos(toplines)), bp, n0);
        !           158:                tl[n0] = 0;
        !           159:                bp += n0;
        !           160: 
        !           161:                /* remove trailing spaces, but leave one */
        !           162:                while(n0 > 1 && tl[n0-1] == ' ' && tl[n0-2] == ' ')
        !           163:                        tl[--n0] = 0;
        !           164: 
        !           165:                n0 = strlen(bp);
        !           166:                if(n0 && tl[0]) (void) strcat(tl, "\n");
        !           167:        }
        !           168:        redotoplin();
        !           169: }
        !           170: 
        !           171: putsym(c) char c; {
        !           172:        switch(c) {
        !           173:        case '\b':
        !           174:                backsp();
        !           175:                return;
        !           176:        case '\n':
        !           177:                curx = 1;
        !           178:                cury++;
        !           179:                if(cury > tly) tly = cury;
        !           180:                break;
        !           181:        default:
        !           182:                if(curx == CO)
        !           183:                        putsym('\n');   /* 1 <= curx <= CO; avoid CO */
        !           184:                else
        !           185:                        curx++;
        !           186:        }
        !           187:        (void) putchar(c);
        !           188: }
        !           189: 
        !           190: putstr(s) register char *s; {
        !           191:        while(*s) putsym(*s++);
        !           192: }

unix.superglobalmegacorp.com

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