term.h revision 1.6 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.1 kamil *
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.1 kamil *
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.1 kamil *
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.1 kamil
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