Annotation of 43BSDReno/games/hack/hack.tty.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 1988 Regents of the University of California.
                      3:  * All rights reserved.
                      4:  *
                      5:  * Redistribution and use in source and binary forms are permitted
                      6:  * provided that the above copyright notice and this paragraph are
                      7:  * duplicated in all such forms and that any documentation,
                      8:  * advertising materials, and other materials related to such
                      9:  * distribution and use acknowledge that the software was developed
                     10:  * by the University of California, Berkeley.  The name of the
                     11:  * University may not be used to endorse or promote products derived
                     12:  * from this software without specific prior written permission.
                     13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
                     14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
                     15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
                     16:  */
                     17: 
                     18: #ifndef lint
                     19: static char sccsid[] = "@(#)hack.tty.c 5.2 (Berkeley) 7/22/88";
                     20: #endif /* not lint */
                     21: 
                     22: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                     23: /* hack.tty.c - version 1.0.3 */
                     24: /* With thanks to the people who sent code for SYSV - hpscdi!jon,
                     25:    arnold@ucsf-cgl, wcs@bo95b, cbcephus!pds and others. */
                     26: 
                     27: #include       "hack.h"
                     28: #include       <stdio.h>
                     29: 
                     30: /*
                     31:  * The distinctions here are not BSD - rest but rather USG - rest, as
                     32:  * BSD still has the old sgttyb structure, but SYSV has termio. Thus:
                     33:  */
                     34: #ifdef BSD
                     35: #define        V7
                     36: #else
                     37: #define USG
                     38: #endif BSD
                     39: 
                     40: /*
                     41:  * Some systems may have getchar() return EOF for various reasons, and
                     42:  * we should not quit before seeing at least NR_OF_EOFS consecutive EOFs.
                     43:  */
                     44: #ifndef BSD
                     45: #define        NR_OF_EOFS      20
                     46: #endif BSD
                     47: 
                     48: 
                     49: #ifdef USG
                     50: 
                     51: #include       <termio.h>
                     52: #define termstruct     termio
                     53: #define kill_sym       c_cc[VKILL]
                     54: #define erase_sym      c_cc[VERASE]
                     55: #define EXTABS         TAB3
                     56: #define tabflgs                c_oflag
                     57: #define echoflgs       c_lflag
                     58: #define cbrkflgs       c_lflag
                     59: #define CBRKMASK       ICANON
                     60: #define CBRKON         ! /* reverse condition */
                     61: #define OSPEED(x)      ((x).c_cflag & CBAUD)
                     62: #define GTTY(x)                (ioctl(0, TCGETA, x))
                     63: #define STTY(x)                (ioctl(0, TCSETA, x))   /* TCSETAF? TCSETAW? */
                     64: 
                     65: #else  /* V7 */
                     66: 
                     67: #include       <sgtty.h>
                     68: #define termstruct     sgttyb
                     69: #define        kill_sym        sg_kill
                     70: #define        erase_sym       sg_erase
                     71: #define EXTABS         XTABS
                     72: #define tabflgs                sg_flags
                     73: #define echoflgs       sg_flags
                     74: #define cbrkflgs       sg_flags
                     75: #define CBRKMASK       CBREAK
                     76: #define CBRKON         /* empty */
                     77: #define OSPEED(x)      (x).sg_ospeed
                     78: #define GTTY(x)                (gtty(0, x))
                     79: #define STTY(x)                (stty(0, x))
                     80: 
                     81: #endif USG
                     82: 
                     83: extern short ospeed;
                     84: static char erase_char, kill_char;
                     85: static boolean settty_needed = FALSE;
                     86: struct termstruct inittyb, curttyb;
                     87: 
                     88: /*
                     89:  * Get initial state of terminal, set ospeed (for termcap routines)
                     90:  * and switch off tab expansion if necessary.
                     91:  * Called by startup() in termcap.c and after returning from ! or ^Z
                     92:  */
                     93: gettty(){
                     94:        if(GTTY(&inittyb) < 0)
                     95:                perror("Hack (gettty)");
                     96:        curttyb = inittyb;
                     97:        ospeed = OSPEED(inittyb);
                     98:        erase_char = inittyb.erase_sym;
                     99:        kill_char = inittyb.kill_sym;
                    100:        getioctls();
                    101: 
                    102:        /* do not expand tabs - they might be needed inside a cm sequence */
                    103:        if(curttyb.tabflgs & EXTABS) {
                    104:                curttyb.tabflgs &= ~EXTABS;
                    105:                setctty();
                    106:        }
                    107:        settty_needed = TRUE;
                    108: }
                    109: 
                    110: /* reset terminal to original state */
                    111: settty(s) char *s; {
                    112:        clear_screen();
                    113:        end_screen();
                    114:        if(s) printf(s);
                    115:        (void) fflush(stdout);
                    116:        if(STTY(&inittyb) < 0)
                    117:                perror("Hack (settty)");
                    118:        flags.echo = (inittyb.echoflgs & ECHO) ? ON : OFF;
                    119:        flags.cbreak = (CBRKON(inittyb.cbrkflgs & CBRKMASK)) ? ON : OFF;
                    120:        setioctls();
                    121: }
                    122: 
                    123: setctty(){
                    124:        if(STTY(&curttyb) < 0)
                    125:                perror("Hack (setctty)");
                    126: }
                    127: 
                    128: 
                    129: setftty(){
                    130: register int ef = 0;                   /* desired value of flags & ECHO */
                    131: register int cf = CBRKON(CBRKMASK);    /* desired value of flags & CBREAK */
                    132: register int change = 0;
                    133:        flags.cbreak = ON;
                    134:        flags.echo = OFF;
                    135:        /* Should use (ECHO|CRMOD) here instead of ECHO */
                    136:        if((curttyb.echoflgs & ECHO) != ef){
                    137:                curttyb.echoflgs &= ~ECHO;
                    138: /*             curttyb.echoflgs |= ef;                                 */
                    139:                change++;
                    140:        }
                    141:        if((curttyb.cbrkflgs & CBRKMASK) != cf){
                    142:                curttyb.cbrkflgs &= ~CBRKMASK;
                    143:                curttyb.cbrkflgs |= cf;
                    144: #ifdef USG
                    145:                /* be satisfied with one character; no timeout */
                    146:                curttyb.c_cc[VMIN] = 1;         /* was VEOF */
                    147:                curttyb.c_cc[VTIME] = 0;        /* was VEOL */
                    148: #endif USG
                    149:                change++;
                    150:        }
                    151:        if(change){
                    152:                setctty();
                    153:        }
                    154:        start_screen();
                    155: }
                    156: 
                    157: 
                    158: /* fatal error */
                    159: /*VARARGS1*/
                    160: error(s,x,y) char *s; {
                    161:        if(settty_needed)
                    162:                settty((char *) 0);
                    163:        printf(s,x,y);
                    164:        putchar('\n');
                    165:        exit(1);
                    166: }
                    167: 
                    168: /*
                    169:  * Read a line closed with '\n' into the array char bufp[BUFSZ].
                    170:  * (The '\n' is not stored. The string is closed with a '\0'.)
                    171:  * Reading can be interrupted by an escape ('\033') - now the
                    172:  * resulting string is "\033".
                    173:  */
                    174: getlin(bufp)
                    175: register char *bufp;
                    176: {
                    177:        register char *obufp = bufp;
                    178:        register int c;
                    179: 
                    180:        flags.toplin = 2;               /* nonempty, no --More-- required */
                    181:        for(;;) {
                    182:                (void) fflush(stdout);
                    183:                if((c = getchar()) == EOF) {
                    184:                        *bufp = 0;
                    185:                        return;
                    186:                }
                    187:                if(c == '\033') {
                    188:                        *obufp = c;
                    189:                        obufp[1] = 0;
                    190:                        return;
                    191:                }
                    192:                if(c == erase_char || c == '\b') {
                    193:                        if(bufp != obufp) {
                    194:                                bufp--;
                    195:                                putstr("\b \b"); /* putsym converts \b */
                    196:                        } else  bell();
                    197:                } else if(c == '\n') {
                    198:                        *bufp = 0;
                    199:                        return;
                    200:                } else if(' ' <= c && c < '\177') {
                    201:                                /* avoid isprint() - some people don't have it
                    202:                                   ' ' is not always a printing char */
                    203:                        *bufp = c;
                    204:                        bufp[1] = 0;
                    205:                        putstr(bufp);
                    206:                        if(bufp-obufp < BUFSZ-1 && bufp-obufp < COLNO)
                    207:                                bufp++;
                    208:                } else if(c == kill_char || c == '\177') { /* Robert Viduya */
                    209:                                /* this test last - @ might be the kill_char */
                    210:                        while(bufp != obufp) {
                    211:                                bufp--;
                    212:                                putstr("\b \b");
                    213:                        }
                    214:                } else
                    215:                        bell();
                    216:        }
                    217: }
                    218: 
                    219: getret() {
                    220:        cgetret("");
                    221: }
                    222: 
                    223: cgetret(s)
                    224: register char *s;
                    225: {
                    226:        putsym('\n');
                    227:        if(flags.standout)
                    228:                standoutbeg();
                    229:        putstr("Hit ");
                    230:        putstr(flags.cbreak ? "space" : "return");
                    231:        putstr(" to continue: ");
                    232:        if(flags.standout)
                    233:                standoutend();
                    234:        xwaitforspace(s);
                    235: }
                    236: 
                    237: char morc;     /* tell the outside world what char he used */
                    238: 
                    239: xwaitforspace(s)
                    240: register char *s;      /* chars allowed besides space or return */
                    241: {
                    242: register int c;
                    243: 
                    244:        morc = 0;
                    245: 
                    246:        while((c = readchar()) != '\n') {
                    247:            if(flags.cbreak) {
                    248:                if(c == ' ') break;
                    249:                if(s && index(s,c)) {
                    250:                        morc = c;
                    251:                        break;
                    252:                }
                    253:                bell();
                    254:            }
                    255:        }
                    256: }
                    257: 
                    258: char *
                    259: parse()
                    260: {
                    261:        static char inputline[COLNO];
                    262:        register foo;
                    263: 
                    264:        flags.move = 1;
                    265:        if(!Invisible) curs_on_u(); else home();
                    266:        while((foo = readchar()) >= '0' && foo <= '9')
                    267:                multi = 10*multi+foo-'0';
                    268:        if(multi) {
                    269:                multi--;
                    270:                save_cm = inputline;
                    271:        }
                    272:        inputline[0] = foo;
                    273:        inputline[1] = 0;
                    274:        if(foo == 'f' || foo == 'F'){
                    275:                inputline[1] = getchar();
                    276: #ifdef QUEST
                    277:                if(inputline[1] == foo) inputline[2] = getchar(); else
                    278: #endif QUEST
                    279:                inputline[2] = 0;
                    280:        }
                    281:        if(foo == 'm' || foo == 'M'){
                    282:                inputline[1] = getchar();
                    283:                inputline[2] = 0;
                    284:        }
                    285:        clrlin();
                    286:        return(inputline);
                    287: }
                    288: 
                    289: char
                    290: readchar() {
                    291:        register int sym;
                    292: 
                    293:        (void) fflush(stdout);
                    294:        if((sym = getchar()) == EOF)
                    295: #ifdef NR_OF_EOFS
                    296:        { /*
                    297:           * Some SYSV systems seem to return EOFs for various reasons
                    298:           * (?like when one hits break or for interrupted systemcalls?),
                    299:           * and we must see several before we quit.
                    300:           */
                    301:                register int cnt = NR_OF_EOFS;
                    302:                while (cnt--) {
                    303:                    clearerr(stdin);    /* omit if clearerr is undefined */
                    304:                    if((sym = getchar()) != EOF) goto noteof;
                    305:                }
                    306:                end_of_input();
                    307:             noteof:    ;
                    308:        }
                    309: #else
                    310:                end_of_input();
                    311: #endif NR_OF_EOFS
                    312:        if(flags.toplin == 1)
                    313:                flags.toplin = 2;
                    314:        return((char) sym);
                    315: }
                    316: 
                    317: end_of_input()
                    318: {
                    319:        settty("End of input?\n");
                    320:        clearlocks();
                    321:        exit(0);
                    322: }

unix.superglobalmegacorp.com

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