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