|
|
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.