|
|
1.1 ! root 1: /* $Header: term.h,v 7.0.1.2 86/12/12 17:05:15 lwall Exp $ */ ! 2: ! 3: /* $Log: term.h,v $ ! 4: * Revision 7.0.1.2 86/12/12 17:05:15 lwall ! 5: * Baseline for net release. ! 6: * ! 7: * Revision 7.0.1.1 86/10/16 10:53:33 lwall ! 8: * Added Damage. Fixed random bugs. ! 9: * ! 10: * Revision 7.0 86/10/08 15:14:07 lwall ! 11: * Split into separate files. Added amoebas and pirates. ! 12: * ! 13: */ ! 14: ! 15: /* warp will still work without the following, but may get ahead at low speed */ ! 16: #ifdef TIOCOUTQ /* chars left in output queue */ ! 17: #define output_pending() (ioctl(1, TIOCOUTQ, &iocount),iocount) ! 18: #endif ! 19: ! 20: /* If some of the following look something like curses calls, it is because ! 21: * warp used to use curses but doesn't now. Warp was neither as efficient nor ! 22: * as portable with curses, and since the program had to cheat on curses all ! 23: * over the place anyway, we ripped it out. ! 24: */ ! 25: #define setimage(of,to) (mvaddch(of->posy+1,of->posx*2,of->image=(to))) ! 26: ! 27: #define mvaddch(y,x,ch) move((y),(x),(ch)) ! 28: /* #define addch(ch) (tmpchr=(ch), write(1,&tmpchr,1), real_x++) */ ! 29: #define mvaddc(y,x,ch) move((y),(x),(ch)) ! 30: #define addc(ch) (write(1,&(ch),1), real_x++) ! 31: #define addspace() (write(1," ",1), real_x++) ! 32: #define mvaddstr(y,x,s) (move((y),(x),0), tmpstr = (s), \ ! 33: tmplen = strlen(tmpstr), write(1, tmpstr, tmplen), real_x += tmplen) ! 34: ! 35: EXT int tmplen; ! 36: EXT char *tmpstr; ! 37: /* EXT char tmpchr; */ ! 38: ! 39: /* The following macros are like the pseudo-curses macros above, but do ! 40: * certain amount of controlled output buffering. ! 41: * ! 42: * NOTE: a beg_qwrite()..end_qwrite() sequence must NOT contain a cursor ! 43: * movement (move), because the move() routine uses beg_qwrite()..end_qwrite() ! 44: * itself. ! 45: */ ! 46: ! 47: #define beg_qwrite() (maxcmstring = cmbuffer) ! 48: #ifdef vax ! 49: #define qwrite() asm("movc3 _gfillen,_filler,*_maxcmstring"); maxcmstring += gfillen ! 50: #else ! 51: #define qwrite() (movc3(gfillen,filler,maxcmstring), maxcmstring += gfillen) ! 52: #endif ! 53: #define qaddc(ch) (*maxcmstring++ = (ch), real_x++) ! 54: #define qaddch(ch) (*maxcmstring++ = (ch), real_x++) ! 55: #define qaddspace() (*maxcmstring++ = ' ', real_x++) ! 56: #define end_qwrite() (write(1,cmbuffer,maxcmstring-cmbuffer)) ! 57: ! 58: /* setting a ??size to infinity forces cursor addressing in that direction */ ! 59: ! 60: EXT int CMsize; ! 61: EXT int BCsize INIT(1); ! 62: EXT int DOsize INIT(1000); ! 63: EXT int UPsize INIT(1000); ! 64: EXT int NDsize INIT(1000); ! 65: ! 66: EXT int charsperhalfsec; ! 67: ! 68: EXT int real_y INIT(-100); ! 69: EXT int real_x INIT(-100); ! 70: ! 71: #ifdef DOINIT ! 72: char filler[] = {0,'\b',0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; ! 73: #else ! 74: EXT char filler[]; ! 75: #endif ! 76: ! 77: EXT char *bsptr INIT(filler+1); ! 78: ! 79: EXT char term[12]; ! 80: ! 81: EXT char gfillen INIT(25); ! 82: ! 83: EXT char *maxcmstring; ! 84: EXT char cmbuffer[512]; ! 85: ! 86: #define BREAKCH '\0' ! 87: ! 88: EXT char INTRCH INIT('\03'); ! 89: ! 90: #ifdef PUSHBACK ! 91: EXT char circlebuf[PUSHSIZE]; ! 92: EXT int nextin INIT(0); ! 93: EXT int nextout INIT(0); ! 94: # ifdef PENDING ! 95: # ifdef FIONREAD ! 96: EXT long iocount INIT(0); ! 97: # ifndef lint ! 98: # define input_pending() (nextin!=nextout || \ ! 99: (ioctl(0, FIONREAD, &iocount),(int)iocount)) ! 100: # else ! 101: # define input_pending() bizarre ! 102: # endif /* lint */ ! 103: # else /* FIONREAD */ ! 104: int circfill(); ! 105: # ifdef RDCHK ! 106: # ifndef lint ! 107: # define input_pending() rdchk(0) ! 108: # else /* lint */ ! 109: # define input_pending() bizarre ! 110: # endif /* lint */ ! 111: # else /* RDCHK */ ! 112: # ifndef O_NDELAY /* assert O_NDELAY */ ! 113: ??? PENDING isn't defined correctly in warp.h ! 114: # endif ! 115: EXT int devtty INIT(0); ! 116: # ifndef lint ! 117: # define input_pending() (nextin!=nextout || circfill()) ! 118: # else ! 119: # define input_pending() bizarre ! 120: # endif /* lint */ ! 121: # endif /* RDCHK */ ! 122: # endif /* FIONREAD */ ! 123: # else /* PENDING */ ! 124: ??? warp won't work without PENDING ! 125: # ifndef lint ! 126: # define input_pending() (nextin!=nextout) ! 127: # else ! 128: # define input_pending() bizarre ! 129: # endif /* lint */ ! 130: # endif /* PENDING */ ! 131: #else /* PUSHBACK */ ! 132: # ifdef PENDING ! 133: # ifdef FIONREAD /* must have FIONREAD or O_NDELAY for input_pending() */ ! 134: # define read_tty(addr,size) read(0,addr,size) ! 135: # ifndef lint ! 136: # define input_pending() (ioctl(0, FIONREAD, &iocount), \ ! 137: (int)iocount) ! 138: # else ! 139: # define input_pending() bizarre ! 140: # endif /* lint */ ! 141: EXT long iocount INIT(0); ! 142: # else /* FIONREAD */ ! 143: # ifdef RDCHK /* actually, they can have rdchk() too */ ! 144: # define read_tty(addr,size) read(0,addr,size) ! 145: # ifndef lint ! 146: # define input_pending() rdchk(0) ! 147: # else /* lint */ ! 148: # define input_pending() bizarre ! 149: # endif /* lint */ ! 150: # else /* RDCHK */ ! 151: # ifndef O_NDELAY /* assert O_NDELAY */ ! 152: ??? PENDING isn't defined correctly in warp.h ! 153: # endif ! 154: EXT int devtty INIT(0); ! 155: EXT bool is_input INIT(FALSE); ! 156: EXT char pending_ch INIT(0); ! 157: # ifndef lint ! 158: # define input_pending() (is_input || \ ! 159: (is_input=read(devtty,&pending_ch,1))) ! 160: # else ! 161: # define input_pending() bizarre ! 162: # endif /* lint */ ! 163: # endif /* RDCHK */ ! 164: # endif /* FIONREAD */ ! 165: # else /* PENDING */ ! 166: ??? warp won't work without PENDING ! 167: # define read_tty(addr,size) read(0,addr,size) ! 168: # define input_pending() (FALSE) ! 169: # endif /* PENDING */ ! 170: #endif /* PUSHBACK */ ! 171: ! 172: /* stuff wanted by terminal mode diddling routines */ ! 173: ! 174: #ifdef TERMIO ! 175: EXT struct termio _tty, _oldtty; ! 176: #else ! 177: EXT struct sgttyb _tty; ! 178: EXT int _res_flg INIT(0); ! 179: #endif ! 180: ! 181: EXT int _tty_ch INIT(2); ! 182: EXT bool bizarre INIT(FALSE); /* do we need to restore terminal? */ ! 183: ! 184: /* terminal mode diddling routines */ ! 185: ! 186: #ifdef TERMIO ! 187: ! 188: #define raw() ((bizarre=1),_tty.c_lflag &=~ISIG,_tty.c_cc[VMIN] = 1,ioctl(_tty_ch,TCSETAF,&_tty)) ! 189: #define noraw() ((bizarre=1),_tty.c_lflag |= ISIG,_tty.c_cc[VEOF] = CEOF,ioctl(_tty_ch,TCSETAF,&_tty)) ! 190: #define crmode() ((bizarre=1),_tty.c_lflag &=~ICANON,_tty.c_cc[VMIN] = 1,ioctl(_tty_ch,TCSETAF,&_tty)) ! 191: #define nocrmode() ((bizarre=1),_tty.c_lflag |= ICANON,_tty.c_cc[VEOF] = CEOF,ioctl(_tty_ch,TCSETAF,&_tty)) ! 192: #define echo() ((bizarre=1),_tty.c_lflag |= ECHO, ioctl(_tty_ch, TCSETAW, &_tty)) ! 193: #define noecho() ((bizarre=1),_tty.c_lflag &=~ECHO, ioctl(_tty_ch, TCSETAW, &_tty)) ! 194: #define nl() ((bizarre=1),_tty.c_iflag |= ICRNL,_tty.c_oflag |= ONLCR,ioctl(_tty_ch, TCSETAW, &_tty)) ! 195: #define nonl() ((bizarre=1),_tty.c_iflag &=~ICRNL,_tty.c_oflag &=~ONLCR,ioctl(_tty_ch, TCSETAW, &_tty)) ! 196: #define savetty() (ioctl(_tty_ch, TCGETA, &_oldtty),ioctl(_tty_ch, TCGETA, &_tty)) ! 197: #define resetty() ((bizarre=0),ioctl(_tty_ch, TCSETAF, &_oldtty)) ! 198: #define unflush_output() ! 199: ! 200: #else ! 201: ! 202: #define raw() ((bizarre=1),_tty.sg_flags|=RAW, stty(_tty_ch,&_tty)) ! 203: #define noraw() ((bizarre=1),_tty.sg_flags&=~RAW,stty(_tty_ch,&_tty)) ! 204: #define crmode() ((bizarre=1),_tty.sg_flags |= CBREAK, stty(_tty_ch,&_tty)) ! 205: #define nocrmode() ((bizarre=1),_tty.sg_flags &= ~CBREAK,stty(_tty_ch,&_tty)) ! 206: #define echo() ((bizarre=1),_tty.sg_flags |= ECHO, stty(_tty_ch, &_tty)) ! 207: #define noecho() ((bizarre=1),_tty.sg_flags &= ~ECHO, stty(_tty_ch, &_tty)) ! 208: #define nl() ((bizarre=1),_tty.sg_flags |= CRMOD,stty(_tty_ch, &_tty)) ! 209: #define nonl() ((bizarre=1),_tty.sg_flags &= ~CRMOD, stty(_tty_ch, &_tty)) ! 210: #define savetty() (gtty(_tty_ch, &_tty), _res_flg = _tty.sg_flags) ! 211: #define resetty() ((bizarre=0),_tty.sg_flags = _res_flg, stty(_tty_ch, &_tty)) ! 212: #endif /* TERMIO */ ! 213: ! 214: #ifdef TIOCSTI ! 215: #ifdef lint ! 216: #define forceme(c) ioctl(_tty_ch,TIOCSTI,Null(long*)) /* ghad! */ ! 217: #else ! 218: #define forceme(c) ioctl(_tty_ch,TIOCSTI,c) /* pass character in " " */ ! 219: #endif /* lint */ ! 220: #else ! 221: #define forceme(c) ! 222: #endif ! 223: ! 224: /* termcap stuff */ ! 225: ! 226: /* ! 227: * NOTE: if you don't have termlib you'll have to define these strings, ! 228: * the tputs routine, and the tgoto routine. ! 229: * The tgoto routine simply produces a cursor addressing string for a given ! 230: * x and y. The 1st argument is a generic string to be interpreted. ! 231: * If you are hardwiring it you might just ignore the 1st argument. ! 232: * The tputs routine interprets any leading number as a padding factor, possibly ! 233: * scaled by the number of lines (2nd argument), puts out the string (1st arg) ! 234: * and the padding using the routine specified as the 3rd argument. ! 235: */ ! 236: ! 237: #ifdef HAVETERMLIB ! 238: EXT char *BC INIT(Nullch); /* backspace character */ ! 239: EXT char *UP INIT(Nullch); /* move cursor up one line */ ! 240: EXT char *myUP; ! 241: EXT char *ND INIT(Nullch); /* non-destructive cursor right */ ! 242: EXT char *myND; ! 243: EXT char *DO INIT(Nullch); /* move cursor down one line */ ! 244: EXT char *myDO; ! 245: EXT char *CR INIT(Nullch); /* get to left margin, somehow */ ! 246: EXT char *VB INIT(Nullch); /* visible bell */ ! 247: EXT char *CL INIT(Nullch); /* home and clear screen */ ! 248: EXT char *CE INIT(Nullch); /* clear to end of line */ ! 249: EXT char *CM INIT(Nullch); /* cursor motion -- PWP */ ! 250: EXT char *HO INIT(Nullch); /* home cursor -- PWP */ ! 251: EXT char *CD INIT(Nullch); /* clear to end of display -- PWP */ ! 252: EXT char *SO INIT(Nullch); /* begin standout mode */ ! 253: EXT char *SE INIT(Nullch); /* end standout mode */ ! 254: EXT int SG INIT(0); /* blanks left by SO and SE */ ! 255: EXT char *US INIT(Nullch); /* start underline mode */ ! 256: EXT char *UE INIT(Nullch); /* end underline mode */ ! 257: EXT char *UC INIT(Nullch); /* underline a character, if that's how it's done */ ! 258: EXT int UG INIT(0); /* blanks left by US and UE */ ! 259: EXT bool AM INIT(FALSE); /* does terminal have automatic margins? */ ! 260: EXT bool XN INIT(FALSE); /* does it eat 1st newline after automatic wrap? */ ! 261: EXT char PC INIT(0); /* pad character for use by tputs() */ ! 262: EXT short ospeed INIT(0); /* terminal output speed, for use by tputs() */ ! 263: EXT int LINES INIT(0), COLS INIT(0); /* size of screen */ ! 264: EXT int just_a_sec INIT(960); /* 1 sec at current baud rate */ ! 265: /* (number of nulls) */ ! 266: EXT char ERASECH; /* rubout character */ ! 267: EXT char KILLCH; /* line delete character */ ! 268: ! 269: /* define a few handy macros */ ! 270: ! 271: #define clear() (do_tc(CL,LINES),real_y=real_x=0) ! 272: #define erase_eol() do_tc(CE,1) ! 273: #define backspace() (do_tc(BC,0),real_x--) ! 274: #define clear_rest() do_tc(CD,LINES) ! 275: #define underline() do_tc(US,1) ! 276: #define un_underline() do_tc(UE,1) ! 277: #define underchar() do_tc(UC,0) ! 278: #define standout() do_tc(SO,1) ! 279: #define un_standout() do_tc(SE,1) ! 280: #define up_line() do_tc(UP,1) ! 281: #define carriage_return() do_tc(CR,1) ! 282: #define dingaling() do_tc(VB,1) ! 283: #else ! 284: ???????? /* up to you */ ! 285: #endif ! 286: ! 287: void term_init(); ! 288: void term_set(); ! 289: #ifdef PUSHBACK ! 290: void pushchar(); ! 291: void mac_init(); ! 292: void mac_line(); ! 293: #endif ! 294: void eat_typeahead(); ! 295: void settle_down(); ! 296: #ifndef read_tty ! 297: int read_tty(); ! 298: #endif ! 299: void getcmd(); ! 300: ! 301: int read_nd(); ! 302: void page(); ! 303: void move(); ! 304: void do_tc(); ! 305: int comp_tc(); ! 306: void helper(); ! 307: void rewrite(); ! 308: char cmstore(); ! 309:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.