xref: /dragonfly/contrib/ee/new_curse.c (revision 7556134a)
1*7556134aSSascha Wildner /*
2*7556134aSSascha Wildner  |	new_curse.c
3*7556134aSSascha Wildner  |
4*7556134aSSascha Wildner  |	A subset of curses developed for use with ae.
5*7556134aSSascha Wildner  |
6*7556134aSSascha Wildner  |	written by Hugh Mahon
7*7556134aSSascha Wildner  |
8*7556134aSSascha Wildner  |      Copyright (c) 1986, 1987, 1988, 1991, 1992, 1993, 1994, 1995, 2009 Hugh Mahon
9*7556134aSSascha Wildner  |      All rights reserved.
10*7556134aSSascha Wildner  |
11*7556134aSSascha Wildner  |      Redistribution and use in source and binary forms, with or without
12*7556134aSSascha Wildner  |      modification, are permitted provided that the following conditions
13*7556134aSSascha Wildner  |      are met:
14*7556134aSSascha Wildner  |
15*7556134aSSascha Wildner  |          * Redistributions of source code must retain the above copyright
16*7556134aSSascha Wildner  |            notice, this list of conditions and the following disclaimer.
17*7556134aSSascha Wildner  |          * Redistributions in binary form must reproduce the above
18*7556134aSSascha Wildner  |            copyright notice, this list of conditions and the following
19*7556134aSSascha Wildner  |            disclaimer in the documentation and/or other materials provided
20*7556134aSSascha Wildner  |            with the distribution.
21*7556134aSSascha Wildner  |
22*7556134aSSascha Wildner  |      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23*7556134aSSascha Wildner  |      "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24*7556134aSSascha Wildner  |      LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25*7556134aSSascha Wildner  |      FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
26*7556134aSSascha Wildner  |      COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27*7556134aSSascha Wildner  |      INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
28*7556134aSSascha Wildner  |      BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29*7556134aSSascha Wildner  |      LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
30*7556134aSSascha Wildner  |      CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31*7556134aSSascha Wildner  |      LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
32*7556134aSSascha Wildner  |      ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33*7556134aSSascha Wildner  |      POSSIBILITY OF SUCH DAMAGE.
34*7556134aSSascha Wildner  |
35*7556134aSSascha Wildner  |
36*7556134aSSascha Wildner  |	All are rights reserved.
37*7556134aSSascha Wildner  |
38*7556134aSSascha Wildner  |	$Header: /home/hugh/sources/old_ae/RCS/new_curse.c,v 1.54 2002/09/21 00:47:14 hugh Exp $
39*7556134aSSascha Wildner  |
40*7556134aSSascha Wildner  */
41*7556134aSSascha Wildner 
42*7556134aSSascha Wildner char *copyright_message[] = { "Copyright (c) 1986, 1987, 1988, 1991, 1992, 1993, 1994, 1995, 2009 Hugh Mahon",
43*7556134aSSascha Wildner 				"All rights are reserved."};
44*7556134aSSascha Wildner 
45*7556134aSSascha Wildner char * new_curse_name= "@(#) new_curse.c $Revision: 1.54 $";
46*7556134aSSascha Wildner 
47*7556134aSSascha Wildner #include "new_curse.h"
48*7556134aSSascha Wildner #include <signal.h>
49*7556134aSSascha Wildner #include <fcntl.h>
50*7556134aSSascha Wildner 
51*7556134aSSascha Wildner #ifdef SYS5
52*7556134aSSascha Wildner #include <string.h>
53*7556134aSSascha Wildner #else
54*7556134aSSascha Wildner #include <strings.h>
55*7556134aSSascha Wildner #endif
56*7556134aSSascha Wildner 
57*7556134aSSascha Wildner #ifdef BSD_SELECT
58*7556134aSSascha Wildner #include <sys/types.h>
59*7556134aSSascha Wildner #include <sys/time.h>
60*7556134aSSascha Wildner 
61*7556134aSSascha Wildner #ifdef SLCT_HDR
62*7556134aSSascha Wildner #include <sys/select.h>  /* on AIX */
63*7556134aSSascha Wildner #endif /* SLCT_HDR */
64*7556134aSSascha Wildner 
65*7556134aSSascha Wildner #endif /* BSD_SELECT */
66*7556134aSSascha Wildner 
67*7556134aSSascha Wildner #ifdef HAS_STDLIB
68*7556134aSSascha Wildner #include <stdlib.h>
69*7556134aSSascha Wildner #endif
70*7556134aSSascha Wildner 
71*7556134aSSascha Wildner #if defined(__STDC__)
72*7556134aSSascha Wildner #include <stdarg.h>
73*7556134aSSascha Wildner #else
74*7556134aSSascha Wildner #include <varargs.h>
75*7556134aSSascha Wildner #endif
76*7556134aSSascha Wildner 
77*7556134aSSascha Wildner #ifdef HAS_UNISTD
78*7556134aSSascha Wildner #include <unistd.h>
79*7556134aSSascha Wildner #endif
80*7556134aSSascha Wildner 
81*7556134aSSascha Wildner #ifdef HAS_SYS_IOCTL
82*7556134aSSascha Wildner #include <sys/ioctl.h>
83*7556134aSSascha Wildner #endif
84*7556134aSSascha Wildner 
85*7556134aSSascha Wildner 
86*7556134aSSascha Wildner WINDOW *curscr;
87*7556134aSSascha Wildner static WINDOW *virtual_scr;
88*7556134aSSascha Wildner WINDOW *stdscr;
89*7556134aSSascha Wildner WINDOW *last_window_refreshed;
90*7556134aSSascha Wildner 
91*7556134aSSascha Wildner #ifdef TIOCGWINSZ
92*7556134aSSascha Wildner 	struct winsize ws;
93*7556134aSSascha Wildner #endif
94*7556134aSSascha Wildner 
95*7556134aSSascha Wildner #define min(a, b)	(a < b ? a : b)
96*7556134aSSascha Wildner #define highbitset(a)	((a) & 0x80)
97*7556134aSSascha Wildner 
98*7556134aSSascha Wildner #ifndef CAP
99*7556134aSSascha Wildner #define String_Out(table, stack, place) Info_Out(table, stack, place)
100*7556134aSSascha Wildner #else
101*7556134aSSascha Wildner #define String_Out(table, stack, place) Cap_Out(table, stack, place)
102*7556134aSSascha Wildner #endif
103*7556134aSSascha Wildner 
104*7556134aSSascha Wildner #define bw__ 0	/* booleans	*/
105*7556134aSSascha Wildner #define am__ 1
106*7556134aSSascha Wildner #define xb__ 2
107*7556134aSSascha Wildner #define xs__ 3	/* hp glitch (standout not erased by overwrite)	*/
108*7556134aSSascha Wildner #define xn__ 4
109*7556134aSSascha Wildner #define eo__ 5
110*7556134aSSascha Wildner #define gn__ 6	/* generic type terminal	*/
111*7556134aSSascha Wildner #define hc__ 7	/* hardcopy terminal		*/
112*7556134aSSascha Wildner #define km__ 8
113*7556134aSSascha Wildner #define hs__ 9
114*7556134aSSascha Wildner #define in__ 10
115*7556134aSSascha Wildner #define da__ 11
116*7556134aSSascha Wildner #define db__ 12
117*7556134aSSascha Wildner #define mi__ 13	/* safe to move during insert mode	*/
118*7556134aSSascha Wildner #define ms__ 14	/* safe to move during standout mode	*/
119*7556134aSSascha Wildner #define os__ 15
120*7556134aSSascha Wildner #define es__ 16
121*7556134aSSascha Wildner #define xt__ 17
122*7556134aSSascha Wildner #define hz__ 18	/* hazeltine glitch	*/
123*7556134aSSascha Wildner #define ul__ 19
124*7556134aSSascha Wildner #define xo__ 20
125*7556134aSSascha Wildner #define chts__ 21
126*7556134aSSascha Wildner #define nxon__ 22
127*7556134aSSascha Wildner #define nrrmc__ 23
128*7556134aSSascha Wildner #define npc__ 24
129*7556134aSSascha Wildner #define mc5i__ 25
130*7556134aSSascha Wildner 
131*7556134aSSascha Wildner #define co__ 0	/* number of columns	*/	/* numbers		*/
132*7556134aSSascha Wildner #define it__ 1	/* spaces per tab	*/
133*7556134aSSascha Wildner #define li__ 2	/* number of lines	*/
134*7556134aSSascha Wildner #define lm__ 3
135*7556134aSSascha Wildner #define sg__ 4	/* magic cookie glitch	*/
136*7556134aSSascha Wildner #define pb__ 5
137*7556134aSSascha Wildner #define vt__ 6
138*7556134aSSascha Wildner #define ws__ 7
139*7556134aSSascha Wildner 
140*7556134aSSascha Wildner #define cols__ 0
141*7556134aSSascha Wildner #define lines__ 2
142*7556134aSSascha Wildner #define xmc__ 4
143*7556134aSSascha Wildner #define vt__ 6
144*7556134aSSascha Wildner #define wsl__ 7
145*7556134aSSascha Wildner #define nlab__ 8
146*7556134aSSascha Wildner #define lh__ 9
147*7556134aSSascha Wildner #define lw__ 10
148*7556134aSSascha Wildner 
149*7556134aSSascha Wildner #define bt__ 0	/* back tab		*/	/* strings	*/
150*7556134aSSascha Wildner #define bl__ 1	/* bell			*/
151*7556134aSSascha Wildner #define cr__ 2	/* carriage return	*/
152*7556134aSSascha Wildner #define cs__ 3	/* change scroll region	*/
153*7556134aSSascha Wildner #define ct__ 4	/* clear all tab stops	*/
154*7556134aSSascha Wildner #define cl__ 5	/* clear screen and home cursor	*/
155*7556134aSSascha Wildner #define ce__ 6	/* clear to end of line	*/
156*7556134aSSascha Wildner #define cd__ 7	/* clear to end of display	*/
157*7556134aSSascha Wildner #define ch__ 8	/* set cursor column	*/
158*7556134aSSascha Wildner #define CC__ 9	/* term, settable cmd char in 	*/
159*7556134aSSascha Wildner #define cm__ 10	/* screen rel cursor motion, row, column	*/
160*7556134aSSascha Wildner #define do__ 11	/* down one line	*/
161*7556134aSSascha Wildner #define ho__ 12	/* home cursor	*/
162*7556134aSSascha Wildner #define vi__ 13	/* make cursor invisible	*/
163*7556134aSSascha Wildner #define le__ 14	/* move cursor left one space	*/
164*7556134aSSascha Wildner #define CM__ 15	/* memory rel cursor addressing	*/
165*7556134aSSascha Wildner #define ve__ 16	/* make cursor appear normal	*/
166*7556134aSSascha Wildner #define nd__ 17	/* non-destructive space (cursor right)	*/
167*7556134aSSascha Wildner #define ll__ 18	/* last line, first col	*/
168*7556134aSSascha Wildner #define up__ 19	/* cursor up		*/
169*7556134aSSascha Wildner #define vs__ 20
170*7556134aSSascha Wildner #define dc__ 21	/* delete character	*/
171*7556134aSSascha Wildner #define dl__ 22	/* delete line		*/
172*7556134aSSascha Wildner #define ds__ 23
173*7556134aSSascha Wildner #define hd__ 24
174*7556134aSSascha Wildner #define as__ 25
175*7556134aSSascha Wildner #define mb__ 26
176*7556134aSSascha Wildner #define md__ 27	/* turn on bold		*/
177*7556134aSSascha Wildner #define ti__ 28
178*7556134aSSascha Wildner #define dm__ 29	/* turn on delete mode	*/
179*7556134aSSascha Wildner #define mh__ 30	/* half bright mode	*/
180*7556134aSSascha Wildner #define im__ 31	/* insert mode		*/
181*7556134aSSascha Wildner #define mk__ 32
182*7556134aSSascha Wildner #define mp__ 33
183*7556134aSSascha Wildner #define mr__ 34
184*7556134aSSascha Wildner #define so__ 35	/* enter standout mode	*/
185*7556134aSSascha Wildner #define us__ 36
186*7556134aSSascha Wildner #define ec__ 37
187*7556134aSSascha Wildner #define ae__ 38
188*7556134aSSascha Wildner #define me__ 39
189*7556134aSSascha Wildner #define te__ 40
190*7556134aSSascha Wildner #define ed__ 41
191*7556134aSSascha Wildner #define ei__ 42	/* exit insert mode	*/
192*7556134aSSascha Wildner #define se__ 43	/* exit standout mode	*/
193*7556134aSSascha Wildner #define ue__ 44
194*7556134aSSascha Wildner #define vb__ 45
195*7556134aSSascha Wildner #define ff__ 46
196*7556134aSSascha Wildner #define fs__ 47
197*7556134aSSascha Wildner #define i1__ 48
198*7556134aSSascha Wildner #define i2__ 49
199*7556134aSSascha Wildner #define i3__ 50
200*7556134aSSascha Wildner #define if__ 51
201*7556134aSSascha Wildner #define ic__ 52
202*7556134aSSascha Wildner #define al__ 53
203*7556134aSSascha Wildner #define ip__ 54
204*7556134aSSascha Wildner #define kb__ 55		/* backspace key	*/
205*7556134aSSascha Wildner #define ka__ 56
206*7556134aSSascha Wildner #define kC__ 57
207*7556134aSSascha Wildner #define kt__ 58
208*7556134aSSascha Wildner #define kD__ 59
209*7556134aSSascha Wildner #define kL__ 60
210*7556134aSSascha Wildner #define kd__ 61
211*7556134aSSascha Wildner #define kM__ 62
212*7556134aSSascha Wildner #define kE__ 63
213*7556134aSSascha Wildner #define kS__ 64
214*7556134aSSascha Wildner #define k0__ 65
215*7556134aSSascha Wildner #define k1__ 66
216*7556134aSSascha Wildner #define kf10__ 67
217*7556134aSSascha Wildner #define k2__ 68
218*7556134aSSascha Wildner #define k3__ 69
219*7556134aSSascha Wildner #define k4__ 70
220*7556134aSSascha Wildner #define k5__ 71
221*7556134aSSascha Wildner #define k6__ 72
222*7556134aSSascha Wildner #define k7__ 73
223*7556134aSSascha Wildner #define k8__ 74
224*7556134aSSascha Wildner #define k9__ 75
225*7556134aSSascha Wildner #define kh__ 76
226*7556134aSSascha Wildner #define kI__ 77
227*7556134aSSascha Wildner #define kA__ 78
228*7556134aSSascha Wildner #define kl__ 79
229*7556134aSSascha Wildner #define kH__ 80
230*7556134aSSascha Wildner #define kN__ 81
231*7556134aSSascha Wildner #define kP__ 82
232*7556134aSSascha Wildner #define kr__ 83
233*7556134aSSascha Wildner #define kF__ 84
234*7556134aSSascha Wildner #define kR__ 85
235*7556134aSSascha Wildner #define kT__ 86
236*7556134aSSascha Wildner #define ku__ 87	/* key up	*/
237*7556134aSSascha Wildner #define ke__ 88
238*7556134aSSascha Wildner #define ks__ 89
239*7556134aSSascha Wildner #define l0__ 90
240*7556134aSSascha Wildner #define l1__ 91
241*7556134aSSascha Wildner #define la__ 92
242*7556134aSSascha Wildner #define l2__ 93
243*7556134aSSascha Wildner #define l3__ 94
244*7556134aSSascha Wildner #define l4__ 95
245*7556134aSSascha Wildner #define l5__ 96
246*7556134aSSascha Wildner #define l6__ 97
247*7556134aSSascha Wildner #define l7__ 98
248*7556134aSSascha Wildner #define l8__ 99
249*7556134aSSascha Wildner #define l9__ 100
250*7556134aSSascha Wildner #define mo__ 101
251*7556134aSSascha Wildner #define mm__ 102
252*7556134aSSascha Wildner #define nw__ 103
253*7556134aSSascha Wildner #define pc__ 104
254*7556134aSSascha Wildner #define DC__ 105
255*7556134aSSascha Wildner #define DL__ 106
256*7556134aSSascha Wildner #define DO__ 107
257*7556134aSSascha Wildner #define IC__ 118
258*7556134aSSascha Wildner #define SF__ 109
259*7556134aSSascha Wildner #define AL__ 110
260*7556134aSSascha Wildner #define LE__ 111
261*7556134aSSascha Wildner #define RI__ 112
262*7556134aSSascha Wildner #define SR__ 113
263*7556134aSSascha Wildner #define UP__ 114
264*7556134aSSascha Wildner #define pk__ 115
265*7556134aSSascha Wildner #define pl__ 116
266*7556134aSSascha Wildner #define px__ 117
267*7556134aSSascha Wildner #define ps__ 118
268*7556134aSSascha Wildner #define pf__ 119
269*7556134aSSascha Wildner #define po__ 120
270*7556134aSSascha Wildner #define rp__ 121
271*7556134aSSascha Wildner #define r1__ 122
272*7556134aSSascha Wildner #define r2__ 123
273*7556134aSSascha Wildner #define r3__ 124
274*7556134aSSascha Wildner #define rf__ 125
275*7556134aSSascha Wildner #define rc__ 126
276*7556134aSSascha Wildner #define cv__ 127
277*7556134aSSascha Wildner #define sc__ 128
278*7556134aSSascha Wildner #define sf__ 129
279*7556134aSSascha Wildner #define sr__ 130
280*7556134aSSascha Wildner #define sa__ 131	/* sgr	*/
281*7556134aSSascha Wildner #define st__ 132
282*7556134aSSascha Wildner #define wi__ 133
283*7556134aSSascha Wildner #define ta__ 134
284*7556134aSSascha Wildner #define ts__ 135
285*7556134aSSascha Wildner #define uc__ 136
286*7556134aSSascha Wildner #define hu__ 137
287*7556134aSSascha Wildner #define iP__ 138
288*7556134aSSascha Wildner #define K1__ 139
289*7556134aSSascha Wildner #define K2__ 140
290*7556134aSSascha Wildner #define K3__ 141
291*7556134aSSascha Wildner #define K4__ 142
292*7556134aSSascha Wildner #define K5__ 143
293*7556134aSSascha Wildner #define pO__ 144
294*7556134aSSascha Wildner #define ml__ 145
295*7556134aSSascha Wildner #define mu__ 146
296*7556134aSSascha Wildner #define rmp__ 145
297*7556134aSSascha Wildner #define acsc__ 146
298*7556134aSSascha Wildner #define pln__ 147
299*7556134aSSascha Wildner #define kcbt__ 148
300*7556134aSSascha Wildner #define smxon__ 149
301*7556134aSSascha Wildner #define rmxon__ 150
302*7556134aSSascha Wildner #define smam__ 151
303*7556134aSSascha Wildner #define rmam__ 152
304*7556134aSSascha Wildner #define xonc__ 153
305*7556134aSSascha Wildner #define xoffc__ 154
306*7556134aSSascha Wildner #define enacs__ 155
307*7556134aSSascha Wildner #define smln__ 156
308*7556134aSSascha Wildner #define rmln__ 157
309*7556134aSSascha Wildner #define kbeg__ 158
310*7556134aSSascha Wildner #define kcan__ 159
311*7556134aSSascha Wildner #define kclo__ 160
312*7556134aSSascha Wildner #define kcmd__ 161
313*7556134aSSascha Wildner #define kcpy__ 162
314*7556134aSSascha Wildner #define kcrt__ 163
315*7556134aSSascha Wildner #define kend__ 164
316*7556134aSSascha Wildner #define kent__ 165
317*7556134aSSascha Wildner #define kext__ 166
318*7556134aSSascha Wildner #define kfnd__ 167
319*7556134aSSascha Wildner #define khlp__ 168
320*7556134aSSascha Wildner #define kmrk__ 169
321*7556134aSSascha Wildner #define kmsg__ 170
322*7556134aSSascha Wildner #define kmov__ 171
323*7556134aSSascha Wildner #define knxt__ 172
324*7556134aSSascha Wildner #define kopn__ 173
325*7556134aSSascha Wildner #define kopt__ 174
326*7556134aSSascha Wildner #define kprv__ 175
327*7556134aSSascha Wildner #define kprt__ 176
328*7556134aSSascha Wildner #define krdo__ 177
329*7556134aSSascha Wildner #define kref__ 178
330*7556134aSSascha Wildner #define krfr__ 179
331*7556134aSSascha Wildner #define krpl__ 180
332*7556134aSSascha Wildner #define krst__ 181
333*7556134aSSascha Wildner #define kres__ 182
334*7556134aSSascha Wildner #define ksav__ 183
335*7556134aSSascha Wildner #define kspd__ 184
336*7556134aSSascha Wildner #define kund__ 185
337*7556134aSSascha Wildner #define kBEG__ 186
338*7556134aSSascha Wildner #define kCAN__ 187
339*7556134aSSascha Wildner #define kCMD__ 188
340*7556134aSSascha Wildner #define kCPY__ 189
341*7556134aSSascha Wildner #define kCRT__ 190
342*7556134aSSascha Wildner #define kDC__ 191
343*7556134aSSascha Wildner #define kDL__ 192
344*7556134aSSascha Wildner #define kslt__ 193
345*7556134aSSascha Wildner #define kEND__ 194
346*7556134aSSascha Wildner #define kEOL__ 195
347*7556134aSSascha Wildner #define kEXT__ 196
348*7556134aSSascha Wildner #define kFND__ 197
349*7556134aSSascha Wildner #define kHLP__ 198
350*7556134aSSascha Wildner #define kHOM__ 199
351*7556134aSSascha Wildner #define kIC__ 200
352*7556134aSSascha Wildner #define kLFT__ 201
353*7556134aSSascha Wildner #define kMSG__ 202
354*7556134aSSascha Wildner #define kMOV__ 203
355*7556134aSSascha Wildner #define kNXT__ 204
356*7556134aSSascha Wildner #define kOPT__ 205
357*7556134aSSascha Wildner #define kPRV__ 206
358*7556134aSSascha Wildner #define kPRT__ 207
359*7556134aSSascha Wildner #define kRDO__ 208
360*7556134aSSascha Wildner #define kRPL__ 209
361*7556134aSSascha Wildner #define kRIT__ 210
362*7556134aSSascha Wildner #define kRES__ 211
363*7556134aSSascha Wildner #define kSAV__ 212
364*7556134aSSascha Wildner #define kSPD__ 213
365*7556134aSSascha Wildner #define kUND__ 214
366*7556134aSSascha Wildner #define rfi__ 215
367*7556134aSSascha Wildner #define kf11__ 216
368*7556134aSSascha Wildner #define kf12__ 217
369*7556134aSSascha Wildner #define kf13__ 218
370*7556134aSSascha Wildner #define kf14__ 219
371*7556134aSSascha Wildner #define kf15__ 220
372*7556134aSSascha Wildner #define kf16__ 221
373*7556134aSSascha Wildner #define kf17__ 222
374*7556134aSSascha Wildner #define kf18__ 223
375*7556134aSSascha Wildner #define kf19__ 224
376*7556134aSSascha Wildner #define kf20__ 225
377*7556134aSSascha Wildner #define kf21__ 226
378*7556134aSSascha Wildner #define kf22__ 227
379*7556134aSSascha Wildner #define kf23__ 228
380*7556134aSSascha Wildner #define kf24__ 229
381*7556134aSSascha Wildner #define kf25__ 230
382*7556134aSSascha Wildner #define kf26__ 231
383*7556134aSSascha Wildner #define kf27__ 232
384*7556134aSSascha Wildner #define kf28__ 233
385*7556134aSSascha Wildner #define kf29__ 234
386*7556134aSSascha Wildner #define kf30__ 235
387*7556134aSSascha Wildner #define kf31__ 236
388*7556134aSSascha Wildner #define kf32__ 237
389*7556134aSSascha Wildner #define kf33__ 238
390*7556134aSSascha Wildner #define kf34__ 239
391*7556134aSSascha Wildner #define kf35__ 240
392*7556134aSSascha Wildner #define kf36__ 241
393*7556134aSSascha Wildner #define kf37__ 242
394*7556134aSSascha Wildner #define kf38__ 243
395*7556134aSSascha Wildner #define kf39__ 244
396*7556134aSSascha Wildner #define kf40__ 245
397*7556134aSSascha Wildner #define kf41__ 246
398*7556134aSSascha Wildner #define kf42__ 247
399*7556134aSSascha Wildner #define kf43__ 248
400*7556134aSSascha Wildner #define kf44__ 249
401*7556134aSSascha Wildner #define kf45__ 250
402*7556134aSSascha Wildner #define kf46__ 251
403*7556134aSSascha Wildner #define kf47__ 252
404*7556134aSSascha Wildner #define kf48__ 253
405*7556134aSSascha Wildner #define kf49__ 254
406*7556134aSSascha Wildner #define kf50__ 255
407*7556134aSSascha Wildner #define kf51__ 256
408*7556134aSSascha Wildner #define kf52__ 257
409*7556134aSSascha Wildner #define kf53__ 258
410*7556134aSSascha Wildner #define kf54__ 259
411*7556134aSSascha Wildner #define kf55__ 260
412*7556134aSSascha Wildner #define kf56__ 261
413*7556134aSSascha Wildner #define kf57__ 262
414*7556134aSSascha Wildner #define kf58__ 263
415*7556134aSSascha Wildner #define kf59__ 264
416*7556134aSSascha Wildner #define kf60__ 265
417*7556134aSSascha Wildner #define kf61__ 266
418*7556134aSSascha Wildner #define kf62__ 267
419*7556134aSSascha Wildner #define kf63__ 268
420*7556134aSSascha Wildner #define el1__ 269
421*7556134aSSascha Wildner #define mgc__ 270
422*7556134aSSascha Wildner #define smgl__ 271
423*7556134aSSascha Wildner #define smgr__ 272
424*7556134aSSascha Wildner 
425*7556134aSSascha Wildner #ifdef CAP
426*7556134aSSascha Wildner char *Boolean_names[] = {
427*7556134aSSascha Wildner "bw", "am", "xb", "xs", "xn", "eo", "gn", "hc", "km", "hs", "in", "da", "db",
428*7556134aSSascha Wildner "mi", "ms", "os", "es", "xt", "hz", "ul", "xo", "HC", "nx", "NR", "NP", "5i"
429*7556134aSSascha Wildner };
430*7556134aSSascha Wildner 
431*7556134aSSascha Wildner char *Number_names[] = {
432*7556134aSSascha Wildner "co#", "it#", "li#", "lm#", "sg#", "pb#", "vt#", "ws#", "Nl#", "lh#", "lw#"
433*7556134aSSascha Wildner };
434*7556134aSSascha Wildner 
435*7556134aSSascha Wildner char *String_names[] = {
436*7556134aSSascha Wildner "bt=", "bl=", "cr=", "cs=", "ct=", "cl=", "ce=", "cd=", "ch=", "CC=", "cm=",
437*7556134aSSascha Wildner "do=", "ho=", "vi=", "le=", "CM=", "ve=", "nd=", "ll=", "up=", "vs=", "dc=",
438*7556134aSSascha Wildner "dl=", "ds=", "hd=", "as=", "mb=", "md=", "ti=", "dm=", "mh=", "im=", "mk=",
439*7556134aSSascha Wildner "mp=", "mr=", "so=", "us=", "ec=", "ae=", "me=", "te=", "ed=", "ei=", "se=",
440*7556134aSSascha Wildner "ue=", "vb=", "ff=", "fs=", "i1=", "i2=", "i3=", "if=", "ic=", "al=", "ip=",
441*7556134aSSascha Wildner "kb=", "ka=", "kC=", "kt=", "kD=", "kL=", "kd=", "kM=", "kE=", "kS=", "k0=",
442*7556134aSSascha Wildner "k1=", "k;=", "k2=", "k3=", "k4=", "k5=", "k6=", "k7=", "k8=", "k9=", "kh=",
443*7556134aSSascha Wildner "kI=", "kA=", "kl=", "kH=", "kN=", "kP=", "kr=", "kF=", "kR=", "kT=", "ku=",
444*7556134aSSascha Wildner "ke=", "ks=", "l0=", "l1=", "la=", "l2=", "l3=", "l4=", "l5=", "l6=", "l7=",
445*7556134aSSascha Wildner "l8=", "l9=", "mo=", "mm=", "nw=", "pc=", "DC=", "DL=", "DO=", "IC=", "SF=",
446*7556134aSSascha Wildner "AL=", "LE=", "RI=", "SR=", "UP=", "pk=", "pl=", "px=", "ps=", "pf=", "po=",
447*7556134aSSascha Wildner "rp=", "r1=", "r2=", "r3=", "rf=", "rc=", "cv=", "sc=", "sf=", "sr=", "sa=",
448*7556134aSSascha Wildner "st=", "wi=", "ta=", "ts=", "uc=", "hu=", "iP=", "K1=", "K3=", "K2=", "K4=",
449*7556134aSSascha Wildner "K5=", "pO=", "rP=", "ac=", "pn=", "kB=", "SX=", "RX=", "SA=", "RA=", "XN=",
450*7556134aSSascha Wildner "XF=", "eA=", "LO=", "LF=", "@1=", "@2=", "@3=", "@4=", "@5=", "@6=", "@7=",
451*7556134aSSascha Wildner "@8=", "@9=", "@0=", "%1=", "%2=", "%3=", "%4=", "%5=", "%6=", "%7=", "%8=",
452*7556134aSSascha Wildner "%9=", "%0=", "&1=", "&2=", "&3=", "&4=", "&5=", "&6=", "&7=", "&8=", "&9=",
453*7556134aSSascha Wildner "&0=", "*1=", "*2=", "*3=", "*4=", "*5=", "*6=", "*7=", "*8=", "*9=", "*0=",
454*7556134aSSascha Wildner "#1=", "#2=", "#3=", "#4=", "%a=", "%b=", "%c=", "%d=", "%e=", "%f=", "%g=",
455*7556134aSSascha Wildner "%h=", "%i=", "%j=", "!1=", "!2=", "!3=", "RF=", "F1=", "F2=", "F3=", "F4=",
456*7556134aSSascha Wildner "F5=", "F6=", "F7=", "F8=", "F9=", "FA=", "FB=", "FC=", "FD=", "FE=", "FF=",
457*7556134aSSascha Wildner "FG=", "FH=", "FI=", "FJ=", "FK=", "FL=", "FM=", "FN=", "FO=", "FP=", "FQ=",
458*7556134aSSascha Wildner "FR=", "FS=", "FT=", "FU=", "FV=", "FW=", "FX=", "FY=", "FZ=", "Fa=", "Fb=",
459*7556134aSSascha Wildner "Fc=", "Fd=", "Fe=", "Ff=", "Fg=", "Fh=", "Fi=", "Fj=", "Fk=", "Fl=", "Fm=",
460*7556134aSSascha Wildner "Fn=", "Fo=", "Fp=", "Fq=", "Fr=", "cb=", "MC=", "ML=", "MR="
461*7556134aSSascha Wildner };
462*7556134aSSascha Wildner #endif
463*7556134aSSascha Wildner 
464*7556134aSSascha Wildner char *new_curse = "October 1987";
465*7556134aSSascha Wildner 
466*7556134aSSascha Wildner char in_buff[100];	/* buffer for ungetch			*/
467*7556134aSSascha Wildner int bufp;		/* next free position in in_buff	*/
468*7556134aSSascha Wildner 
469*7556134aSSascha Wildner char *TERMINAL_TYPE = NULL; /* terminal type to be gotten from environment	*/
470*7556134aSSascha Wildner int CFOUND = FALSE;
471*7556134aSSascha Wildner int Data_Line_len = 0;
472*7556134aSSascha Wildner int Max_Key_len;	/* max length of a sequence sent by a key	*/
473*7556134aSSascha Wildner char *Data_Line = NULL;
474*7556134aSSascha Wildner char *TERM_PATH = NULL;
475*7556134aSSascha Wildner char *TERM_data_ptr = NULL;
476*7556134aSSascha Wildner char *Term_File_name = NULL;	/* name of file containing terminal description	*/
477*7556134aSSascha Wildner FILE *TFP;		/* file pointer to file with terminal des.	*/
478*7556134aSSascha Wildner int Fildes;		/* file descriptor for terminfo file		*/
479*7556134aSSascha Wildner int STAND = FALSE;	/* is standout mode activated?			*/
480*7556134aSSascha Wildner int TERM_INFO = FALSE;	/* is terminfo being used (TRUE), or termcap (FALSE) */
481*7556134aSSascha Wildner int Time_Out;	/* set when time elapsed while trying to read function key */
482*7556134aSSascha Wildner int Curr_x;		/* current x position on screen			*/
483*7556134aSSascha Wildner int Curr_y;		/* current y position on the screen		*/
484*7556134aSSascha Wildner int LINES;
485*7556134aSSascha Wildner int COLS;
486*7556134aSSascha Wildner int Move_It;		/* flag to move cursor if magic cookie glitch	*/
487*7556134aSSascha Wildner int initialized = FALSE;	/* tells whether new_curse is initialized	*/
488*7556134aSSascha Wildner float speed;
489*7556134aSSascha Wildner float chars_per_millisecond;
490*7556134aSSascha Wildner int Repaint_screen;	/* if an operation to change screen impossible, repaint screen	*/
491*7556134aSSascha Wildner int Intr;		/* storeage for interrupt character		*/
492*7556134aSSascha Wildner int Parity;		/* 0 = no parity, 1 = odd parity, 2 = even parity */
493*7556134aSSascha Wildner int Noblock;		/* for BSD systems				*/
494*7556134aSSascha Wildner int Num_bits;	/* number of bits per character	*/
495*7556134aSSascha Wildner int Flip_Bytes;	/* some systems have byte order reversed	*/
496*7556134aSSascha Wildner int interrupt_flag = FALSE;	/* set true if SIGWINCH received	*/
497*7556134aSSascha Wildner 
498*7556134aSSascha Wildner #ifndef CAP
499*7556134aSSascha Wildner char *Strings;
500*7556134aSSascha Wildner #endif
501*7556134aSSascha Wildner 
502*7556134aSSascha Wildner #if !defined(TERMCAP)
503*7556134aSSascha Wildner #define TERMCAP "/etc/termcap"
504*7556134aSSascha Wildner #endif
505*7556134aSSascha Wildner 
506*7556134aSSascha Wildner struct KEYS {
507*7556134aSSascha Wildner 	int length;	/* length of string sent by key			*/
508*7556134aSSascha Wildner 	char *string;	/* string sent by key				*/
509*7556134aSSascha Wildner 	int value;	/* CURSES value of key (9-bit)			*/
510*7556134aSSascha Wildner 	};
511*7556134aSSascha Wildner 
512*7556134aSSascha Wildner struct KEY_STACK {
513*7556134aSSascha Wildner 	struct KEYS *element;
514*7556134aSSascha Wildner 	struct KEY_STACK *next;
515*7556134aSSascha Wildner 	};
516*7556134aSSascha Wildner 
517*7556134aSSascha Wildner struct KEY_STACK *KEY_TOS = NULL;
518*7556134aSSascha Wildner struct KEY_STACK *KEY_POINT;
519*7556134aSSascha Wildner 
520*7556134aSSascha Wildner /*
521*7556134aSSascha Wildner  |
522*7556134aSSascha Wildner  |	Not all systems have good terminal information, so we will define
523*7556134aSSascha Wildner  |	keyboard information here for the most widely used terminal type,
524*7556134aSSascha Wildner  |	the VT100.
525*7556134aSSascha Wildner  |
526*7556134aSSascha Wildner  */
527*7556134aSSascha Wildner 
528*7556134aSSascha Wildner struct KEYS vt100[] =
529*7556134aSSascha Wildner 	{
530*7556134aSSascha Wildner 		{ 3, "\033[A", 0403 },	/* key up 	*/
531*7556134aSSascha Wildner 		{ 3, "\033[C", 0405 },	/* key right	*/
532*7556134aSSascha Wildner 		{ 3, "\033[D", 0404 },	/* key left	*/
533*7556134aSSascha Wildner 
534*7556134aSSascha Wildner 		{ 4, "\033[6~", 0522 },	/* key next page	*/
535*7556134aSSascha Wildner 		{ 4, "\033[5~", 0523 },	/* key prev page	*/
536*7556134aSSascha Wildner 		{ 3, "\033[[", 0550 },	/* key end	*/
537*7556134aSSascha Wildner 		{ 3, "\033[@", 0406 },	/* key home	*/
538*7556134aSSascha Wildner 		{ 4, "\033[2~", 0513 },	/* key insert char	*/
539*7556134aSSascha Wildner 
540*7556134aSSascha Wildner 		{ 3, "\033[y", 0410 },	/* key F0	*/
541*7556134aSSascha Wildner 		{ 3, "\033[P", 0411 },	/* key F1	*/
542*7556134aSSascha Wildner 		{ 3, "\033[Q", 0412 },	/* key F2	*/
543*7556134aSSascha Wildner 		{ 3, "\033[R", 0413 },	/* key F3	*/
544*7556134aSSascha Wildner 		{ 3, "\033[S", 0414 },	/* key F4	*/
545*7556134aSSascha Wildner 		{ 3, "\033[t", 0415 },	/* key F5	*/
546*7556134aSSascha Wildner 		{ 3, "\033[u", 0416 },	/* key F6	*/
547*7556134aSSascha Wildner 		{ 3, "\033[v", 0417 },	/* key F7	*/
548*7556134aSSascha Wildner 		{ 3, "\033[l", 0420 },	/* key F8	*/
549*7556134aSSascha Wildner 		{ 3, "\033[w", 0421 },	/* key F9	*/
550*7556134aSSascha Wildner 		{ 3, "\033[x", 0422 },	/* key F10	*/
551*7556134aSSascha Wildner 
552*7556134aSSascha Wildner 		{ 5, "\033[10~", 0410 },	/* key F0	*/
553*7556134aSSascha Wildner 		{ 5, "\033[11~", 0411 },	/* key F1	*/
554*7556134aSSascha Wildner 		{ 5, "\033[12~", 0412 },	/* key F2	*/
555*7556134aSSascha Wildner 		{ 5, "\033[13~", 0413 },	/* key F3	*/
556*7556134aSSascha Wildner 		{ 5, "\033[14~", 0414 },	/* key F4	*/
557*7556134aSSascha Wildner 		{ 5, "\033[15~", 0415 },	/* key F5	*/
558*7556134aSSascha Wildner 		{ 5, "\033[17~", 0416 },	/* key F6	*/
559*7556134aSSascha Wildner 		{ 5, "\033[18~", 0417 },	/* key F7	*/
560*7556134aSSascha Wildner 		{ 5, "\033[19~", 0420 },	/* key F8	*/
561*7556134aSSascha Wildner 		{ 5, "\033[20~", 0421 },	/* key F9	*/
562*7556134aSSascha Wildner 		{ 5, "\033[21~", 0422 },	/* key F10	*/
563*7556134aSSascha Wildner 		{ 5, "\033[23~", 0423 },	/* key F11	*/
564*7556134aSSascha Wildner 		{ 5, "\033[24~", 0424 },	/* key F12	*/
565*7556134aSSascha Wildner 		{ 3, "\033[q", 0534 },	/* ka1 upper-left of keypad	*/
566*7556134aSSascha Wildner 		{ 3, "\033[s", 0535 },	/* ka3 upper-right of keypad	*/
567*7556134aSSascha Wildner 		{ 3, "\033[r", 0536 },	/* kb2 center of keypad	*/
568*7556134aSSascha Wildner  		{ 3, "\033[p", 0537 },	/* kc1 lower-left of keypad	*/
569*7556134aSSascha Wildner 		{ 3, "\033[n", 0540 },	/* kc3 lower-right of keypad	*/
570*7556134aSSascha Wildner 
571*7556134aSSascha Wildner 		/*
572*7556134aSSascha Wildner 		 |	The following are the same keys as above, but with
573*7556134aSSascha Wildner 		 |	a different character following the escape char.
574*7556134aSSascha Wildner 		 */
575*7556134aSSascha Wildner 
576*7556134aSSascha Wildner 		{ 3, "\033OA", 0403 },	/* key up 	*/
577*7556134aSSascha Wildner 		{ 3, "\033OC", 0405 },	/* key right	*/
578*7556134aSSascha Wildner 		{ 3, "\033OD", 0404 },	/* key left	*/
579*7556134aSSascha Wildner 		{ 3, "\033OB", 0402 },	/* key down	*/
580*7556134aSSascha Wildner 		{ 4, "\033O6~", 0522 },	/* key next page	*/
581*7556134aSSascha Wildner 		{ 4, "\033O5~", 0523 },	/* key prev page	*/
582*7556134aSSascha Wildner 		{ 3, "\033O[", 0550 },	/* key end	*/
583*7556134aSSascha Wildner 		{ 3, "\033O@", 0406 },	/* key home	*/
584*7556134aSSascha Wildner 		{ 4, "\033O2~", 0513 },	/* key insert char	*/
585*7556134aSSascha Wildner 
586*7556134aSSascha Wildner 		{ 3, "\033Oy", 0410 },	/* key F0	*/
587*7556134aSSascha Wildner 		{ 3, "\033OP", 0411 },	/* key F1	*/
588*7556134aSSascha Wildner 		{ 3, "\033OQ", 0412 },	/* key F2	*/
589*7556134aSSascha Wildner 		{ 3, "\033OR", 0413 },	/* key F3	*/
590*7556134aSSascha Wildner 		{ 3, "\033OS", 0414 },	/* key F4	*/
591*7556134aSSascha Wildner 		{ 3, "\033Ot", 0415 },	/* key F5	*/
592*7556134aSSascha Wildner 		{ 3, "\033Ou", 0416 },	/* key F6	*/
593*7556134aSSascha Wildner 		{ 3, "\033Ov", 0417 },	/* key F7	*/
594*7556134aSSascha Wildner 		{ 3, "\033Ol", 0420 },	/* key F8	*/
595*7556134aSSascha Wildner 		{ 3, "\033Ow", 0421 },	/* key F9	*/
596*7556134aSSascha Wildner 		{ 3, "\033Ox", 0422 },	/* key F10	*/
597*7556134aSSascha Wildner 
598*7556134aSSascha Wildner 		{ 5, "\033O10~", 0410 },	/* key F0	*/
599*7556134aSSascha Wildner 		{ 5, "\033O11~", 0411 },	/* key F1	*/
600*7556134aSSascha Wildner 		{ 5, "\033O12~", 0412 },	/* key F2	*/
601*7556134aSSascha Wildner 		{ 5, "\033O13~", 0413 },	/* key F3	*/
602*7556134aSSascha Wildner 		{ 5, "\033O14~", 0414 },	/* key F4	*/
603*7556134aSSascha Wildner 		{ 5, "\033O15~", 0415 },	/* key F5	*/
604*7556134aSSascha Wildner 		{ 5, "\033O17~", 0416 },	/* key F6	*/
605*7556134aSSascha Wildner 		{ 5, "\033O18~", 0417 },	/* key F7	*/
606*7556134aSSascha Wildner 		{ 5, "\033O19~", 0420 },	/* key F8	*/
607*7556134aSSascha Wildner 		{ 5, "\033O20~", 0421 },	/* key F9	*/
608*7556134aSSascha Wildner 		{ 5, "\033O21~", 0422 },	/* key F10	*/
609*7556134aSSascha Wildner 		{ 5, "\033O23~", 0423 },	/* key F11	*/
610*7556134aSSascha Wildner 		{ 5, "\033O24~", 0424 },	/* key F12	*/
611*7556134aSSascha Wildner 		{ 3, "\033Oq", 0534 },	/* ka1 upper-left of keypad	*/
612*7556134aSSascha Wildner 		{ 3, "\033Os", 0535 },	/* ka3 upper-right of keypad	*/
613*7556134aSSascha Wildner 		{ 3, "\033Or", 0536 },	/* kb2 center of keypad	*/
614*7556134aSSascha Wildner  		{ 3, "\033Op", 0537 },	/* kc1 lower-left of keypad	*/
615*7556134aSSascha Wildner 		{ 3, "\033On", 0540 },	/* kc3 lower-right of keypad	*/
616*7556134aSSascha Wildner 
617*7556134aSSascha Wildner 		{ 0, "", 0 }	/* end	*/
618*7556134aSSascha Wildner 	};
619*7556134aSSascha Wildner 
620*7556134aSSascha Wildner struct Parameters {
621*7556134aSSascha Wildner 	int value;
622*7556134aSSascha Wildner 	struct Parameters *next;
623*7556134aSSascha Wildner 	};
624*7556134aSSascha Wildner 
625*7556134aSSascha Wildner int Key_vals[] = {
626*7556134aSSascha Wildner 	0407, 0526, 0515, 0525, 0512, 0510, 0402, 0514, 0517, 0516, 0410, 0411,
627*7556134aSSascha Wildner 	0422, 0412, 0413, 0414, 0415, 0416, 0417, 0420, 0421, 0406, 0513, 0511,
628*7556134aSSascha Wildner 	0404, 0533, 0522, 0523, 0405, 0520, 0521, 0524, 0403,
629*7556134aSSascha Wildner 	0534, 0535, 0536, 0537, 0540, 0541, 0542, 0543, 0544, 0545, 0546, 0547,
630*7556134aSSascha Wildner 	0550, 0527, 0551, 0552, 0553, 0554, 0555, 0556, 0557, 0560, 0561, 0562,
631*7556134aSSascha Wildner 	0532, 0563, 0564, 0565, 0566, 0567, 0570, 0571, 0627, 0630, 0572, 0573,
632*7556134aSSascha Wildner 	0574, 0575, 0576, 0577, 0600, 0601, 0602, 0603, 0604, 0605, 0606, 0607,
633*7556134aSSascha Wildner 	0610, 0611, 0612, 0613, 0614, 0615, 0616, 0617, 0620, 0621, 0622, 0623,
634*7556134aSSascha Wildner 	0624, 0625, 0626, 0423, 0424, 0425, 0426, 0427, 0430, 0431,
635*7556134aSSascha Wildner 	0432, 0433, 0434, 0435, 0436, 0437, 0440, 0441, 0442, 0443, 0444, 0445,
636*7556134aSSascha Wildner 	0446, 0447, 0450, 0451, 0452, 0453, 0454, 0455, 0456, 0457, 0460, 0461,
637*7556134aSSascha Wildner 	0462, 0463, 0464, 0465, 0466, 0467, 0470, 0471, 0472, 0473, 0474, 0475,
638*7556134aSSascha Wildner 	0476, 0477, 0500, 0501, 0502, 0503, 0504, 0505, 0506, 0507
639*7556134aSSascha Wildner };
640*7556134aSSascha Wildner 
641*7556134aSSascha Wildner int attributes_set[9];
642*7556134aSSascha Wildner 
643*7556134aSSascha Wildner static int nc_attributes = 0;	/* global attributes for new_curse to observe */
644*7556134aSSascha Wildner 
645*7556134aSSascha Wildner #ifdef SYS5
646*7556134aSSascha Wildner struct termio Terminal;
647*7556134aSSascha Wildner struct termio Saved_tty;
648*7556134aSSascha Wildner #else
649*7556134aSSascha Wildner struct sgttyb Terminal;
650*7556134aSSascha Wildner struct sgttyb Saved_tty;
651*7556134aSSascha Wildner #endif
652*7556134aSSascha Wildner 
653*7556134aSSascha Wildner char *tc_;
654*7556134aSSascha Wildner 
655*7556134aSSascha Wildner int Booleans[128];
656*7556134aSSascha Wildner int Numbers[128];
657*7556134aSSascha Wildner char *String_table[1024];
658*7556134aSSascha Wildner 
659*7556134aSSascha Wildner int *virtual_lines;
660*7556134aSSascha Wildner 
661*7556134aSSascha Wildner static char nc_scrolling_ability = FALSE;
662*7556134aSSascha Wildner 
663*7556134aSSascha Wildner char *terminfo_path[] = {
664*7556134aSSascha Wildner         "/usr/lib/terminfo",
665*7556134aSSascha Wildner         "/usr/share/lib/terminfo",
666*7556134aSSascha Wildner         "/usr/share/terminfo",
667*7556134aSSascha Wildner         NULL
668*7556134aSSascha Wildner         };
669*7556134aSSascha Wildner 
670*7556134aSSascha Wildner #ifdef CAP
671*7556134aSSascha Wildner 
672*7556134aSSascha Wildner #if defined(__STDC__) || defined(__cplusplus)
673*7556134aSSascha Wildner #define P_(s) s
674*7556134aSSascha Wildner #else
675*7556134aSSascha Wildner #define P_(s) ()
676*7556134aSSascha Wildner #endif /* __STDC__ */
677*7556134aSSascha Wildner 
678*7556134aSSascha Wildner int tc_Get_int P_((int));
679*7556134aSSascha Wildner void CAP_PARSE P_((void));
680*7556134aSSascha Wildner void Find_term P_((void));
681*7556134aSSascha Wildner 
682*7556134aSSascha Wildner #undef P_
683*7556134aSSascha Wildner 
684*7556134aSSascha Wildner #endif /* CAP */
685*7556134aSSascha Wildner 
686*7556134aSSascha Wildner 
687*7556134aSSascha Wildner #ifndef __STDC__
688*7556134aSSascha Wildner #ifndef HAS_STDLIB
689*7556134aSSascha Wildner extern char *fgets();
690*7556134aSSascha Wildner extern char *malloc();
691*7556134aSSascha Wildner extern char *getenv();
692*7556134aSSascha Wildner FILE *fopen();			/* declaration for open function	*/
693*7556134aSSascha Wildner #endif /* HAS_STDLIB */
694*7556134aSSascha Wildner #endif /* __STDC__ */
695*7556134aSSascha Wildner 
696*7556134aSSascha Wildner #ifdef SIGWINCH
697*7556134aSSascha Wildner 
698*7556134aSSascha Wildner /*
699*7556134aSSascha Wildner  |	Copy the contents of one window to another.
700*7556134aSSascha Wildner  */
701*7556134aSSascha Wildner 
702*7556134aSSascha Wildner void
copy_window(origin,destination)703*7556134aSSascha Wildner copy_window(origin, destination)
704*7556134aSSascha Wildner WINDOW *origin, *destination;
705*7556134aSSascha Wildner {
706*7556134aSSascha Wildner 	int row, column;
707*7556134aSSascha Wildner 	struct _line *orig, *dest;
708*7556134aSSascha Wildner 
709*7556134aSSascha Wildner 	orig = origin->first_line;
710*7556134aSSascha Wildner 	dest = destination->first_line;
711*7556134aSSascha Wildner 
712*7556134aSSascha Wildner 	for (row = 0;
713*7556134aSSascha Wildner 		row < (min(origin->Num_lines, destination->Num_lines));
714*7556134aSSascha Wildner 			row++)
715*7556134aSSascha Wildner 	{
716*7556134aSSascha Wildner 		for (column = 0;
717*7556134aSSascha Wildner 		    column < (min(origin->Num_cols, destination->Num_cols));
718*7556134aSSascha Wildner 			column++)
719*7556134aSSascha Wildner 		{
720*7556134aSSascha Wildner 			dest->row[column] = orig->row[column];
721*7556134aSSascha Wildner 			dest->attributes[column] = orig->attributes[column];
722*7556134aSSascha Wildner 		}
723*7556134aSSascha Wildner 		dest->changed = orig->changed;
724*7556134aSSascha Wildner 		dest->scroll = orig->scroll;
725*7556134aSSascha Wildner 		dest->last_char = min(orig->last_char, destination->Num_cols);
726*7556134aSSascha Wildner 		orig = orig->next_screen;
727*7556134aSSascha Wildner 		dest = dest->next_screen;
728*7556134aSSascha Wildner 	}
729*7556134aSSascha Wildner 	destination->LX = min((destination->Num_cols - 1), origin->LX);
730*7556134aSSascha Wildner 	destination->LY = min((destination->Num_lines - 1), origin->LY);
731*7556134aSSascha Wildner 	destination->Attrib = origin->Attrib;
732*7556134aSSascha Wildner 	destination->scroll_up = origin->scroll_up;
733*7556134aSSascha Wildner 	destination->scroll_down = origin->scroll_down;
734*7556134aSSascha Wildner 	destination->SCROLL_CLEAR = origin->SCROLL_CLEAR;
735*7556134aSSascha Wildner }
736*7556134aSSascha Wildner 
737*7556134aSSascha Wildner void
reinitscr(foo)738*7556134aSSascha Wildner reinitscr(foo)
739*7556134aSSascha Wildner int foo;
740*7556134aSSascha Wildner {
741*7556134aSSascha Wildner 	WINDOW *local_virt;
742*7556134aSSascha Wildner 	WINDOW *local_std;
743*7556134aSSascha Wildner 	WINDOW *local_cur;
744*7556134aSSascha Wildner 
745*7556134aSSascha Wildner 	signal(SIGWINCH, reinitscr);
746*7556134aSSascha Wildner #ifdef TIOCGWINSZ
747*7556134aSSascha Wildner 	if (ioctl(0, TIOCGWINSZ, &ws) >= 0)
748*7556134aSSascha Wildner 	{
749*7556134aSSascha Wildner 		if (ws.ws_row == LINES && ws.ws_col == COLS)
750*7556134aSSascha Wildner 			return;
751*7556134aSSascha Wildner 		if (ws.ws_row > 0)
752*7556134aSSascha Wildner 			LINES = ws.ws_row;
753*7556134aSSascha Wildner 		if (ws.ws_col > 0)
754*7556134aSSascha Wildner 			COLS = ws.ws_col;
755*7556134aSSascha Wildner 	}
756*7556134aSSascha Wildner #endif /* TIOCGWINSZ */
757*7556134aSSascha Wildner 	local_virt = newwin(LINES, COLS, 0, 0);
758*7556134aSSascha Wildner 	local_std = newwin(LINES, COLS, 0, 0);
759*7556134aSSascha Wildner 	local_cur = newwin(LINES, COLS, 0, 0);
760*7556134aSSascha Wildner 	copy_window(virtual_scr, local_virt);
761*7556134aSSascha Wildner 	copy_window(stdscr, local_std);
762*7556134aSSascha Wildner 	copy_window(curscr, local_cur);
763*7556134aSSascha Wildner 	delwin(virtual_scr);
764*7556134aSSascha Wildner 	delwin(stdscr);
765*7556134aSSascha Wildner 	delwin(curscr);
766*7556134aSSascha Wildner 	virtual_scr = local_virt;
767*7556134aSSascha Wildner 	stdscr = local_std;
768*7556134aSSascha Wildner 	curscr = local_cur;
769*7556134aSSascha Wildner 	free(virtual_lines);
770*7556134aSSascha Wildner 	virtual_lines = (int *) malloc(LINES * (sizeof(int)));
771*7556134aSSascha Wildner 	interrupt_flag = TRUE;
772*7556134aSSascha Wildner }
773*7556134aSSascha Wildner #endif /* SIGWINCH */
774*7556134aSSascha Wildner 
775*7556134aSSascha Wildner void
initscr()776*7556134aSSascha Wildner initscr()		/* initialize terminal for operations	*/
777*7556134aSSascha Wildner {
778*7556134aSSascha Wildner 	int value;
779*7556134aSSascha Wildner 	int counter;
780*7556134aSSascha Wildner 	char *lines_string;
781*7556134aSSascha Wildner 	char *columns_string;
782*7556134aSSascha Wildner #ifdef CAP
783*7556134aSSascha Wildner 	char *pointer;
784*7556134aSSascha Wildner #endif /* CAP */
785*7556134aSSascha Wildner 
786*7556134aSSascha Wildner #ifdef DIAG
787*7556134aSSascha Wildner printf("starting initscr \n");fflush(stdout);
788*7556134aSSascha Wildner #endif
789*7556134aSSascha Wildner 	if (initialized)
790*7556134aSSascha Wildner 		return;
791*7556134aSSascha Wildner #ifdef BSD_SELECT
792*7556134aSSascha Wildner 	setbuf(stdin, NULL);
793*7556134aSSascha Wildner #endif /* BSD_SELECT */
794*7556134aSSascha Wildner 	Flip_Bytes = FALSE;
795*7556134aSSascha Wildner 	Parity = 0;
796*7556134aSSascha Wildner 	Time_Out = FALSE;
797*7556134aSSascha Wildner 	bufp = 0;
798*7556134aSSascha Wildner 	Move_It = FALSE;
799*7556134aSSascha Wildner 	Noblock = FALSE;
800*7556134aSSascha Wildner #ifdef SYS5
801*7556134aSSascha Wildner 	value = ioctl(0, TCGETA, &Terminal);
802*7556134aSSascha Wildner 	if (Terminal.c_cflag & PARENB)
803*7556134aSSascha Wildner 	{
804*7556134aSSascha Wildner 		if (Terminal.c_cflag & PARENB)
805*7556134aSSascha Wildner 			Parity = 1;
806*7556134aSSascha Wildner 		else
807*7556134aSSascha Wildner 			Parity = 2;
808*7556134aSSascha Wildner 	}
809*7556134aSSascha Wildner 	if ((Terminal.c_cflag & CS8) == CS8)
810*7556134aSSascha Wildner 	{
811*7556134aSSascha Wildner 		Num_bits = 8;
812*7556134aSSascha Wildner 	}
813*7556134aSSascha Wildner 	else if ((Terminal.c_cflag & CS7) == CS7)
814*7556134aSSascha Wildner 		Num_bits = 7;
815*7556134aSSascha Wildner 	else if ((Terminal.c_cflag & CS6) == CS6)
816*7556134aSSascha Wildner 		Num_bits = 6;
817*7556134aSSascha Wildner 	else
818*7556134aSSascha Wildner 		Num_bits = 5;
819*7556134aSSascha Wildner 	value = Terminal.c_cflag & 037;
820*7556134aSSascha Wildner 	switch (value) {
821*7556134aSSascha Wildner 	case 01:	speed = 50.0;
822*7556134aSSascha Wildner 		break;
823*7556134aSSascha Wildner 	case 02:	speed = 75.0;
824*7556134aSSascha Wildner 		break;
825*7556134aSSascha Wildner 	case 03:	speed = 110.0;
826*7556134aSSascha Wildner 		break;
827*7556134aSSascha Wildner 	case 04:	speed = 134.5;
828*7556134aSSascha Wildner 		break;
829*7556134aSSascha Wildner 	case 05:	speed = 150.0;
830*7556134aSSascha Wildner 		break;
831*7556134aSSascha Wildner 	case 06:	speed = 200.0;
832*7556134aSSascha Wildner 		break;
833*7556134aSSascha Wildner 	case 07:	speed = 300.0;
834*7556134aSSascha Wildner 		break;
835*7556134aSSascha Wildner 	case 010:	speed = 600.0;
836*7556134aSSascha Wildner 		break;
837*7556134aSSascha Wildner 	case 011:	speed = 900.0;
838*7556134aSSascha Wildner 		break;
839*7556134aSSascha Wildner 	case 012:	speed = 1200.0;
840*7556134aSSascha Wildner 		break;
841*7556134aSSascha Wildner 	case 013:	speed = 1800.0;
842*7556134aSSascha Wildner 		break;
843*7556134aSSascha Wildner 	case 014:	speed = 2400.0;
844*7556134aSSascha Wildner 		break;
845*7556134aSSascha Wildner 	case 015:	speed = 3600.0;
846*7556134aSSascha Wildner 		break;
847*7556134aSSascha Wildner 	case 016:	speed = 4800.0;
848*7556134aSSascha Wildner 		break;
849*7556134aSSascha Wildner 	case 017:	speed = 7200.0;
850*7556134aSSascha Wildner 		break;
851*7556134aSSascha Wildner 	case 020:	speed = 9600.0;
852*7556134aSSascha Wildner 		break;
853*7556134aSSascha Wildner 	case 021:	speed = 19200.0;
854*7556134aSSascha Wildner 		break;
855*7556134aSSascha Wildner 	case 022:	speed = 38400.0;
856*7556134aSSascha Wildner 		break;
857*7556134aSSascha Wildner 	default:	speed = 0.0;
858*7556134aSSascha Wildner 	}
859*7556134aSSascha Wildner #else
860*7556134aSSascha Wildner 	value = ioctl(0, TIOCGETP, &Terminal);
861*7556134aSSascha Wildner 	if (Terminal.sg_flags & EVENP)
862*7556134aSSascha Wildner 		Parity = 2;
863*7556134aSSascha Wildner 	else if (Terminal.sg_flags & ODDP)
864*7556134aSSascha Wildner 		Parity = 1;
865*7556134aSSascha Wildner 	value = Terminal.sg_ospeed;
866*7556134aSSascha Wildner 	switch (value) {
867*7556134aSSascha Wildner 	case 01:	speed = 50.0;
868*7556134aSSascha Wildner 		break;
869*7556134aSSascha Wildner 	case 02:	speed = 75.0;
870*7556134aSSascha Wildner 		break;
871*7556134aSSascha Wildner 	case 03:	speed = 110.0;
872*7556134aSSascha Wildner 		break;
873*7556134aSSascha Wildner 	case 04:	speed = 134.5;
874*7556134aSSascha Wildner 		break;
875*7556134aSSascha Wildner 	case 05:	speed = 150.0;
876*7556134aSSascha Wildner 		break;
877*7556134aSSascha Wildner 	case 06:	speed = 200.0;
878*7556134aSSascha Wildner 		break;
879*7556134aSSascha Wildner 	case 07:	speed = 300.0;
880*7556134aSSascha Wildner 		break;
881*7556134aSSascha Wildner 	case 010:	speed = 600.0;
882*7556134aSSascha Wildner 		break;
883*7556134aSSascha Wildner 	case 011:	speed = 1200.0;
884*7556134aSSascha Wildner 		break;
885*7556134aSSascha Wildner 	case 012:	speed = 1800.0;
886*7556134aSSascha Wildner 		break;
887*7556134aSSascha Wildner 	case 013:	speed = 2400.0;
888*7556134aSSascha Wildner 		break;
889*7556134aSSascha Wildner 	case 014:	speed = 4800.0;
890*7556134aSSascha Wildner 		break;
891*7556134aSSascha Wildner 	case 015:	speed = 9600.0;
892*7556134aSSascha Wildner 		break;
893*7556134aSSascha Wildner 	default:	speed = 0.0;
894*7556134aSSascha Wildner 	}
895*7556134aSSascha Wildner #endif
896*7556134aSSascha Wildner 	chars_per_millisecond = (0.001 * speed) / 8.0;
897*7556134aSSascha Wildner 	TERMINAL_TYPE = getenv("TERM");
898*7556134aSSascha Wildner 	if (TERMINAL_TYPE == NULL)
899*7556134aSSascha Wildner 	{
900*7556134aSSascha Wildner 		printf("unknown terminal type\n");
901*7556134aSSascha Wildner 		exit(0);
902*7556134aSSascha Wildner 	}
903*7556134aSSascha Wildner #ifndef CAP
904*7556134aSSascha Wildner 	Fildes = -1;
905*7556134aSSascha Wildner 	TERM_PATH = getenv("TERMINFO");
906*7556134aSSascha Wildner 	if (TERM_PATH != NULL)
907*7556134aSSascha Wildner 	{
908*7556134aSSascha Wildner 		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
909*7556134aSSascha Wildner 		Term_File_name = malloc(Data_Line_len);
910*7556134aSSascha Wildner 		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
911*7556134aSSascha Wildner 		Fildes = open(Term_File_name, O_RDONLY);
912*7556134aSSascha Wildner 		if (Fildes == -1)
913*7556134aSSascha Wildner 		{
914*7556134aSSascha Wildner         		sprintf(Term_File_name, "%s/%x/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
915*7556134aSSascha Wildner         		Fildes = open(Term_File_name, O_RDONLY);
916*7556134aSSascha Wildner 		}
917*7556134aSSascha Wildner 	}
918*7556134aSSascha Wildner 	counter = 0;
919*7556134aSSascha Wildner 	while ((Fildes == -1) && (terminfo_path[counter] != NULL))
920*7556134aSSascha Wildner 	{
921*7556134aSSascha Wildner 		TERM_PATH = terminfo_path[counter];
922*7556134aSSascha Wildner 		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
923*7556134aSSascha Wildner 		Term_File_name = malloc(Data_Line_len);
924*7556134aSSascha Wildner 		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
925*7556134aSSascha Wildner 		Fildes = open(Term_File_name, O_RDONLY);
926*7556134aSSascha Wildner 		if (Fildes == -1)
927*7556134aSSascha Wildner 		{
928*7556134aSSascha Wildner         		sprintf(Term_File_name, "%s/%x/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
929*7556134aSSascha Wildner         		Fildes = open(Term_File_name, O_RDONLY);
930*7556134aSSascha Wildner 		}
931*7556134aSSascha Wildner 		counter++;
932*7556134aSSascha Wildner 	}
933*7556134aSSascha Wildner 	if (Fildes == -1)
934*7556134aSSascha Wildner 	{
935*7556134aSSascha Wildner 		free(Term_File_name);
936*7556134aSSascha Wildner 		Term_File_name = NULL;
937*7556134aSSascha Wildner 	}
938*7556134aSSascha Wildner 	else
939*7556134aSSascha Wildner 		TERM_INFO = INFO_PARSE();
940*7556134aSSascha Wildner #else
941*7556134aSSascha Wildner 	/*
942*7556134aSSascha Wildner 	 |	termcap information can be in the TERMCAP env variable, if so
943*7556134aSSascha Wildner 	 |	use that, otherwise check the /etc/termcap file
944*7556134aSSascha Wildner 	 */
945*7556134aSSascha Wildner 	if ((pointer = Term_File_name = getenv("TERMCAP")) != NULL)
946*7556134aSSascha Wildner 	{
947*7556134aSSascha Wildner 		if (*Term_File_name != '/')
948*7556134aSSascha Wildner 			Term_File_name = TERMCAP;
949*7556134aSSascha Wildner 	}
950*7556134aSSascha Wildner 	else
951*7556134aSSascha Wildner 	{
952*7556134aSSascha Wildner 		Term_File_name = TERMCAP;
953*7556134aSSascha Wildner 	}
954*7556134aSSascha Wildner 	if ((TFP = fopen(Term_File_name, "r")) == NULL)
955*7556134aSSascha Wildner 	{
956*7556134aSSascha Wildner 		printf("unable to open %s file \n", TERMCAP);
957*7556134aSSascha Wildner 		exit(0);
958*7556134aSSascha Wildner 	}
959*7556134aSSascha Wildner  	for (value = 0; value < 1024; value++)
960*7556134aSSascha Wildner 		String_table[value] = NULL;
961*7556134aSSascha Wildner 	for (value = 0; value < 128; value++)
962*7556134aSSascha Wildner 		Booleans[value] = 0;
963*7556134aSSascha Wildner 	for (value = 0; value < 128; value++)
964*7556134aSSascha Wildner 		Numbers[value] = 0;
965*7556134aSSascha Wildner 	Data_Line = malloc(512);
966*7556134aSSascha Wildner 	if (pointer && *pointer != '/')
967*7556134aSSascha Wildner 	{
968*7556134aSSascha Wildner 		TERM_data_ptr = pointer;
969*7556134aSSascha Wildner 		CAP_PARSE();
970*7556134aSSascha Wildner 	}
971*7556134aSSascha Wildner 	else
972*7556134aSSascha Wildner 	{
973*7556134aSSascha Wildner 		Find_term();
974*7556134aSSascha Wildner 		CAP_PARSE();
975*7556134aSSascha Wildner 	}
976*7556134aSSascha Wildner #endif
977*7556134aSSascha Wildner 	if (String_table[pc__] == NULL)
978*7556134aSSascha Wildner 		String_table[pc__] = "\0";
979*7556134aSSascha Wildner 	if ((String_table[cm__] == NULL) || (Booleans[hc__]))
980*7556134aSSascha Wildner 	{
981*7556134aSSascha Wildner 		fprintf(stderr, "sorry, unable to use this terminal type for screen editing\n");
982*7556134aSSascha Wildner 		exit(0);
983*7556134aSSascha Wildner 	}
984*7556134aSSascha Wildner 	Key_Get();
985*7556134aSSascha Wildner 	keys_vt100();
986*7556134aSSascha Wildner 	LINES = Numbers[li__];
987*7556134aSSascha Wildner 	COLS = Numbers[co__];
988*7556134aSSascha Wildner 	if ((lines_string = getenv("LINES")) != NULL)
989*7556134aSSascha Wildner 	{
990*7556134aSSascha Wildner 		value = atoi(lines_string);
991*7556134aSSascha Wildner 		if (value > 0)
992*7556134aSSascha Wildner 			LINES = value;
993*7556134aSSascha Wildner 	}
994*7556134aSSascha Wildner 	if ((columns_string = getenv("COLUMNS")) != NULL)
995*7556134aSSascha Wildner 	{
996*7556134aSSascha Wildner 		value = atoi(columns_string);
997*7556134aSSascha Wildner 		if (value > 0)
998*7556134aSSascha Wildner 			COLS = value;
999*7556134aSSascha Wildner 	}
1000*7556134aSSascha Wildner #ifdef TIOCGWINSZ
1001*7556134aSSascha Wildner 	/*
1002*7556134aSSascha Wildner 	 |	get the window size
1003*7556134aSSascha Wildner 	 */
1004*7556134aSSascha Wildner 	if (ioctl(0, TIOCGWINSZ, &ws) >= 0)
1005*7556134aSSascha Wildner 	{
1006*7556134aSSascha Wildner 		if (ws.ws_row > 0)
1007*7556134aSSascha Wildner 			LINES = ws.ws_row;
1008*7556134aSSascha Wildner 		if (ws.ws_col > 0)
1009*7556134aSSascha Wildner 			COLS = ws.ws_col;
1010*7556134aSSascha Wildner 	}
1011*7556134aSSascha Wildner #endif
1012*7556134aSSascha Wildner 	virtual_scr = newwin(LINES, COLS, 0, 0);
1013*7556134aSSascha Wildner 	stdscr = newwin(LINES, COLS, 0, 0);
1014*7556134aSSascha Wildner 	curscr = newwin(LINES, COLS, 0, 0);
1015*7556134aSSascha Wildner 	wmove(stdscr, 0, 0);
1016*7556134aSSascha Wildner 	werase(stdscr);
1017*7556134aSSascha Wildner 	Repaint_screen = TRUE;
1018*7556134aSSascha Wildner 	initialized = TRUE;
1019*7556134aSSascha Wildner 	virtual_lines = (int *) malloc(LINES * (sizeof(int)));
1020*7556134aSSascha Wildner 
1021*7556134aSSascha Wildner #ifdef SIGWINCH
1022*7556134aSSascha Wildner 	/*
1023*7556134aSSascha Wildner 	 |	reset size of windows and LINES and COLS if term window
1024*7556134aSSascha Wildner 	 |	changes size
1025*7556134aSSascha Wildner 	 */
1026*7556134aSSascha Wildner 	signal(SIGWINCH, reinitscr);
1027*7556134aSSascha Wildner #endif /* SIGWINCH */
1028*7556134aSSascha Wildner 
1029*7556134aSSascha Wildner 	/*
1030*7556134aSSascha Wildner 	 |	check if scrolling is available
1031*7556134aSSascha Wildner 	 */
1032*7556134aSSascha Wildner 
1033*7556134aSSascha Wildner 	nc_scrolling_ability = ((String_table[al__] != NULL) &&
1034*7556134aSSascha Wildner 				(String_table[dl__])) || ((String_table[cs__])
1035*7556134aSSascha Wildner 				&& (String_table[sr__]));
1036*7556134aSSascha Wildner 
1037*7556134aSSascha Wildner }
1038*7556134aSSascha Wildner 
1039*7556134aSSascha Wildner #ifndef CAP
1040*7556134aSSascha Wildner int
Get_int()1041*7556134aSSascha Wildner Get_int()		/* get a two-byte integer from the terminfo file */
1042*7556134aSSascha Wildner {
1043*7556134aSSascha Wildner 	int High_byte;
1044*7556134aSSascha Wildner 	int Low_byte;
1045*7556134aSSascha Wildner 	int temp;
1046*7556134aSSascha Wildner 
1047*7556134aSSascha Wildner 	Low_byte = *((unsigned char *) TERM_data_ptr++);
1048*7556134aSSascha Wildner 	High_byte = *((unsigned char *) TERM_data_ptr++);
1049*7556134aSSascha Wildner 	if (Flip_Bytes)
1050*7556134aSSascha Wildner 	{
1051*7556134aSSascha Wildner 		temp = Low_byte;
1052*7556134aSSascha Wildner 		Low_byte = High_byte;
1053*7556134aSSascha Wildner 		High_byte = temp;
1054*7556134aSSascha Wildner 	}
1055*7556134aSSascha Wildner 	if ((High_byte == 255) && (Low_byte == 255))
1056*7556134aSSascha Wildner 		return (-1);
1057*7556134aSSascha Wildner 	else
1058*7556134aSSascha Wildner 		return(Low_byte + (High_byte * 256));
1059*7556134aSSascha Wildner }
1060*7556134aSSascha Wildner 
1061*7556134aSSascha Wildner int
INFO_PARSE()1062*7556134aSSascha Wildner INFO_PARSE()		/* parse off the data in the terminfo data file	*/
1063*7556134aSSascha Wildner {
1064*7556134aSSascha Wildner 	int offset;
1065*7556134aSSascha Wildner 	int magic_number = 0;
1066*7556134aSSascha Wildner 	int counter = 0;
1067*7556134aSSascha Wildner 	int Num_names = 0;
1068*7556134aSSascha Wildner 	int Num_bools = 0;
1069*7556134aSSascha Wildner 	int Num_ints = 0;
1070*7556134aSSascha Wildner 	int Num_strings = 0;
1071*7556134aSSascha Wildner 	int string_table_len = 0;
1072*7556134aSSascha Wildner 	char *temp_ptr;
1073*7556134aSSascha Wildner 
1074*7556134aSSascha Wildner 	TERM_data_ptr = Data_Line = malloc((10240 * (sizeof(char))));
1075*7556134aSSascha Wildner 	Data_Line_len = read(Fildes, Data_Line, 10240);
1076*7556134aSSascha Wildner 	if ((Data_Line_len >= 10240) || (Data_Line_len < 0))
1077*7556134aSSascha Wildner 		return(0);
1078*7556134aSSascha Wildner 	/*
1079*7556134aSSascha Wildner 	 |	get magic number
1080*7556134aSSascha Wildner 	 */
1081*7556134aSSascha Wildner 	magic_number = Get_int();
1082*7556134aSSascha Wildner 	/*
1083*7556134aSSascha Wildner 	 |	if magic number not right, reverse byte order and check again
1084*7556134aSSascha Wildner 	 */
1085*7556134aSSascha Wildner 	if (magic_number != 282)
1086*7556134aSSascha Wildner 	{
1087*7556134aSSascha Wildner 		Flip_Bytes = TRUE;
1088*7556134aSSascha Wildner 		TERM_data_ptr--;
1089*7556134aSSascha Wildner 		TERM_data_ptr--;
1090*7556134aSSascha Wildner 		magic_number = Get_int();
1091*7556134aSSascha Wildner 		if (magic_number != 282)
1092*7556134aSSascha Wildner 			return(0);
1093*7556134aSSascha Wildner 	}
1094*7556134aSSascha Wildner 	/*
1095*7556134aSSascha Wildner 	 |	get the number of each type in the terminfo data file
1096*7556134aSSascha Wildner 	 */
1097*7556134aSSascha Wildner 	Num_names = Get_int();
1098*7556134aSSascha Wildner 	Num_bools = Get_int();
1099*7556134aSSascha Wildner 	Num_ints = Get_int();
1100*7556134aSSascha Wildner 	Num_strings = Get_int();
1101*7556134aSSascha Wildner 	string_table_len = Get_int();
1102*7556134aSSascha Wildner 	Strings = malloc(string_table_len);
1103*7556134aSSascha Wildner 	while (Num_names > 0)
1104*7556134aSSascha Wildner 	{
1105*7556134aSSascha Wildner 		TERM_data_ptr++;
1106*7556134aSSascha Wildner 		Num_names--;
1107*7556134aSSascha Wildner 	}
1108*7556134aSSascha Wildner 	counter = 0;
1109*7556134aSSascha Wildner 	while (Num_bools)
1110*7556134aSSascha Wildner 	{
1111*7556134aSSascha Wildner 		Num_bools--;
1112*7556134aSSascha Wildner 		Booleans[counter++] = *TERM_data_ptr++;
1113*7556134aSSascha Wildner 	}
1114*7556134aSSascha Wildner 	if ((unsigned long)TERM_data_ptr & 1)	/* force alignment	*/
1115*7556134aSSascha Wildner 		TERM_data_ptr++;
1116*7556134aSSascha Wildner 	counter = 0;
1117*7556134aSSascha Wildner 	while (Num_ints)
1118*7556134aSSascha Wildner 	{
1119*7556134aSSascha Wildner 		Num_ints--;
1120*7556134aSSascha Wildner 		Numbers[counter] = Get_int();
1121*7556134aSSascha Wildner 		counter++;
1122*7556134aSSascha Wildner 	}
1123*7556134aSSascha Wildner 	temp_ptr = TERM_data_ptr + Num_strings + Num_strings;
1124*7556134aSSascha Wildner 	memcpy(Strings, temp_ptr, string_table_len);
1125*7556134aSSascha Wildner 	counter = bt__;
1126*7556134aSSascha Wildner 	while (Num_strings)
1127*7556134aSSascha Wildner 	{
1128*7556134aSSascha Wildner 		Num_strings--;
1129*7556134aSSascha Wildner 		if ((offset=Get_int()) != -1)
1130*7556134aSSascha Wildner 		{
1131*7556134aSSascha Wildner 			if (String_table[counter] == NULL)
1132*7556134aSSascha Wildner 				String_table[counter] = Strings + offset;
1133*7556134aSSascha Wildner 		}
1134*7556134aSSascha Wildner 		else
1135*7556134aSSascha Wildner 			String_table[counter] = NULL;
1136*7556134aSSascha Wildner 		counter++;
1137*7556134aSSascha Wildner 	}
1138*7556134aSSascha Wildner 	close(Fildes);
1139*7556134aSSascha Wildner 	free(Data_Line);
1140*7556134aSSascha Wildner 	return(TRUE);
1141*7556134aSSascha Wildner }
1142*7556134aSSascha Wildner #endif		/* ifndef CAP	*/
1143*7556134aSSascha Wildner 
1144*7556134aSSascha Wildner int
AtoI()1145*7556134aSSascha Wildner AtoI()		/* convert ascii text to integers	*/
1146*7556134aSSascha Wildner {
1147*7556134aSSascha Wildner 	int Temp;
1148*7556134aSSascha Wildner 
1149*7556134aSSascha Wildner 	Temp = 0;
1150*7556134aSSascha Wildner 	while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
1151*7556134aSSascha Wildner 	{
1152*7556134aSSascha Wildner 		Temp = (Temp * 10) + (*TERM_data_ptr - '0');
1153*7556134aSSascha Wildner 		TERM_data_ptr++;
1154*7556134aSSascha Wildner 	}
1155*7556134aSSascha Wildner 	return(Temp);
1156*7556134aSSascha Wildner }
1157*7556134aSSascha Wildner 
1158*7556134aSSascha Wildner void
Key_Get()1159*7556134aSSascha Wildner Key_Get()		/* create linked list with all key sequences obtained from terminal database	*/
1160*7556134aSSascha Wildner {
1161*7556134aSSascha Wildner 	int Counter;
1162*7556134aSSascha Wildner 	int Klen;
1163*7556134aSSascha Wildner 	int key_def;
1164*7556134aSSascha Wildner 	struct KEY_STACK *Spoint;
1165*7556134aSSascha Wildner 
1166*7556134aSSascha Wildner 	Max_Key_len = 0;
1167*7556134aSSascha Wildner 	Counter = 0;
1168*7556134aSSascha Wildner 	key_def = kb__;
1169*7556134aSSascha Wildner 	while (key_def <= kf63__)
1170*7556134aSSascha Wildner 	{
1171*7556134aSSascha Wildner 		if (key_def == ke__)
1172*7556134aSSascha Wildner 			key_def = K1__;
1173*7556134aSSascha Wildner 		else if (key_def == (K5__ + 1))
1174*7556134aSSascha Wildner 			key_def = kcbt__;
1175*7556134aSSascha Wildner 		else if (key_def == (kcbt__ + 1))
1176*7556134aSSascha Wildner 			key_def = kbeg__;
1177*7556134aSSascha Wildner 		else if (key_def == (kUND__ + 1))
1178*7556134aSSascha Wildner 			key_def = kf11__;
1179*7556134aSSascha Wildner 		if (String_table[key_def] != NULL)
1180*7556134aSSascha Wildner 		{
1181*7556134aSSascha Wildner 			if (KEY_TOS == NULL)
1182*7556134aSSascha Wildner 				Spoint = KEY_TOS = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
1183*7556134aSSascha Wildner 			else
1184*7556134aSSascha Wildner 			{
1185*7556134aSSascha Wildner 				Spoint = KEY_TOS;
1186*7556134aSSascha Wildner 				while (Spoint->next != NULL)
1187*7556134aSSascha Wildner 					Spoint = Spoint->next;
1188*7556134aSSascha Wildner 				Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
1189*7556134aSSascha Wildner 				Spoint = Spoint->next;
1190*7556134aSSascha Wildner 			}
1191*7556134aSSascha Wildner 			Spoint->next = NULL;
1192*7556134aSSascha Wildner 			Spoint->element = (struct KEYS *) malloc(sizeof(struct KEYS));
1193*7556134aSSascha Wildner 			Spoint->element->string = String_table[key_def];
1194*7556134aSSascha Wildner 			Spoint->element->length = strlen(String_table[key_def]);
1195*7556134aSSascha Wildner 			Spoint->element->value = Key_vals[Counter];
1196*7556134aSSascha Wildner 			Klen = strlen(Spoint->element->string);
1197*7556134aSSascha Wildner 			if (Klen > Max_Key_len)
1198*7556134aSSascha Wildner 				Max_Key_len = Klen;
1199*7556134aSSascha Wildner 			/*
1200*7556134aSSascha Wildner 			 |  Some terminal types accept keystrokes of the form
1201*7556134aSSascha Wildner 			 |  \E[A and \EOA, substituting '[' for 'O'.  Make a
1202*7556134aSSascha Wildner 			 |  duplicate of such key strings (since the
1203*7556134aSSascha Wildner 			 |  database will only have one version) so new_curse
1204*7556134aSSascha Wildner 			 |  can understand both.
1205*7556134aSSascha Wildner 			 */
1206*7556134aSSascha Wildner 			if ((Spoint->element->length > 1) &&
1207*7556134aSSascha Wildner 			    ((String_table[key_def][1] == '[') ||
1208*7556134aSSascha Wildner 			     (String_table[key_def][1] == 'O')))
1209*7556134aSSascha Wildner 			{
1210*7556134aSSascha Wildner 				Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
1211*7556134aSSascha Wildner 				Spoint = Spoint->next;
1212*7556134aSSascha Wildner 				Spoint->next = NULL;
1213*7556134aSSascha Wildner 				Spoint->element = (struct KEYS *) malloc(sizeof(struct KEYS));
1214*7556134aSSascha Wildner 				Spoint->element->length = strlen(String_table[key_def]);
1215*7556134aSSascha Wildner 				Spoint->element->string = malloc(Spoint->element->length + 1);
1216*7556134aSSascha Wildner 				strcpy(Spoint->element->string, String_table[key_def]);
1217*7556134aSSascha Wildner 				Spoint->element->value = Key_vals[Counter];
1218*7556134aSSascha Wildner 				Klen = strlen(Spoint->element->string);
1219*7556134aSSascha Wildner 				if (Klen > Max_Key_len)
1220*7556134aSSascha Wildner 					Max_Key_len = Klen;
1221*7556134aSSascha Wildner 
1222*7556134aSSascha Wildner 				if (String_table[key_def][1] == '[')
1223*7556134aSSascha Wildner 					Spoint->element->string[1] = 'O';
1224*7556134aSSascha Wildner 				else
1225*7556134aSSascha Wildner 					Spoint->element->string[1] = '[';
1226*7556134aSSascha Wildner 			}
1227*7556134aSSascha Wildner 		}
1228*7556134aSSascha Wildner 		key_def++;
1229*7556134aSSascha Wildner 		Counter++;
1230*7556134aSSascha Wildner 	}
1231*7556134aSSascha Wildner }
1232*7556134aSSascha Wildner 
1233*7556134aSSascha Wildner /*
1234*7556134aSSascha Wildner  |	insert information about keys for a vt100 terminal
1235*7556134aSSascha Wildner  */
1236*7556134aSSascha Wildner 
1237*7556134aSSascha Wildner void
keys_vt100()1238*7556134aSSascha Wildner keys_vt100()
1239*7556134aSSascha Wildner {
1240*7556134aSSascha Wildner 	int counter;
1241*7556134aSSascha Wildner 	int Klen;
1242*7556134aSSascha Wildner 	struct KEY_STACK *Spoint;
1243*7556134aSSascha Wildner 
1244*7556134aSSascha Wildner 	Spoint = KEY_TOS;
1245*7556134aSSascha Wildner 	while (Spoint->next != NULL)
1246*7556134aSSascha Wildner 		Spoint = Spoint->next;
1247*7556134aSSascha Wildner 	for (counter = 0; vt100[counter].length != 0; counter++)
1248*7556134aSSascha Wildner 	{
1249*7556134aSSascha Wildner 		Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
1250*7556134aSSascha Wildner 		Spoint = Spoint->next;
1251*7556134aSSascha Wildner 		Spoint->next = NULL;
1252*7556134aSSascha Wildner 		Spoint->element = &vt100[counter];
1253*7556134aSSascha Wildner 		Klen = strlen(Spoint->element->string);
1254*7556134aSSascha Wildner 		if (Klen > Max_Key_len)
1255*7556134aSSascha Wildner 			Max_Key_len = Klen;
1256*7556134aSSascha Wildner 	}
1257*7556134aSSascha Wildner }
1258*7556134aSSascha Wildner 
1259*7556134aSSascha Wildner #ifdef CAP
1260*7556134aSSascha Wildner char *
String_Get(param)1261*7556134aSSascha Wildner String_Get(param)		/* read the string */
1262*7556134aSSascha Wildner char *param;
1263*7556134aSSascha Wildner {
1264*7556134aSSascha Wildner 	char *String;
1265*7556134aSSascha Wildner 	char *Temp;
1266*7556134aSSascha Wildner 	int Counter;
1267*7556134aSSascha Wildner 
1268*7556134aSSascha Wildner 	if (param == NULL)
1269*7556134aSSascha Wildner 	{
1270*7556134aSSascha Wildner 		while (*TERM_data_ptr != '=')
1271*7556134aSSascha Wildner 			TERM_data_ptr++;
1272*7556134aSSascha Wildner 		Temp = ++TERM_data_ptr;
1273*7556134aSSascha Wildner 		Counter = 1;
1274*7556134aSSascha Wildner 		while ((*Temp != ':') && (*Temp != (char)NULL))
1275*7556134aSSascha Wildner 		{
1276*7556134aSSascha Wildner 			Counter++;
1277*7556134aSSascha Wildner 			Temp++;
1278*7556134aSSascha Wildner 		}
1279*7556134aSSascha Wildner 		if (Counter == 1)	/* no data */
1280*7556134aSSascha Wildner 			return(NULL);
1281*7556134aSSascha Wildner 		String = Temp = malloc(Counter);
1282*7556134aSSascha Wildner 		while ((*TERM_data_ptr != ':') && (*TERM_data_ptr != (char)NULL))
1283*7556134aSSascha Wildner 		{
1284*7556134aSSascha Wildner 			if (*TERM_data_ptr == '\\')
1285*7556134aSSascha Wildner 			{
1286*7556134aSSascha Wildner 				TERM_data_ptr++;
1287*7556134aSSascha Wildner 				if (*TERM_data_ptr == 'n')
1288*7556134aSSascha Wildner 					*Temp = '\n';
1289*7556134aSSascha Wildner 				else if (*TERM_data_ptr == 't')
1290*7556134aSSascha Wildner 					*Temp = '\t';
1291*7556134aSSascha Wildner 				else if (*TERM_data_ptr == 'b')
1292*7556134aSSascha Wildner 					*Temp = '\b';
1293*7556134aSSascha Wildner 				else if (*TERM_data_ptr == 'r')
1294*7556134aSSascha Wildner 					*Temp = '\r';
1295*7556134aSSascha Wildner 				else if (*TERM_data_ptr == 'f')
1296*7556134aSSascha Wildner 					*Temp = '\f';
1297*7556134aSSascha Wildner 				else if ((*TERM_data_ptr == 'e') || (*TERM_data_ptr == 'E'))
1298*7556134aSSascha Wildner 					*Temp = '\033';		/* escape */
1299*7556134aSSascha Wildner 				else if (*TERM_data_ptr == '\\')
1300*7556134aSSascha Wildner 					*Temp = '\\';
1301*7556134aSSascha Wildner 				else if (*TERM_data_ptr == '\'')
1302*7556134aSSascha Wildner 					*Temp = '\'';
1303*7556134aSSascha Wildner 				else if ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
1304*7556134aSSascha Wildner 				{
1305*7556134aSSascha Wildner 					Counter = 0;
1306*7556134aSSascha Wildner 					while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
1307*7556134aSSascha Wildner 					{
1308*7556134aSSascha Wildner 						Counter = (8 * Counter) + (*TERM_data_ptr - '0');
1309*7556134aSSascha Wildner 						TERM_data_ptr++;  /* ? */
1310*7556134aSSascha Wildner 					}
1311*7556134aSSascha Wildner 					*Temp = Counter;
1312*7556134aSSascha Wildner 					TERM_data_ptr--;
1313*7556134aSSascha Wildner 				}
1314*7556134aSSascha Wildner 				TERM_data_ptr++;
1315*7556134aSSascha Wildner 				Temp++;
1316*7556134aSSascha Wildner 			}
1317*7556134aSSascha Wildner 			else if (*TERM_data_ptr == '^')
1318*7556134aSSascha Wildner 			{
1319*7556134aSSascha Wildner 				TERM_data_ptr++;
1320*7556134aSSascha Wildner 				if ((*TERM_data_ptr >= '@') && (*TERM_data_ptr <= '_'))
1321*7556134aSSascha Wildner 					*Temp = *TERM_data_ptr - '@';
1322*7556134aSSascha Wildner 				else if (*TERM_data_ptr == '?')
1323*7556134aSSascha Wildner 					*Temp = 127;
1324*7556134aSSascha Wildner 				TERM_data_ptr++;
1325*7556134aSSascha Wildner 				Temp++;
1326*7556134aSSascha Wildner 			}
1327*7556134aSSascha Wildner 			else
1328*7556134aSSascha Wildner 				*Temp++ = *TERM_data_ptr++;
1329*7556134aSSascha Wildner 		}
1330*7556134aSSascha Wildner 		*Temp = (char)NULL;
1331*7556134aSSascha Wildner 		param = String;
1332*7556134aSSascha Wildner 	}
1333*7556134aSSascha Wildner 	else
1334*7556134aSSascha Wildner 	{
1335*7556134aSSascha Wildner 		while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != ':'))
1336*7556134aSSascha Wildner 			TERM_data_ptr++;
1337*7556134aSSascha Wildner 	}
1338*7556134aSSascha Wildner 	return(param);
1339*7556134aSSascha Wildner }
1340*7556134aSSascha Wildner 
1341*7556134aSSascha Wildner int
tc_Get_int(param)1342*7556134aSSascha Wildner tc_Get_int(param)		/* read the integer			*/
1343*7556134aSSascha Wildner int param;
1344*7556134aSSascha Wildner {
1345*7556134aSSascha Wildner 	int Itemp;
1346*7556134aSSascha Wildner 
1347*7556134aSSascha Wildner 	if (param == 0)
1348*7556134aSSascha Wildner 	{
1349*7556134aSSascha Wildner 		while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != '#'))
1350*7556134aSSascha Wildner 			TERM_data_ptr++;
1351*7556134aSSascha Wildner 		TERM_data_ptr++;
1352*7556134aSSascha Wildner 		Itemp = AtoI();
1353*7556134aSSascha Wildner 		param = Itemp;
1354*7556134aSSascha Wildner 	}
1355*7556134aSSascha Wildner 	else
1356*7556134aSSascha Wildner 	{
1357*7556134aSSascha Wildner 		while (*TERM_data_ptr != ':')
1358*7556134aSSascha Wildner 			TERM_data_ptr++;
1359*7556134aSSascha Wildner 	}
1360*7556134aSSascha Wildner 	return(param);
1361*7556134aSSascha Wildner }
1362*7556134aSSascha Wildner 
1363*7556134aSSascha Wildner void
Find_term()1364*7556134aSSascha Wildner Find_term()		/* find terminal description in termcap file	*/
1365*7556134aSSascha Wildner {
1366*7556134aSSascha Wildner 	char *Name;
1367*7556134aSSascha Wildner 	char *Ftemp;
1368*7556134aSSascha Wildner 
1369*7556134aSSascha Wildner 	Ftemp = Name = malloc(strlen(TERMINAL_TYPE) + 2);
1370*7556134aSSascha Wildner 	strcpy(Name, TERMINAL_TYPE);
1371*7556134aSSascha Wildner 	while (*Ftemp != (char)NULL)
1372*7556134aSSascha Wildner 		Ftemp++;
1373*7556134aSSascha Wildner 	*Ftemp++ = '|';
1374*7556134aSSascha Wildner 	*Ftemp = (char)NULL;
1375*7556134aSSascha Wildner 	CFOUND = FALSE;
1376*7556134aSSascha Wildner 	Data_Line_len = strlen(TERMINAL_TYPE) + 1;
1377*7556134aSSascha Wildner 	while ((!CFOUND) && ((TERM_data_ptr=fgets(Data_Line, 512, TFP)) != NULL))
1378*7556134aSSascha Wildner 	{
1379*7556134aSSascha Wildner 		if ((*TERM_data_ptr != ' ') && (*TERM_data_ptr != '\t') && (*TERM_data_ptr != '#'))
1380*7556134aSSascha Wildner 		{
1381*7556134aSSascha Wildner 			while ((!CFOUND) && (*TERM_data_ptr != (char)NULL))
1382*7556134aSSascha Wildner 			{
1383*7556134aSSascha Wildner 				CFOUND = !strncmp(TERM_data_ptr, Name, Data_Line_len);
1384*7556134aSSascha Wildner 				while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != '|') && (*TERM_data_ptr != '#') && (*TERM_data_ptr != ':'))
1385*7556134aSSascha Wildner 					TERM_data_ptr++;
1386*7556134aSSascha Wildner 				if (*TERM_data_ptr == '|')
1387*7556134aSSascha Wildner 					TERM_data_ptr++;
1388*7556134aSSascha Wildner 				else if (!CFOUND)
1389*7556134aSSascha Wildner 					*TERM_data_ptr = (char)NULL;
1390*7556134aSSascha Wildner 			}
1391*7556134aSSascha Wildner 		}
1392*7556134aSSascha Wildner 	}
1393*7556134aSSascha Wildner 	if (!CFOUND)
1394*7556134aSSascha Wildner 	{
1395*7556134aSSascha Wildner 		printf("terminal type %s not found\n", TERMINAL_TYPE);
1396*7556134aSSascha Wildner 		exit(0);
1397*7556134aSSascha Wildner 	}
1398*7556134aSSascha Wildner }
1399*7556134aSSascha Wildner 
1400*7556134aSSascha Wildner void
CAP_PARSE()1401*7556134aSSascha Wildner CAP_PARSE()		/* parse off the data in the termcap data file	*/
1402*7556134aSSascha Wildner {
1403*7556134aSSascha Wildner 	int offset;
1404*7556134aSSascha Wildner 	int found;
1405*7556134aSSascha Wildner 
1406*7556134aSSascha Wildner 	do
1407*7556134aSSascha Wildner 	{
1408*7556134aSSascha Wildner 		while (*TERM_data_ptr != (char)NULL)
1409*7556134aSSascha Wildner 		{
1410*7556134aSSascha Wildner 			for (found = FALSE, offset = 0; (!found) && (offset < 26); offset++)
1411*7556134aSSascha Wildner 			{
1412*7556134aSSascha Wildner 				if (!strncmp(TERM_data_ptr, Boolean_names[offset], 2))
1413*7556134aSSascha Wildner 				{
1414*7556134aSSascha Wildner 					found = TRUE;
1415*7556134aSSascha Wildner 					Booleans[offset] = TRUE;
1416*7556134aSSascha Wildner 				}
1417*7556134aSSascha Wildner 			}
1418*7556134aSSascha Wildner 			if (!found)
1419*7556134aSSascha Wildner 			{
1420*7556134aSSascha Wildner 				for (found = FALSE, offset = 0; (!found) && (offset < lw__); offset++)
1421*7556134aSSascha Wildner 				{
1422*7556134aSSascha Wildner 					if (!strncmp(TERM_data_ptr, Number_names[offset], 3))
1423*7556134aSSascha Wildner 					{
1424*7556134aSSascha Wildner 						found = TRUE;
1425*7556134aSSascha Wildner 						Numbers[offset] = tc_Get_int(Numbers[offset]);
1426*7556134aSSascha Wildner 					}
1427*7556134aSSascha Wildner 				}
1428*7556134aSSascha Wildner 			}
1429*7556134aSSascha Wildner 			if (!found)
1430*7556134aSSascha Wildner 			{
1431*7556134aSSascha Wildner 				for (found = FALSE, offset = 0; (!found) && (offset < smgr__); offset++)
1432*7556134aSSascha Wildner 				{
1433*7556134aSSascha Wildner 					if (!strncmp(TERM_data_ptr, String_names[offset], 3))
1434*7556134aSSascha Wildner 					{
1435*7556134aSSascha Wildner 						found = TRUE;
1436*7556134aSSascha Wildner 						String_table[offset] = String_Get(String_table[offset]);
1437*7556134aSSascha Wildner 					}
1438*7556134aSSascha Wildner 				}
1439*7556134aSSascha Wildner 			}
1440*7556134aSSascha Wildner 
1441*7556134aSSascha Wildner 			if (!strncmp(TERM_data_ptr, "tc=", 3))
1442*7556134aSSascha Wildner 				tc_ = String_Get(NULL);
1443*7556134aSSascha Wildner 			while ((*TERM_data_ptr != ':') && (*TERM_data_ptr != (char)NULL))
1444*7556134aSSascha Wildner 				TERM_data_ptr++;
1445*7556134aSSascha Wildner 			if (*TERM_data_ptr == ':')
1446*7556134aSSascha Wildner 				TERM_data_ptr++;
1447*7556134aSSascha Wildner 		}
1448*7556134aSSascha Wildner 	} while (((TERM_data_ptr = fgets(Data_Line, 512, TFP)) != NULL) && ((*TERM_data_ptr == ' ') || (*TERM_data_ptr == '\t')));
1449*7556134aSSascha Wildner 	if (tc_ != NULL)
1450*7556134aSSascha Wildner 	{
1451*7556134aSSascha Wildner 		TERMINAL_TYPE = tc_;
1452*7556134aSSascha Wildner 		rewind(TFP);
1453*7556134aSSascha Wildner 		Find_term();
1454*7556134aSSascha Wildner 		tc_ = NULL;
1455*7556134aSSascha Wildner 		CAP_PARSE();
1456*7556134aSSascha Wildner 	}
1457*7556134aSSascha Wildner 	else
1458*7556134aSSascha Wildner 		fclose(TFP);
1459*7556134aSSascha Wildner }
1460*7556134aSSascha Wildner #endif		/* ifdef CAP	*/
1461*7556134aSSascha Wildner 
1462*7556134aSSascha Wildner struct _line *
Screenalloc(columns)1463*7556134aSSascha Wildner Screenalloc(columns)
1464*7556134aSSascha Wildner int columns;
1465*7556134aSSascha Wildner {
1466*7556134aSSascha Wildner 	int i;
1467*7556134aSSascha Wildner 	struct _line *tmp;
1468*7556134aSSascha Wildner 
1469*7556134aSSascha Wildner 	tmp = (struct _line *) malloc(sizeof (struct _line));
1470*7556134aSSascha Wildner 	tmp->row = malloc(columns + 1);
1471*7556134aSSascha Wildner 	tmp->attributes = malloc(columns + 1);
1472*7556134aSSascha Wildner 	tmp->prev_screen = NULL;
1473*7556134aSSascha Wildner 	tmp->next_screen = NULL;
1474*7556134aSSascha Wildner 	for (i = 0; i < columns; i++)
1475*7556134aSSascha Wildner 	{
1476*7556134aSSascha Wildner 		tmp->row[i] = ' ';
1477*7556134aSSascha Wildner 		tmp->attributes[i] = '\0';
1478*7556134aSSascha Wildner 	}
1479*7556134aSSascha Wildner 	tmp->scroll = tmp->changed = FALSE;
1480*7556134aSSascha Wildner 	tmp->row[0] = '\0';
1481*7556134aSSascha Wildner 	tmp->attributes[0] = '\0';
1482*7556134aSSascha Wildner 	tmp->row[columns] = '\0';
1483*7556134aSSascha Wildner 	tmp->attributes[columns] = '\0';
1484*7556134aSSascha Wildner 	tmp->last_char = 0;
1485*7556134aSSascha Wildner 	return(tmp);
1486*7556134aSSascha Wildner }
1487*7556134aSSascha Wildner 
newwin(lines,cols,start_l,start_c)1488*7556134aSSascha Wildner WINDOW *newwin(lines, cols, start_l, start_c)
1489*7556134aSSascha Wildner int lines, cols;	/* number of lines and columns to be in window	*/
1490*7556134aSSascha Wildner int start_l, start_c;	/* starting line and column to be inwindow	*/
1491*7556134aSSascha Wildner {
1492*7556134aSSascha Wildner 	WINDOW *Ntemp;
1493*7556134aSSascha Wildner 	struct _line *temp_screen;
1494*7556134aSSascha Wildner 	int i;
1495*7556134aSSascha Wildner 
1496*7556134aSSascha Wildner 	Ntemp = (WINDOW *) malloc(sizeof(WINDOW));
1497*7556134aSSascha Wildner 	Ntemp->SR = start_l;
1498*7556134aSSascha Wildner 	Ntemp->SC = start_c;
1499*7556134aSSascha Wildner 	Ntemp->Num_lines = lines;
1500*7556134aSSascha Wildner 	Ntemp->Num_cols = cols;
1501*7556134aSSascha Wildner 	Ntemp->LX = 0;
1502*7556134aSSascha Wildner 	Ntemp->LY = 0;
1503*7556134aSSascha Wildner 	Ntemp->scroll_down = Ntemp->scroll_up = 0;
1504*7556134aSSascha Wildner 	Ntemp->SCROLL_CLEAR = FALSE;
1505*7556134aSSascha Wildner 	Ntemp->Attrib = FALSE;
1506*7556134aSSascha Wildner 	Ntemp->first_line = temp_screen = Screenalloc(cols);
1507*7556134aSSascha Wildner 	Ntemp->first_line->number = 0;
1508*7556134aSSascha Wildner 	Ntemp->line_array = (struct _line **) malloc(LINES * sizeof(struct _line *));
1509*7556134aSSascha Wildner 
1510*7556134aSSascha Wildner 	Ntemp->line_array[0] = Ntemp->first_line;
1511*7556134aSSascha Wildner 
1512*7556134aSSascha Wildner 	for (i = 1; i < lines; i++)
1513*7556134aSSascha Wildner 	{
1514*7556134aSSascha Wildner 		temp_screen->next_screen = Screenalloc(cols);
1515*7556134aSSascha Wildner 		temp_screen->next_screen->number = i;
1516*7556134aSSascha Wildner 		temp_screen->next_screen->prev_screen = temp_screen;
1517*7556134aSSascha Wildner 		temp_screen = temp_screen->next_screen;
1518*7556134aSSascha Wildner 		Ntemp->line_array[i] = temp_screen;
1519*7556134aSSascha Wildner 	}
1520*7556134aSSascha Wildner 	Ntemp->first_line->prev_screen = NULL;
1521*7556134aSSascha Wildner 	temp_screen->next_screen = NULL;
1522*7556134aSSascha Wildner 	return(Ntemp);
1523*7556134aSSascha Wildner }
1524*7556134aSSascha Wildner 
1525*7556134aSSascha Wildner #ifdef CAP
1526*7556134aSSascha Wildner void
Cap_Out(string,p_list,place)1527*7556134aSSascha Wildner Cap_Out(string, p_list, place)	/* interpret the output string if necessary */
1528*7556134aSSascha Wildner char *string;
1529*7556134aSSascha Wildner int p_list[];			/* stack of values	*/
1530*7556134aSSascha Wildner int place;			/* place keeper of top of stack	*/
1531*7556134aSSascha Wildner {
1532*7556134aSSascha Wildner 	char *Otemp;		/* temporary string pointer to parse output */
1533*7556134aSSascha Wildner 	int delay;
1534*7556134aSSascha Wildner 	int p1, p2, temp;
1535*7556134aSSascha Wildner 	float chars;
1536*7556134aSSascha Wildner 
1537*7556134aSSascha Wildner 	if (string == NULL)
1538*7556134aSSascha Wildner 		return;
1539*7556134aSSascha Wildner 
1540*7556134aSSascha Wildner 	if (p_list != NULL)
1541*7556134aSSascha Wildner 	{
1542*7556134aSSascha Wildner 		p1 = p_list[--place];
1543*7556134aSSascha Wildner 		p2 = p_list[--place];
1544*7556134aSSascha Wildner 	}
1545*7556134aSSascha Wildner 	delay = 0;
1546*7556134aSSascha Wildner 	Otemp = string;
1547*7556134aSSascha Wildner 	if ((*Otemp >= '0') && (*Otemp <= '9'))
1548*7556134aSSascha Wildner 	{
1549*7556134aSSascha Wildner 		delay = atoi(Otemp);
1550*7556134aSSascha Wildner 		while ((*Otemp >= '0') && (*Otemp <= '9'))
1551*7556134aSSascha Wildner 			Otemp++;
1552*7556134aSSascha Wildner 		if (*Otemp == '*')
1553*7556134aSSascha Wildner 			Otemp++;
1554*7556134aSSascha Wildner 	}
1555*7556134aSSascha Wildner 	while (*Otemp != (char)NULL)
1556*7556134aSSascha Wildner 	{
1557*7556134aSSascha Wildner 		if (*Otemp == '%')
1558*7556134aSSascha Wildner 		{
1559*7556134aSSascha Wildner 			Otemp++;
1560*7556134aSSascha Wildner 			if ((*Otemp == 'd') || (*Otemp == '2') || (*Otemp == '3') || (*Otemp == '.') || (*Otemp == '+'))
1561*7556134aSSascha Wildner 			{
1562*7556134aSSascha Wildner 				if (*Otemp == 'd')
1563*7556134aSSascha Wildner 				 	printf("%d", p1);
1564*7556134aSSascha Wildner 				else if (*Otemp == '2')
1565*7556134aSSascha Wildner 					printf("%02d", p1);
1566*7556134aSSascha Wildner 				else if (*Otemp == '3')
1567*7556134aSSascha Wildner 					printf("%03d", p1);
1568*7556134aSSascha Wildner 				else if (*Otemp == '+')
1569*7556134aSSascha Wildner 				{
1570*7556134aSSascha Wildner 					Otemp++;
1571*7556134aSSascha Wildner 					p1 += *Otemp;
1572*7556134aSSascha Wildner 					putchar(p1);
1573*7556134aSSascha Wildner 				}
1574*7556134aSSascha Wildner 				else if (*Otemp == '.')
1575*7556134aSSascha Wildner 					putchar(p1);
1576*7556134aSSascha Wildner 				p1 = p2;
1577*7556134aSSascha Wildner 				p2 = 0;
1578*7556134aSSascha Wildner 			}
1579*7556134aSSascha Wildner 			else if (*Otemp == '>')
1580*7556134aSSascha Wildner 			{
1581*7556134aSSascha Wildner 				Otemp++;
1582*7556134aSSascha Wildner 				if (p1 > *Otemp)
1583*7556134aSSascha Wildner 				{
1584*7556134aSSascha Wildner 					Otemp++;
1585*7556134aSSascha Wildner 					p1 += *Otemp;
1586*7556134aSSascha Wildner 				}
1587*7556134aSSascha Wildner 				else
1588*7556134aSSascha Wildner 					Otemp++;
1589*7556134aSSascha Wildner 			}
1590*7556134aSSascha Wildner 			else if (*Otemp == 'r')
1591*7556134aSSascha Wildner 			{
1592*7556134aSSascha Wildner 				temp = p1;
1593*7556134aSSascha Wildner 				p1 = p2;
1594*7556134aSSascha Wildner 				p2 = temp;
1595*7556134aSSascha Wildner 			}
1596*7556134aSSascha Wildner 			else if (*Otemp == 'i')
1597*7556134aSSascha Wildner 			{
1598*7556134aSSascha Wildner 				p1++;
1599*7556134aSSascha Wildner 				p2++;
1600*7556134aSSascha Wildner 			}
1601*7556134aSSascha Wildner 			else if (*Otemp == '%')
1602*7556134aSSascha Wildner 				putchar(*Otemp);
1603*7556134aSSascha Wildner 			else if (*Otemp == 'n')
1604*7556134aSSascha Wildner 			{
1605*7556134aSSascha Wildner 				p1 ^= 0140;
1606*7556134aSSascha Wildner 				p2 ^= 0140;
1607*7556134aSSascha Wildner 			}
1608*7556134aSSascha Wildner 			else if (*Otemp == 'B')
1609*7556134aSSascha Wildner 			{
1610*7556134aSSascha Wildner 				p1 = (16 * (p1/10)) + (p1 % 10);
1611*7556134aSSascha Wildner 				p2 = (16 * (p2/10)) + (p2 % 10);
1612*7556134aSSascha Wildner 			}
1613*7556134aSSascha Wildner 			else if (*Otemp == 'D')
1614*7556134aSSascha Wildner 			{
1615*7556134aSSascha Wildner 				p1 = (p1 - 2 * (p1 % 16));
1616*7556134aSSascha Wildner 				p2 = (p2 - 2 * (p2 % 16));
1617*7556134aSSascha Wildner 			}
1618*7556134aSSascha Wildner 		}
1619*7556134aSSascha Wildner 		else
1620*7556134aSSascha Wildner 			putchar (*Otemp);
1621*7556134aSSascha Wildner 		Otemp++;
1622*7556134aSSascha Wildner 	}
1623*7556134aSSascha Wildner 	if (delay != 0)
1624*7556134aSSascha Wildner 	{
1625*7556134aSSascha Wildner 		chars = delay * chars_per_millisecond;
1626*7556134aSSascha Wildner 		delay = chars;
1627*7556134aSSascha Wildner 		if ((chars - delay) > 0.0)
1628*7556134aSSascha Wildner 			delay++;
1629*7556134aSSascha Wildner 		for (; delay > 0; delay--)
1630*7556134aSSascha Wildner 			putchar(*String_table[pc__]);
1631*7556134aSSascha Wildner 	}
1632*7556134aSSascha Wildner 	fflush(stdout);
1633*7556134aSSascha Wildner }
1634*7556134aSSascha Wildner 
1635*7556134aSSascha Wildner #else
1636*7556134aSSascha Wildner 
1637*7556134aSSascha Wildner 	char *Otemp;		/* temporary string pointer to parse output */
1638*7556134aSSascha Wildner 	float chars;
1639*7556134aSSascha Wildner 	int p[10];
1640*7556134aSSascha Wildner 	int variable[27];
1641*7556134aSSascha Wildner 
1642*7556134aSSascha Wildner int
Operation(Temp_Stack,place)1643*7556134aSSascha Wildner Operation(Temp_Stack, place)	/* handle conditional operations	*/
1644*7556134aSSascha Wildner int Temp_Stack[];
1645*7556134aSSascha Wildner int place;
1646*7556134aSSascha Wildner {
1647*7556134aSSascha Wildner 	int temp;
1648*7556134aSSascha Wildner 
1649*7556134aSSascha Wildner 	if (*Otemp == 'd')
1650*7556134aSSascha Wildner 	{
1651*7556134aSSascha Wildner 		Otemp++;
1652*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1653*7556134aSSascha Wildner 	 	printf("%d", temp);
1654*7556134aSSascha Wildner 	}
1655*7556134aSSascha Wildner 	else if (!strncmp(Otemp, "2d", 2))
1656*7556134aSSascha Wildner 	{
1657*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1658*7556134aSSascha Wildner 		printf("%2d", temp);
1659*7556134aSSascha Wildner 		Otemp++;
1660*7556134aSSascha Wildner 		Otemp++;
1661*7556134aSSascha Wildner 	}
1662*7556134aSSascha Wildner 	else if (!strncmp(Otemp, "3d", 2))
1663*7556134aSSascha Wildner 	{
1664*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1665*7556134aSSascha Wildner 		printf("%0d", temp);
1666*7556134aSSascha Wildner 		Otemp++;
1667*7556134aSSascha Wildner 		Otemp++;
1668*7556134aSSascha Wildner 	}
1669*7556134aSSascha Wildner 	else if (!strncmp(Otemp, "02d", 3))
1670*7556134aSSascha Wildner 	{
1671*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1672*7556134aSSascha Wildner 		printf("%02d", temp);
1673*7556134aSSascha Wildner 		Otemp++;
1674*7556134aSSascha Wildner 		Otemp++;
1675*7556134aSSascha Wildner 		Otemp++;
1676*7556134aSSascha Wildner 	}
1677*7556134aSSascha Wildner 	else if (!strncmp(Otemp, "03d", 3))
1678*7556134aSSascha Wildner 	{
1679*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1680*7556134aSSascha Wildner 		printf("%03d", temp);
1681*7556134aSSascha Wildner 		Otemp++;
1682*7556134aSSascha Wildner 		Otemp++;
1683*7556134aSSascha Wildner 		Otemp++;
1684*7556134aSSascha Wildner 	}
1685*7556134aSSascha Wildner 	else if (*Otemp == '+')
1686*7556134aSSascha Wildner 	{
1687*7556134aSSascha Wildner 		Otemp++;
1688*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1689*7556134aSSascha Wildner 		temp += Temp_Stack[--place];
1690*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1691*7556134aSSascha Wildner 	}
1692*7556134aSSascha Wildner 	else if (*Otemp == '-')
1693*7556134aSSascha Wildner 	{
1694*7556134aSSascha Wildner 		Otemp++;
1695*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1696*7556134aSSascha Wildner 		temp -= Temp_Stack[--place];
1697*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1698*7556134aSSascha Wildner 	}
1699*7556134aSSascha Wildner 	else if (*Otemp == '*')
1700*7556134aSSascha Wildner 	{
1701*7556134aSSascha Wildner 		Otemp++;
1702*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1703*7556134aSSascha Wildner 		temp *= Temp_Stack[--place];
1704*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1705*7556134aSSascha Wildner 	}
1706*7556134aSSascha Wildner 	else if (*Otemp == '/')
1707*7556134aSSascha Wildner 	{
1708*7556134aSSascha Wildner 		Otemp++;
1709*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1710*7556134aSSascha Wildner 		temp /= Temp_Stack[--place];
1711*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1712*7556134aSSascha Wildner 	}
1713*7556134aSSascha Wildner 	else if (*Otemp == 'm')
1714*7556134aSSascha Wildner 	{
1715*7556134aSSascha Wildner 		Otemp++;
1716*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1717*7556134aSSascha Wildner 		temp %= Temp_Stack[--place];
1718*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1719*7556134aSSascha Wildner 	}
1720*7556134aSSascha Wildner 	else if (*Otemp == '&')
1721*7556134aSSascha Wildner 	{
1722*7556134aSSascha Wildner 		Otemp++;
1723*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1724*7556134aSSascha Wildner 		temp &= Temp_Stack[--place];
1725*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1726*7556134aSSascha Wildner 	}
1727*7556134aSSascha Wildner 	else if (*Otemp == '|')
1728*7556134aSSascha Wildner 	{
1729*7556134aSSascha Wildner 		Otemp++;
1730*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1731*7556134aSSascha Wildner 		temp |= Temp_Stack[--place];
1732*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1733*7556134aSSascha Wildner 	}
1734*7556134aSSascha Wildner 	else if (*Otemp == '^')
1735*7556134aSSascha Wildner 	{
1736*7556134aSSascha Wildner 		Otemp++;
1737*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1738*7556134aSSascha Wildner 		temp ^= Temp_Stack[--place];
1739*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1740*7556134aSSascha Wildner 	}
1741*7556134aSSascha Wildner 	else if (*Otemp == '=')
1742*7556134aSSascha Wildner 	{
1743*7556134aSSascha Wildner 		Otemp++;
1744*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1745*7556134aSSascha Wildner 		temp = (temp == Temp_Stack[--place]);
1746*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1747*7556134aSSascha Wildner 	}
1748*7556134aSSascha Wildner 	else if (*Otemp == '>')
1749*7556134aSSascha Wildner 	{
1750*7556134aSSascha Wildner 		Otemp++;
1751*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1752*7556134aSSascha Wildner 		temp = temp > Temp_Stack[--place];
1753*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1754*7556134aSSascha Wildner 	}
1755*7556134aSSascha Wildner 	else if (*Otemp == '<')
1756*7556134aSSascha Wildner 	{
1757*7556134aSSascha Wildner 		Otemp++;
1758*7556134aSSascha Wildner 		temp = Temp_Stack[--place];
1759*7556134aSSascha Wildner 		temp = temp < Temp_Stack[--place];
1760*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1761*7556134aSSascha Wildner 	}
1762*7556134aSSascha Wildner 	else if (*Otemp == 'c')
1763*7556134aSSascha Wildner 	{
1764*7556134aSSascha Wildner 		Otemp++;
1765*7556134aSSascha Wildner 		putchar(Temp_Stack[--place]);
1766*7556134aSSascha Wildner 	}
1767*7556134aSSascha Wildner 	else if (*Otemp == 'i')
1768*7556134aSSascha Wildner 	{
1769*7556134aSSascha Wildner 		Otemp++;
1770*7556134aSSascha Wildner 		p[1]++;
1771*7556134aSSascha Wildner 		p[2]++;
1772*7556134aSSascha Wildner 	}
1773*7556134aSSascha Wildner 	else if (*Otemp == '%')
1774*7556134aSSascha Wildner 	{
1775*7556134aSSascha Wildner 		putchar(*Otemp);
1776*7556134aSSascha Wildner 		Otemp++;
1777*7556134aSSascha Wildner 	}
1778*7556134aSSascha Wildner 	else if (*Otemp == '!')
1779*7556134aSSascha Wildner 	{
1780*7556134aSSascha Wildner 		temp = ! Temp_Stack[--place];
1781*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1782*7556134aSSascha Wildner 		Otemp++;
1783*7556134aSSascha Wildner 	}
1784*7556134aSSascha Wildner 	else if (*Otemp == '~')
1785*7556134aSSascha Wildner 	{
1786*7556134aSSascha Wildner 		temp = ~Temp_Stack[--place];
1787*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1788*7556134aSSascha Wildner 		Otemp++;
1789*7556134aSSascha Wildner 	}
1790*7556134aSSascha Wildner 	else if (*Otemp == 'p')
1791*7556134aSSascha Wildner 	{
1792*7556134aSSascha Wildner 		Otemp++;
1793*7556134aSSascha Wildner 		Temp_Stack[place++] = p[*Otemp - '0'];
1794*7556134aSSascha Wildner 		Otemp++;
1795*7556134aSSascha Wildner 	}
1796*7556134aSSascha Wildner 	else if (*Otemp == 'P')
1797*7556134aSSascha Wildner 	{
1798*7556134aSSascha Wildner 		Otemp++;
1799*7556134aSSascha Wildner 		Temp_Stack[place++] = variable[*Otemp - 'a'];
1800*7556134aSSascha Wildner 		Otemp++;
1801*7556134aSSascha Wildner 	}
1802*7556134aSSascha Wildner 	else if (*Otemp == 'g')
1803*7556134aSSascha Wildner 	{
1804*7556134aSSascha Wildner 		Otemp++;
1805*7556134aSSascha Wildner 		variable[*Otemp - 'a'] = Temp_Stack[--place];
1806*7556134aSSascha Wildner 		Otemp++;
1807*7556134aSSascha Wildner 	}
1808*7556134aSSascha Wildner 	else if (*Otemp == '\'')
1809*7556134aSSascha Wildner 	{
1810*7556134aSSascha Wildner 		Otemp++;
1811*7556134aSSascha Wildner 		Temp_Stack[place++] = *Otemp;
1812*7556134aSSascha Wildner 		Otemp++;
1813*7556134aSSascha Wildner 		Otemp++;
1814*7556134aSSascha Wildner 	}
1815*7556134aSSascha Wildner 	else if (*Otemp == '{')
1816*7556134aSSascha Wildner 	{
1817*7556134aSSascha Wildner 		Otemp++;
1818*7556134aSSascha Wildner 		temp = atoi(Otemp);
1819*7556134aSSascha Wildner 		Temp_Stack[place++] = temp;
1820*7556134aSSascha Wildner 		while (*Otemp != '}')
1821*7556134aSSascha Wildner 			Otemp++;
1822*7556134aSSascha Wildner 		Otemp++;
1823*7556134aSSascha Wildner 	}
1824*7556134aSSascha Wildner 	return(place);
1825*7556134aSSascha Wildner }
1826*7556134aSSascha Wildner 
1827*7556134aSSascha Wildner void
Info_Out(string,p_list,place)1828*7556134aSSascha Wildner Info_Out(string, p_list, place)	/* interpret the output string if necessary */
1829*7556134aSSascha Wildner char *string;
1830*7556134aSSascha Wildner int p_list[];
1831*7556134aSSascha Wildner int place;
1832*7556134aSSascha Wildner {
1833*7556134aSSascha Wildner 	char *tchar;
1834*7556134aSSascha Wildner 	int delay;
1835*7556134aSSascha Wildner 	int temp;
1836*7556134aSSascha Wildner 	int Cond_FLAG;
1837*7556134aSSascha Wildner 	int EVAL;
1838*7556134aSSascha Wildner 	int Cond_Stack[128];
1839*7556134aSSascha Wildner 	int Cond_place;
1840*7556134aSSascha Wildner 	int Stack[128];
1841*7556134aSSascha Wildner 	int Top_of_stack;
1842*7556134aSSascha Wildner 
1843*7556134aSSascha Wildner 	if (string == NULL)
1844*7556134aSSascha Wildner 		return;
1845*7556134aSSascha Wildner 
1846*7556134aSSascha Wildner 	Cond_FLAG = FALSE;
1847*7556134aSSascha Wildner 	Cond_place = 0;
1848*7556134aSSascha Wildner 	Top_of_stack = 0;
1849*7556134aSSascha Wildner 	p[0] = 0;
1850*7556134aSSascha Wildner 	p[1] = 0;
1851*7556134aSSascha Wildner 	p[2] = 0;
1852*7556134aSSascha Wildner 	p[3] = 0;
1853*7556134aSSascha Wildner 	p[4] = 0;
1854*7556134aSSascha Wildner 	p[5] = 0;
1855*7556134aSSascha Wildner 	p[6] = 0;
1856*7556134aSSascha Wildner 	p[7] = 0;
1857*7556134aSSascha Wildner 	p[8] = 0;
1858*7556134aSSascha Wildner 	p[9] = 0;
1859*7556134aSSascha Wildner 	if (p_list != NULL)
1860*7556134aSSascha Wildner 	{
1861*7556134aSSascha Wildner 		for (temp = 1; (place != 0); temp++)
1862*7556134aSSascha Wildner 		{
1863*7556134aSSascha Wildner 			p[temp] = p_list[--place];
1864*7556134aSSascha Wildner 		}
1865*7556134aSSascha Wildner 	}
1866*7556134aSSascha Wildner 	delay = 0;
1867*7556134aSSascha Wildner 	Otemp = string;
1868*7556134aSSascha Wildner 	while (*Otemp != '\0')
1869*7556134aSSascha Wildner 	{
1870*7556134aSSascha Wildner 		if (*Otemp == '%')
1871*7556134aSSascha Wildner 		{
1872*7556134aSSascha Wildner 			Otemp++;
1873*7556134aSSascha Wildner 			if ((*Otemp == '?') || (*Otemp == 't') || (*Otemp == 'e') || (*Otemp == ';'))
1874*7556134aSSascha Wildner 			{
1875*7556134aSSascha Wildner 				if (*Otemp == '?')
1876*7556134aSSascha Wildner 				{
1877*7556134aSSascha Wildner 					Otemp++;
1878*7556134aSSascha Wildner 					Cond_FLAG = TRUE;
1879*7556134aSSascha Wildner 					EVAL = TRUE;
1880*7556134aSSascha Wildner 					while (EVAL)
1881*7556134aSSascha Wildner 					{
1882*7556134aSSascha Wildner 						/*
1883*7556134aSSascha Wildner 						 |  find the end of the
1884*7556134aSSascha Wildner 						 |  conditional statement
1885*7556134aSSascha Wildner 						 */
1886*7556134aSSascha Wildner 						while ((strncmp(Otemp, "%t", 2)) && (*Otemp != '\0'))
1887*7556134aSSascha Wildner 						{
1888*7556134aSSascha Wildner 							/*
1889*7556134aSSascha Wildner 							 |  move past '%'
1890*7556134aSSascha Wildner 							 */
1891*7556134aSSascha Wildner 							Otemp++;
1892*7556134aSSascha Wildner 							Cond_place = Operation(Cond_Stack, Cond_place);
1893*7556134aSSascha Wildner 						}
1894*7556134aSSascha Wildner 
1895*7556134aSSascha Wildner 						/*
1896*7556134aSSascha Wildner 						 |  if condition is true
1897*7556134aSSascha Wildner 						 */
1898*7556134aSSascha Wildner 						if ((Cond_place > 0) && (Cond_Stack[Cond_place-1]))
1899*7556134aSSascha Wildner 						{
1900*7556134aSSascha Wildner 							/*
1901*7556134aSSascha Wildner 							 |  end conditional
1902*7556134aSSascha Wildner 							 |  parsing
1903*7556134aSSascha Wildner 							 */
1904*7556134aSSascha Wildner 							EVAL = FALSE;
1905*7556134aSSascha Wildner 							Otemp++;
1906*7556134aSSascha Wildner 							Otemp++;
1907*7556134aSSascha Wildner 						}
1908*7556134aSSascha Wildner 						else	/* condition is false */
1909*7556134aSSascha Wildner 						{
1910*7556134aSSascha Wildner 							/*
1911*7556134aSSascha Wildner 							 |  find 'else' or end
1912*7556134aSSascha Wildner 							 |  of if statement
1913*7556134aSSascha Wildner 							 */
1914*7556134aSSascha Wildner 							while ((strncmp(Otemp, "%e", 2)) && (strncmp(Otemp, "%;", 2)) && (*Otemp != '\0'))
1915*7556134aSSascha Wildner 								Otemp++;
1916*7556134aSSascha Wildner 							/*
1917*7556134aSSascha Wildner 							 |  if an 'else' found
1918*7556134aSSascha Wildner 							 */
1919*7556134aSSascha Wildner 							if ((*Otemp != '\0') && (!strncmp(Otemp, "%e", 2)))
1920*7556134aSSascha Wildner 							{
1921*7556134aSSascha Wildner 								Otemp++;
1922*7556134aSSascha Wildner 								Otemp++;
1923*7556134aSSascha Wildner 								tchar = Otemp;
1924*7556134aSSascha Wildner 								/*
1925*7556134aSSascha Wildner 								 |  check for 'then' part
1926*7556134aSSascha Wildner 								 */
1927*7556134aSSascha Wildner 								while ((*tchar != '\0') && (strncmp(tchar, "%t", 2)) && (strncmp(tchar, "%;", 2)))
1928*7556134aSSascha Wildner 									tchar++;
1929*7556134aSSascha Wildner 								/*
1930*7556134aSSascha Wildner 								 |  if end of string
1931*7556134aSSascha Wildner 								 */
1932*7556134aSSascha Wildner 								if (*tchar == '\0')
1933*7556134aSSascha Wildner 								{
1934*7556134aSSascha Wildner 									EVAL = FALSE;
1935*7556134aSSascha Wildner 									Cond_FLAG = FALSE;
1936*7556134aSSascha Wildner 									Otemp = tchar;
1937*7556134aSSascha Wildner 								}
1938*7556134aSSascha Wildner 								/*
1939*7556134aSSascha Wildner 								 |  if end of if found,
1940*7556134aSSascha Wildner 								 |  set up to parse
1941*7556134aSSascha Wildner 								 |  info
1942*7556134aSSascha Wildner 								 */
1943*7556134aSSascha Wildner 								else if (!strncmp(tchar, "%;", 2))
1944*7556134aSSascha Wildner 									EVAL = FALSE;
1945*7556134aSSascha Wildner 								/*
1946*7556134aSSascha Wildner 								 |  otherwise, check
1947*7556134aSSascha Wildner 								 |  conditional in
1948*7556134aSSascha Wildner 								 |  'else'
1949*7556134aSSascha Wildner 								 */
1950*7556134aSSascha Wildner 							}
1951*7556134aSSascha Wildner 							/*
1952*7556134aSSascha Wildner 							 |  if end of if found,
1953*7556134aSSascha Wildner 							 |  get out of if
1954*7556134aSSascha Wildner 							 |  statement
1955*7556134aSSascha Wildner 							 */
1956*7556134aSSascha Wildner 							else if ((*Otemp != '\0') && (!strncmp(Otemp, "%;", 2)))
1957*7556134aSSascha Wildner 							{
1958*7556134aSSascha Wildner 								EVAL = FALSE;
1959*7556134aSSascha Wildner 								Otemp++;
1960*7556134aSSascha Wildner 								Otemp++;
1961*7556134aSSascha Wildner 							}
1962*7556134aSSascha Wildner 							else /* Otemp == NULL */
1963*7556134aSSascha Wildner 							{
1964*7556134aSSascha Wildner 								EVAL = FALSE;
1965*7556134aSSascha Wildner 								Cond_FLAG = FALSE;
1966*7556134aSSascha Wildner 							}
1967*7556134aSSascha Wildner 						}
1968*7556134aSSascha Wildner 					}
1969*7556134aSSascha Wildner 				}
1970*7556134aSSascha Wildner 				else
1971*7556134aSSascha Wildner 				{
1972*7556134aSSascha Wildner 					Otemp++;
1973*7556134aSSascha Wildner 					Cond_FLAG = FALSE;
1974*7556134aSSascha Wildner 					if (*Otemp != ';')
1975*7556134aSSascha Wildner 					{
1976*7556134aSSascha Wildner 						while ((*Otemp != '\0') && (strncmp(Otemp, "%;", 2)))
1977*7556134aSSascha Wildner 							Otemp++;
1978*7556134aSSascha Wildner 						if (*Otemp != '\0')
1979*7556134aSSascha Wildner 						{
1980*7556134aSSascha Wildner 							Otemp++;
1981*7556134aSSascha Wildner 							Otemp++;
1982*7556134aSSascha Wildner 						}
1983*7556134aSSascha Wildner 					}
1984*7556134aSSascha Wildner 					else
1985*7556134aSSascha Wildner 						Otemp++;
1986*7556134aSSascha Wildner 				}
1987*7556134aSSascha Wildner 			}
1988*7556134aSSascha Wildner 			else
1989*7556134aSSascha Wildner 			{
1990*7556134aSSascha Wildner 				Top_of_stack = Operation(Stack, Top_of_stack);
1991*7556134aSSascha Wildner 			}
1992*7556134aSSascha Wildner 		}
1993*7556134aSSascha Wildner 		else if (!strncmp(Otemp, "$<", 2))
1994*7556134aSSascha Wildner 		{
1995*7556134aSSascha Wildner 			Otemp++;
1996*7556134aSSascha Wildner 			Otemp++;
1997*7556134aSSascha Wildner 			delay = atoi(Otemp);
1998*7556134aSSascha Wildner 			while (*Otemp != '>')
1999*7556134aSSascha Wildner 				Otemp++;
2000*7556134aSSascha Wildner 			Otemp++;
2001*7556134aSSascha Wildner 			chars = delay * chars_per_millisecond;
2002*7556134aSSascha Wildner 			delay = chars;
2003*7556134aSSascha Wildner 			if ((chars - delay) > 0.0)
2004*7556134aSSascha Wildner 				delay++;
2005*7556134aSSascha Wildner 			if (String_table[pc__] == NULL)
2006*7556134aSSascha Wildner 				temp = 0;
2007*7556134aSSascha Wildner 			else
2008*7556134aSSascha Wildner 				temp = *String_table[pc__];
2009*7556134aSSascha Wildner 			for (; delay > 0; delay--)
2010*7556134aSSascha Wildner 				putc(temp, stdout);
2011*7556134aSSascha Wildner 		}
2012*7556134aSSascha Wildner 		else
2013*7556134aSSascha Wildner 		{
2014*7556134aSSascha Wildner 			putchar(*Otemp);
2015*7556134aSSascha Wildner 			Otemp++;
2016*7556134aSSascha Wildner 		}
2017*7556134aSSascha Wildner 	}
2018*7556134aSSascha Wildner 	fflush(stdout);
2019*7556134aSSascha Wildner }
2020*7556134aSSascha Wildner #endif
2021*7556134aSSascha Wildner 
2022*7556134aSSascha Wildner void
wmove(window,row,column)2023*7556134aSSascha Wildner wmove(window, row, column)	/* move cursor to indicated position in window */
2024*7556134aSSascha Wildner WINDOW *window;
2025*7556134aSSascha Wildner int row, column;
2026*7556134aSSascha Wildner {
2027*7556134aSSascha Wildner 	if ((row < window->Num_lines) && (column < window->Num_cols))
2028*7556134aSSascha Wildner 	{
2029*7556134aSSascha Wildner 		window->LX = column;
2030*7556134aSSascha Wildner 		window->LY = row;
2031*7556134aSSascha Wildner 	}
2032*7556134aSSascha Wildner }
2033*7556134aSSascha Wildner 
2034*7556134aSSascha Wildner void
clear_line(line,column,cols)2035*7556134aSSascha Wildner clear_line(line, column, cols)
2036*7556134aSSascha Wildner struct _line *line;
2037*7556134aSSascha Wildner int column;
2038*7556134aSSascha Wildner int cols;
2039*7556134aSSascha Wildner {
2040*7556134aSSascha Wildner 	int j;
2041*7556134aSSascha Wildner 
2042*7556134aSSascha Wildner 	if (column > line->last_char)
2043*7556134aSSascha Wildner 	{
2044*7556134aSSascha Wildner 		for (j = line->last_char; j < column; j++)
2045*7556134aSSascha Wildner 		{
2046*7556134aSSascha Wildner 			line->row[j] = ' ';
2047*7556134aSSascha Wildner 			line->attributes[j] = '\0';
2048*7556134aSSascha Wildner 		}
2049*7556134aSSascha Wildner 	}
2050*7556134aSSascha Wildner 	line->last_char = column;
2051*7556134aSSascha Wildner 	line->row[column] = '\0';
2052*7556134aSSascha Wildner 	line->attributes[column] = '\0';
2053*7556134aSSascha Wildner 	line->changed = TRUE;
2054*7556134aSSascha Wildner }
2055*7556134aSSascha Wildner 
2056*7556134aSSascha Wildner void
werase(window)2057*7556134aSSascha Wildner werase(window)			/* clear the specified window		*/
2058*7556134aSSascha Wildner WINDOW *window;
2059*7556134aSSascha Wildner {
2060*7556134aSSascha Wildner 	int i;
2061*7556134aSSascha Wildner 	struct _line *tmp;
2062*7556134aSSascha Wildner 
2063*7556134aSSascha Wildner 	window->SCROLL_CLEAR = CLEAR;
2064*7556134aSSascha Wildner 	window->scroll_up = window->scroll_down = 0;
2065*7556134aSSascha Wildner 	for (i = 0, tmp = window->first_line; i < window->Num_lines; i++, tmp = tmp->next_screen)
2066*7556134aSSascha Wildner 		clear_line(tmp, 0, window->Num_cols);
2067*7556134aSSascha Wildner }
2068*7556134aSSascha Wildner 
2069*7556134aSSascha Wildner void
wclrtoeol(window)2070*7556134aSSascha Wildner wclrtoeol(window)	/* erase from current cursor position to end of line */
2071*7556134aSSascha Wildner WINDOW *window;
2072*7556134aSSascha Wildner {
2073*7556134aSSascha Wildner 	int column, row;
2074*7556134aSSascha Wildner 	struct _line *tmp;
2075*7556134aSSascha Wildner 
2076*7556134aSSascha Wildner 	window->SCROLL_CLEAR = CHANGE;
2077*7556134aSSascha Wildner 	column = window->LX;
2078*7556134aSSascha Wildner 	row = window->LY;
2079*7556134aSSascha Wildner 	for (row = 0, tmp = window->first_line; row < window->LY; row++)
2080*7556134aSSascha Wildner 		tmp = tmp->next_screen;
2081*7556134aSSascha Wildner 	clear_line(tmp, column, window->Num_cols);
2082*7556134aSSascha Wildner }
2083*7556134aSSascha Wildner 
2084*7556134aSSascha Wildner void
wrefresh(window)2085*7556134aSSascha Wildner wrefresh(window)		/* flush all previous output		*/
2086*7556134aSSascha Wildner WINDOW *window;
2087*7556134aSSascha Wildner {
2088*7556134aSSascha Wildner 	wnoutrefresh(window);
2089*7556134aSSascha Wildner #ifdef DIAG
2090*7556134aSSascha Wildner {
2091*7556134aSSascha Wildner 	struct _line *temp;
2092*7556134aSSascha Wildner 	int value;
2093*7556134aSSascha Wildner 	fprintf(stderr, "columns=%d, lines=%d, SC=%d, SR=%d\n",window->Num_cols, window->Num_lines, window->SC, window->SR);
2094*7556134aSSascha Wildner 	for (value = 0, temp = window->first_line; value < window->Num_lines; value++, temp = temp->next_screen)
2095*7556134aSSascha Wildner 	{
2096*7556134aSSascha Wildner 		if (temp->number == -1)
2097*7556134aSSascha Wildner 			fprintf(stderr, "line moved ");
2098*7556134aSSascha Wildner 		if (temp->scroll)
2099*7556134aSSascha Wildner 			fprintf(stderr, "scroll_x is set:  ");
2100*7556134aSSascha Wildner 		fprintf(stderr, "lc%d=%s|\n", temp->last_char, temp->row);
2101*7556134aSSascha Wildner 	}
2102*7556134aSSascha Wildner 	fprintf(stderr, "+-------------------- virtual screen ----------------------------------------+\n");
2103*7556134aSSascha Wildner 	fprintf(stderr, "columns=%d, lines=%d \n",virtual_scr->Num_cols, virtual_scr->Num_lines);
2104*7556134aSSascha Wildner 	for (value = 0, temp = virtual_scr->first_line; value < virtual_scr->Num_lines; value++, temp = temp->next_screen)
2105*7556134aSSascha Wildner 	{
2106*7556134aSSascha Wildner 		if (temp->number == -1)
2107*7556134aSSascha Wildner 			fprintf(stderr, "line moved ");
2108*7556134aSSascha Wildner 		if (temp->scroll)
2109*7556134aSSascha Wildner 			fprintf(stderr, "scroll_x is set:  ");
2110*7556134aSSascha Wildner 		fprintf(stderr, "lc%d=%s|\n", temp->last_char, temp->row);
2111*7556134aSSascha Wildner 	}
2112*7556134aSSascha Wildner 	fprintf(stderr, "columns=%d, lines=%d \n",curscr->Num_cols, curscr->Num_lines);
2113*7556134aSSascha Wildner 	for (value = 0, temp = curscr->first_line; value < curscr->Num_lines; value++, temp = temp->next_screen)
2114*7556134aSSascha Wildner 		fprintf(stderr, "line=%s|\n", temp->row);
2115*7556134aSSascha Wildner }
2116*7556134aSSascha Wildner #endif
2117*7556134aSSascha Wildner 	doupdate();
2118*7556134aSSascha Wildner 	virtual_scr->SCROLL_CLEAR = FALSE;
2119*7556134aSSascha Wildner 	virtual_scr->scroll_down = virtual_scr->scroll_up = 0;
2120*7556134aSSascha Wildner 	fflush(stdout);
2121*7556134aSSascha Wildner }
2122*7556134aSSascha Wildner 
2123*7556134aSSascha Wildner void
touchwin(window)2124*7556134aSSascha Wildner touchwin(window)
2125*7556134aSSascha Wildner WINDOW *window;
2126*7556134aSSascha Wildner {
2127*7556134aSSascha Wildner 	struct _line *user_line;
2128*7556134aSSascha Wildner 	int line_counter = 0;
2129*7556134aSSascha Wildner 
2130*7556134aSSascha Wildner 	for (line_counter = 0, user_line = window->first_line;
2131*7556134aSSascha Wildner 		line_counter < window->Num_lines; line_counter++)
2132*7556134aSSascha Wildner 	{
2133*7556134aSSascha Wildner 		user_line->changed = TRUE;
2134*7556134aSSascha Wildner 	}
2135*7556134aSSascha Wildner 	window->SCROLL_CLEAR = TRUE;
2136*7556134aSSascha Wildner }
2137*7556134aSSascha Wildner 
2138*7556134aSSascha Wildner void
wnoutrefresh(window)2139*7556134aSSascha Wildner wnoutrefresh(window)
2140*7556134aSSascha Wildner WINDOW *window;
2141*7556134aSSascha Wildner {
2142*7556134aSSascha Wildner 	struct _line *user_line;
2143*7556134aSSascha Wildner 	struct _line *virtual_line;
2144*7556134aSSascha Wildner 	int line_counter = 0;
2145*7556134aSSascha Wildner 	int user_col = 0;
2146*7556134aSSascha Wildner 	int virt_col = 0;
2147*7556134aSSascha Wildner 
2148*7556134aSSascha Wildner 	if (window->SR >= virtual_scr->Num_lines)
2149*7556134aSSascha Wildner 		return;
2150*7556134aSSascha Wildner 	user_line = window->first_line;
2151*7556134aSSascha Wildner 	virtual_line = virtual_scr->first_line;
2152*7556134aSSascha Wildner 	virtual_scr->SCROLL_CLEAR = window->SCROLL_CLEAR;
2153*7556134aSSascha Wildner 	virtual_scr->LX = window->LX + window->SC;
2154*7556134aSSascha Wildner 	virtual_scr->LY = window->LY + window->SR;
2155*7556134aSSascha Wildner 	virtual_scr->scroll_up = window->scroll_up;
2156*7556134aSSascha Wildner 	virtual_scr->scroll_down = window->scroll_down;
2157*7556134aSSascha Wildner 	if ((last_window_refreshed == window) && (!window->SCROLL_CLEAR))
2158*7556134aSSascha Wildner 		return;
2159*7556134aSSascha Wildner 	for (line_counter = 0; line_counter < window->SR; line_counter++)
2160*7556134aSSascha Wildner 	{
2161*7556134aSSascha Wildner 		virtual_line = virtual_line->next_screen;
2162*7556134aSSascha Wildner 	}
2163*7556134aSSascha Wildner 	for (line_counter = 0; (line_counter < window->Num_lines)
2164*7556134aSSascha Wildner 		&& ((line_counter + window->SR) < virtual_scr->Num_lines);
2165*7556134aSSascha Wildner 			line_counter++)
2166*7556134aSSascha Wildner 	{
2167*7556134aSSascha Wildner 		if ((last_window_refreshed != window) || (user_line->changed) || ((SCROLL | CLEAR) & window->SCROLL_CLEAR))
2168*7556134aSSascha Wildner 		{
2169*7556134aSSascha Wildner 			for (user_col = 0, virt_col = window->SC;
2170*7556134aSSascha Wildner 				(virt_col < virtual_scr->Num_cols)
2171*7556134aSSascha Wildner 				  && (user_col < user_line->last_char);
2172*7556134aSSascha Wildner 				  	virt_col++, user_col++)
2173*7556134aSSascha Wildner 			{
2174*7556134aSSascha Wildner 				virtual_line->row[virt_col] = user_line->row[user_col];
2175*7556134aSSascha Wildner 				virtual_line->attributes[virt_col] = user_line->attributes[user_col];
2176*7556134aSSascha Wildner 			}
2177*7556134aSSascha Wildner 			for (user_col = user_line->last_char,
2178*7556134aSSascha Wildner 			     virt_col = window->SC + user_line->last_char;
2179*7556134aSSascha Wildner 				(virt_col < virtual_scr->Num_cols)
2180*7556134aSSascha Wildner 				  && (user_col < window->Num_cols);
2181*7556134aSSascha Wildner 				  	virt_col++, user_col++)
2182*7556134aSSascha Wildner 			{
2183*7556134aSSascha Wildner 				virtual_line->row[virt_col] = ' ';
2184*7556134aSSascha Wildner 				virtual_line->attributes[virt_col] = '\0';
2185*7556134aSSascha Wildner 			}
2186*7556134aSSascha Wildner 		}
2187*7556134aSSascha Wildner 		if (virtual_scr->Num_cols != window->Num_cols)
2188*7556134aSSascha Wildner 		{
2189*7556134aSSascha Wildner 			if (virtual_line->last_char < (user_line->last_char + window->SC))
2190*7556134aSSascha Wildner 			{
2191*7556134aSSascha Wildner 				if (virtual_line->row[virtual_line->last_char] == '\0')
2192*7556134aSSascha Wildner 					virtual_line->row[virtual_line->last_char] = ' ';
2193*7556134aSSascha Wildner 				virtual_line->last_char =
2194*7556134aSSascha Wildner 					min(virtual_scr->Num_cols,
2195*7556134aSSascha Wildner 					  (user_line->last_char + window->SC));
2196*7556134aSSascha Wildner 			}
2197*7556134aSSascha Wildner 		}
2198*7556134aSSascha Wildner 		else
2199*7556134aSSascha Wildner 			virtual_line->last_char = user_line->last_char;
2200*7556134aSSascha Wildner 		virtual_line->row[virtual_line->last_char] = '\0';
2201*7556134aSSascha Wildner 		virtual_line->changed = user_line->changed;
2202*7556134aSSascha Wildner 		virtual_line = virtual_line->next_screen;
2203*7556134aSSascha Wildner 		user_line = user_line->next_screen;
2204*7556134aSSascha Wildner 	}
2205*7556134aSSascha Wildner 	window->SCROLL_CLEAR = FALSE;
2206*7556134aSSascha Wildner 	window->scroll_up = window->scroll_down = 0;
2207*7556134aSSascha Wildner 	last_window_refreshed = window;
2208*7556134aSSascha Wildner }
2209*7556134aSSascha Wildner 
2210*7556134aSSascha Wildner void
flushinp()2211*7556134aSSascha Wildner flushinp()			/* flush input				*/
2212*7556134aSSascha Wildner {
2213*7556134aSSascha Wildner }
2214*7556134aSSascha Wildner 
2215*7556134aSSascha Wildner void
ungetch(c)2216*7556134aSSascha Wildner ungetch(c)			/* push a character back on input	*/
2217*7556134aSSascha Wildner int c;
2218*7556134aSSascha Wildner {
2219*7556134aSSascha Wildner 	if (bufp < 100)
2220*7556134aSSascha Wildner 		in_buff[bufp++] = c;
2221*7556134aSSascha Wildner }
2222*7556134aSSascha Wildner 
2223*7556134aSSascha Wildner #ifdef BSD_SELECT
2224*7556134aSSascha Wildner int
timed_getchar()2225*7556134aSSascha Wildner timed_getchar()
2226*7556134aSSascha Wildner {
2227*7556134aSSascha Wildner 	struct timeval tv;
2228*7556134aSSascha Wildner 	fd_set fds;
2229*7556134aSSascha Wildner 	int ret_val;
2230*7556134aSSascha Wildner 	int nfds = 1;
2231*7556134aSSascha Wildner 	char temp;
2232*7556134aSSascha Wildner 
2233*7556134aSSascha Wildner 	FD_ZERO(&fds);
2234*7556134aSSascha Wildner 	tv.tv_sec = 0;
2235*7556134aSSascha Wildner 	tv.tv_usec = 500000;  /* half a second */
2236*7556134aSSascha Wildner 	FD_SET(0, &fds);
2237*7556134aSSascha Wildner 	Time_Out = FALSE; /* just in case */
2238*7556134aSSascha Wildner 
2239*7556134aSSascha Wildner 	ret_val = select(nfds, &fds, 0, 0, &tv);
2240*7556134aSSascha Wildner 
2241*7556134aSSascha Wildner 	/*
2242*7556134aSSascha Wildner 	 |	if ret_val is less than zero, there was no input
2243*7556134aSSascha Wildner 	 |	otherwise, get a character and return it
2244*7556134aSSascha Wildner 	 */
2245*7556134aSSascha Wildner 
2246*7556134aSSascha Wildner 	if (ret_val <= 0)
2247*7556134aSSascha Wildner 	{
2248*7556134aSSascha Wildner 		Time_Out = TRUE;
2249*7556134aSSascha Wildner 		return(-1);
2250*7556134aSSascha Wildner 	}
2251*7556134aSSascha Wildner 
2252*7556134aSSascha Wildner 	return(read(0, &temp, 1)? temp : -1);
2253*7556134aSSascha Wildner }
2254*7556134aSSascha Wildner #endif
2255*7556134aSSascha Wildner 
2256*7556134aSSascha Wildner int
wgetch(window)2257*7556134aSSascha Wildner wgetch(window)			/* get character from specified window	*/
2258*7556134aSSascha Wildner WINDOW *window;
2259*7556134aSSascha Wildner {
2260*7556134aSSascha Wildner 	int in_value;
2261*7556134aSSascha Wildner 	char temp;
2262*7556134aSSascha Wildner #ifndef SYS5
2263*7556134aSSascha Wildner 	int old_arg;
2264*7556134aSSascha Wildner #endif /* SYS5 */
2265*7556134aSSascha Wildner 
2266*7556134aSSascha Wildner #ifdef BSD_SELECT
2267*7556134aSSascha Wildner 	if (Noblock)
2268*7556134aSSascha Wildner 		in_value = ((bufp > 0) ? in_buff[--bufp] : timed_getchar());
2269*7556134aSSascha Wildner 	else
2270*7556134aSSascha Wildner 		in_value = ((bufp > 0) ? in_buff[--bufp] : read(0, &temp, 1)? temp : -1);
2271*7556134aSSascha Wildner #else /* BSD_SELECT */
2272*7556134aSSascha Wildner #ifdef SYS5
2273*7556134aSSascha Wildner 	in_value = ((bufp > 0) ? in_buff[--bufp] :
2274*7556134aSSascha Wildner 					(read(0, &temp, 1)> 0) ? temp : -1);
2275*7556134aSSascha Wildner #else /* SYS5 */
2276*7556134aSSascha Wildner 	if (Noblock)
2277*7556134aSSascha Wildner 	{
2278*7556134aSSascha Wildner 		Time_Out = FALSE;
2279*7556134aSSascha Wildner 		old_arg = fcntl(0, F_GETFL, 0);
2280*7556134aSSascha Wildner 		in_value = fcntl(0, F_SETFL, old_arg | FNDELAY);
2281*7556134aSSascha Wildner 	}
2282*7556134aSSascha Wildner 	in_value = ((bufp > 0) ? in_buff[--bufp] : read(0, &temp, 1)? temp : -1);
2283*7556134aSSascha Wildner 	if (Noblock)
2284*7556134aSSascha Wildner 	{
2285*7556134aSSascha Wildner 		fcntl(0, F_SETFL, old_arg);
2286*7556134aSSascha Wildner 		if (Time_Out)
2287*7556134aSSascha Wildner 			in_value = -1;
2288*7556134aSSascha Wildner 	}
2289*7556134aSSascha Wildner #endif /* SYS5 */
2290*7556134aSSascha Wildner #endif /* BSD_SELECT */
2291*7556134aSSascha Wildner 
2292*7556134aSSascha Wildner 	if (in_value != -1)
2293*7556134aSSascha Wildner 	{
2294*7556134aSSascha Wildner 		in_value &= 0xff;
2295*7556134aSSascha Wildner 		if ((Parity) && (Num_bits < 8))
2296*7556134aSSascha Wildner 				/* strip eighth bit if parity in use */
2297*7556134aSSascha Wildner 		in_value &= 0177;
2298*7556134aSSascha Wildner 	}
2299*7556134aSSascha Wildner 	else if (interrupt_flag)
2300*7556134aSSascha Wildner 	{
2301*7556134aSSascha Wildner 		interrupt_flag = FALSE;
2302*7556134aSSascha Wildner 		in_value = wgetch(window);
2303*7556134aSSascha Wildner 	}
2304*7556134aSSascha Wildner 
2305*7556134aSSascha Wildner 	if ((in_value == '\033') || (in_value == '\037'))/* escape character */
2306*7556134aSSascha Wildner 		in_value = Get_key(in_value);
2307*7556134aSSascha Wildner 	return(in_value);
2308*7556134aSSascha Wildner }
2309*7556134aSSascha Wildner 
2310*7556134aSSascha Wildner #ifndef BSD_SELECT
2311*7556134aSSascha Wildner void
Clear(arg)2312*7556134aSSascha Wildner Clear(arg)		/* notify that time out has occurred	*/
2313*7556134aSSascha Wildner int arg;
2314*7556134aSSascha Wildner {
2315*7556134aSSascha Wildner 	Time_Out = TRUE;
2316*7556134aSSascha Wildner #ifdef DEBUG
2317*7556134aSSascha Wildner fprintf(stderr, "inside Clear()\n");
2318*7556134aSSascha Wildner fflush(stderr);
2319*7556134aSSascha Wildner #endif /* DEBUG */
2320*7556134aSSascha Wildner }
2321*7556134aSSascha Wildner #endif /* BSD_SELECT */
2322*7556134aSSascha Wildner 
2323*7556134aSSascha Wildner int
Get_key(first_char)2324*7556134aSSascha Wildner Get_key(first_char)			/* try to decode key sequence	*/
2325*7556134aSSascha Wildner int first_char;				/* first character of sequence	*/
2326*7556134aSSascha Wildner {
2327*7556134aSSascha Wildner 	int in_char;
2328*7556134aSSascha Wildner 	int Count;
2329*7556134aSSascha Wildner 	char string[128];
2330*7556134aSSascha Wildner 	char *Gtemp;
2331*7556134aSSascha Wildner 	int Found;
2332*7556134aSSascha Wildner #ifdef SYS5
2333*7556134aSSascha Wildner 	struct termio Gterminal;
2334*7556134aSSascha Wildner #else
2335*7556134aSSascha Wildner 	struct sgttyb Gterminal;
2336*7556134aSSascha Wildner #endif
2337*7556134aSSascha Wildner 	struct KEY_STACK *St_point;
2338*7556134aSSascha Wildner #if (!defined( BSD_SELECT)) || (!defined(SYS5))
2339*7556134aSSascha Wildner 	int value;
2340*7556134aSSascha Wildner #endif /* BSD_SELECT */
2341*7556134aSSascha Wildner 
2342*7556134aSSascha Wildner 	Count = 0;
2343*7556134aSSascha Wildner 	Gtemp = string;
2344*7556134aSSascha Wildner 	string[Count++] = first_char;
2345*7556134aSSascha Wildner 	string[Count] = '\0';
2346*7556134aSSascha Wildner 	Time_Out = FALSE;
2347*7556134aSSascha Wildner #ifndef BSD_SELECT
2348*7556134aSSascha Wildner 	signal(SIGALRM, Clear);
2349*7556134aSSascha Wildner 	value = alarm(1);
2350*7556134aSSascha Wildner #endif /* BSD_SELECT */
2351*7556134aSSascha Wildner 	Noblock = TRUE;
2352*7556134aSSascha Wildner #ifdef SYS5
2353*7556134aSSascha Wildner 	Gterminal.c_cc[VTIME] = 0;		/* timeout value	*/
2354*7556134aSSascha Wildner 	Gterminal.c_lflag &= ~ICANON;	/* disable canonical operation	*/
2355*7556134aSSascha Wildner 	Gterminal.c_lflag &= ~ECHO;		/* disable echo		*/
2356*7556134aSSascha Wildner #endif
2357*7556134aSSascha Wildner 	Count = 1;
2358*7556134aSSascha Wildner 	Found = FALSE;
2359*7556134aSSascha Wildner 	while ((Count < Max_Key_len) && (!Time_Out) && (!Found))
2360*7556134aSSascha Wildner 	{
2361*7556134aSSascha Wildner 		in_char = wgetch(stdscr);
2362*7556134aSSascha Wildner #ifdef DEBUG
2363*7556134aSSascha Wildner fprintf(stderr, "back in GetKey()\n");
2364*7556134aSSascha Wildner fflush(stderr);
2365*7556134aSSascha Wildner #endif /* DEBUG */
2366*7556134aSSascha Wildner 		if (in_char != -1)
2367*7556134aSSascha Wildner 		{
2368*7556134aSSascha Wildner 			string[Count++] = in_char;
2369*7556134aSSascha Wildner 			string[Count] = '\0';
2370*7556134aSSascha Wildner 			St_point = KEY_TOS;
2371*7556134aSSascha Wildner 			while ((St_point != NULL) && (!Found))
2372*7556134aSSascha Wildner 			{
2373*7556134aSSascha Wildner 				if (!strcmp(string, St_point->element->string))
2374*7556134aSSascha Wildner 					Found = TRUE;
2375*7556134aSSascha Wildner 				else
2376*7556134aSSascha Wildner 					St_point = St_point->next;
2377*7556134aSSascha Wildner 			}
2378*7556134aSSascha Wildner 		}
2379*7556134aSSascha Wildner 	}
2380*7556134aSSascha Wildner #ifndef BSD_SELECT
2381*7556134aSSascha Wildner 	if (!Time_Out)
2382*7556134aSSascha Wildner 		value = alarm(0);
2383*7556134aSSascha Wildner #endif /* BSD_SELECT */
2384*7556134aSSascha Wildner #ifdef SYS5
2385*7556134aSSascha Wildner /*	value = ioctl(0, TCSETA, &Terminal);*/
2386*7556134aSSascha Wildner #else
2387*7556134aSSascha Wildner 	value = ioctl(0, TIOCSETP, &Terminal);
2388*7556134aSSascha Wildner /*	value = fcntl(0, F_SETFL, old_arg);*/
2389*7556134aSSascha Wildner #endif
2390*7556134aSSascha Wildner 	Noblock = FALSE;
2391*7556134aSSascha Wildner 	if (Found)
2392*7556134aSSascha Wildner 	{
2393*7556134aSSascha Wildner 		return(St_point->element->value);
2394*7556134aSSascha Wildner 	}
2395*7556134aSSascha Wildner 	else
2396*7556134aSSascha Wildner 	{
2397*7556134aSSascha Wildner 		while (Count > 1)
2398*7556134aSSascha Wildner 		{
2399*7556134aSSascha Wildner 			if ((string[--Count] != -1) &&
2400*7556134aSSascha Wildner 					((unsigned char) (string[Count]) != 255))
2401*7556134aSSascha Wildner 			{
2402*7556134aSSascha Wildner #ifdef DIAG
2403*7556134aSSascha Wildner fprintf(stderr, "ungetting character %d\n", string[Count]);fflush(stdout);
2404*7556134aSSascha Wildner #endif
2405*7556134aSSascha Wildner 				ungetch(string[Count]);
2406*7556134aSSascha Wildner 			}
2407*7556134aSSascha Wildner 		}
2408*7556134aSSascha Wildner 		return(first_char);
2409*7556134aSSascha Wildner 	}
2410*7556134aSSascha Wildner }
2411*7556134aSSascha Wildner 
2412*7556134aSSascha Wildner void
waddch(window,c)2413*7556134aSSascha Wildner waddch(window, c)	/* output the character in the specified window	*/
2414*7556134aSSascha Wildner WINDOW *window;
2415*7556134aSSascha Wildner int c;
2416*7556134aSSascha Wildner {
2417*7556134aSSascha Wildner 	int column, j;
2418*7556134aSSascha Wildner 	int shift;	/* number of spaces to shift if a tab		*/
2419*7556134aSSascha Wildner 	struct _line *tmpline;
2420*7556134aSSascha Wildner 
2421*7556134aSSascha Wildner #ifdef DIAG
2422*7556134aSSascha Wildner /*printf("starting waddch \n");fflush(stdout);*/
2423*7556134aSSascha Wildner #endif
2424*7556134aSSascha Wildner 	column = window->LX;
2425*7556134aSSascha Wildner 	if (c == '\t')
2426*7556134aSSascha Wildner 	{
2427*7556134aSSascha Wildner 		shift = (column + 1) % 8;
2428*7556134aSSascha Wildner 		if (shift == 0)
2429*7556134aSSascha Wildner 			shift++;
2430*7556134aSSascha Wildner 		else
2431*7556134aSSascha Wildner 			shift = 9 - shift;
2432*7556134aSSascha Wildner 		while (shift > 0)
2433*7556134aSSascha Wildner 		{
2434*7556134aSSascha Wildner 			shift--;
2435*7556134aSSascha Wildner 			waddch(window, ' ');
2436*7556134aSSascha Wildner 		}
2437*7556134aSSascha Wildner 	}
2438*7556134aSSascha Wildner 	else if ((column < window->Num_cols) && (window->LY < window->Num_lines))
2439*7556134aSSascha Wildner 	{
2440*7556134aSSascha Wildner 		if ((c == '~') && (Booleans[hz__]))
2441*7556134aSSascha Wildner 			c = '@';
2442*7556134aSSascha Wildner 
2443*7556134aSSascha Wildner 		if (( c != '\b') && (c != '\n') && (c != '\r'))
2444*7556134aSSascha Wildner 		{
2445*7556134aSSascha Wildner 			tmpline = window->line_array[window->LY];
2446*7556134aSSascha Wildner 			tmpline->row[column] = c;
2447*7556134aSSascha Wildner 			tmpline->attributes[column] = window->Attrib;
2448*7556134aSSascha Wildner 			tmpline->changed = TRUE;
2449*7556134aSSascha Wildner 			if (column >= tmpline->last_char)
2450*7556134aSSascha Wildner 			{
2451*7556134aSSascha Wildner 				if (column > tmpline->last_char)
2452*7556134aSSascha Wildner 					for (j = tmpline->last_char; j < column; j++)
2453*7556134aSSascha Wildner 					{
2454*7556134aSSascha Wildner 						tmpline->row[j] = ' ';
2455*7556134aSSascha Wildner 						tmpline->attributes[j] = '\0';
2456*7556134aSSascha Wildner 					}
2457*7556134aSSascha Wildner 				tmpline->row[column + 1] = '\0';
2458*7556134aSSascha Wildner 				tmpline->attributes[column + 1] = '\0';
2459*7556134aSSascha Wildner 				tmpline->last_char = column + 1;
2460*7556134aSSascha Wildner 			}
2461*7556134aSSascha Wildner 		}
2462*7556134aSSascha Wildner 		if (c == '\n')
2463*7556134aSSascha Wildner 		{
2464*7556134aSSascha Wildner 			wclrtoeol(window);
2465*7556134aSSascha Wildner 			window->LX = window->Num_cols;
2466*7556134aSSascha Wildner 		}
2467*7556134aSSascha Wildner 		else if (c == '\r')
2468*7556134aSSascha Wildner 			window->LX = 0;
2469*7556134aSSascha Wildner 		else if (c == '\b')
2470*7556134aSSascha Wildner 			window->LX--;
2471*7556134aSSascha Wildner 		else
2472*7556134aSSascha Wildner 			window->LX++;
2473*7556134aSSascha Wildner 	}
2474*7556134aSSascha Wildner 	if (window->LX >= window->Num_cols)
2475*7556134aSSascha Wildner 	{
2476*7556134aSSascha Wildner 		window->LX = 0;
2477*7556134aSSascha Wildner 		window->LY++;
2478*7556134aSSascha Wildner 		if (window->LY >= window->Num_lines)
2479*7556134aSSascha Wildner 		{
2480*7556134aSSascha Wildner 			window->LY = window->Num_lines - 1;
2481*7556134aSSascha Wildner /*			window->LY = row;
2482*7556134aSSascha Wildner 			wmove(window, 0, 0);
2483*7556134aSSascha Wildner 			wdeleteln(window);
2484*7556134aSSascha Wildner 			wmove(window, row, 0);*/
2485*7556134aSSascha Wildner 		}
2486*7556134aSSascha Wildner 	}
2487*7556134aSSascha Wildner 	window->SCROLL_CLEAR = CHANGE;
2488*7556134aSSascha Wildner }
2489*7556134aSSascha Wildner 
2490*7556134aSSascha Wildner void
winsertln(window)2491*7556134aSSascha Wildner winsertln(window)	/* insert a blank line into the specified window */
2492*7556134aSSascha Wildner WINDOW *window;
2493*7556134aSSascha Wildner {
2494*7556134aSSascha Wildner 	int row, column;
2495*7556134aSSascha Wildner 	struct _line *tmp;
2496*7556134aSSascha Wildner 	struct _line *tmp1;
2497*7556134aSSascha Wildner 
2498*7556134aSSascha Wildner 	window->scroll_down += 1;
2499*7556134aSSascha Wildner 	window->SCROLL_CLEAR = SCROLL;
2500*7556134aSSascha Wildner 	column = window->LX;
2501*7556134aSSascha Wildner 	row = window->LY;
2502*7556134aSSascha Wildner 	for (row = 0, tmp = window->first_line; (row < window->Num_lines) && (tmp->next_screen != NULL); row++)
2503*7556134aSSascha Wildner 		tmp = tmp->next_screen;
2504*7556134aSSascha Wildner 	if (tmp->prev_screen != NULL)
2505*7556134aSSascha Wildner 		tmp->prev_screen->next_screen = NULL;
2506*7556134aSSascha Wildner 	tmp1 = tmp;
2507*7556134aSSascha Wildner 	clear_line(tmp1, 0, window->Num_cols);
2508*7556134aSSascha Wildner 	tmp1->number = -1;
2509*7556134aSSascha Wildner 	for (row = 0, tmp = window->first_line; (row < window->LY) && (tmp->next_screen != NULL); row++)
2510*7556134aSSascha Wildner 		tmp = tmp->next_screen;
2511*7556134aSSascha Wildner 	if ((window->LY == (window->Num_lines - 1)) && (window->Num_lines > 1))
2512*7556134aSSascha Wildner 	{
2513*7556134aSSascha Wildner 		tmp1->next_screen = tmp->next_screen;
2514*7556134aSSascha Wildner 		tmp->next_screen = tmp1;
2515*7556134aSSascha Wildner 		tmp->changed = TRUE;
2516*7556134aSSascha Wildner 		tmp->next_screen->prev_screen = tmp;
2517*7556134aSSascha Wildner 	}
2518*7556134aSSascha Wildner 	else if (window->Num_lines > 1)
2519*7556134aSSascha Wildner 	{
2520*7556134aSSascha Wildner 		if (tmp->prev_screen != NULL)
2521*7556134aSSascha Wildner 			tmp->prev_screen->next_screen = tmp1;
2522*7556134aSSascha Wildner 		tmp1->prev_screen = tmp->prev_screen;
2523*7556134aSSascha Wildner 		tmp->prev_screen = tmp1;
2524*7556134aSSascha Wildner 		tmp1->next_screen = tmp;
2525*7556134aSSascha Wildner 		tmp->changed = TRUE;
2526*7556134aSSascha Wildner 		tmp->scroll = DOWN;
2527*7556134aSSascha Wildner 	}
2528*7556134aSSascha Wildner 	if (window->LY == 0)
2529*7556134aSSascha Wildner 		window->first_line = tmp1;
2530*7556134aSSascha Wildner 
2531*7556134aSSascha Wildner 	for (row = 0, tmp1 = window->first_line;
2532*7556134aSSascha Wildner 		row < window->Num_lines; row++)
2533*7556134aSSascha Wildner 	{
2534*7556134aSSascha Wildner 		window->line_array[row] = tmp1;
2535*7556134aSSascha Wildner 		tmp1 = tmp1->next_screen;
2536*7556134aSSascha Wildner 	}
2537*7556134aSSascha Wildner }
2538*7556134aSSascha Wildner 
2539*7556134aSSascha Wildner void
wdeleteln(window)2540*7556134aSSascha Wildner wdeleteln(window)	/* delete a line in the specified window */
2541*7556134aSSascha Wildner WINDOW *window;
2542*7556134aSSascha Wildner {
2543*7556134aSSascha Wildner 	int row, column;
2544*7556134aSSascha Wildner 	struct _line *tmp;
2545*7556134aSSascha Wildner 	struct _line  *tmpline;
2546*7556134aSSascha Wildner 
2547*7556134aSSascha Wildner 	if (window->Num_lines > 1)
2548*7556134aSSascha Wildner 	{
2549*7556134aSSascha Wildner 		window->scroll_up += 1;
2550*7556134aSSascha Wildner 		window->SCROLL_CLEAR = SCROLL;
2551*7556134aSSascha Wildner 		column = window->LX;
2552*7556134aSSascha Wildner 		row = window->LY;
2553*7556134aSSascha Wildner 		for (row = 0, tmp = window->first_line; row < window->LY; row++)
2554*7556134aSSascha Wildner 			tmp = tmp->next_screen;
2555*7556134aSSascha Wildner 		if (window->LY == 0)
2556*7556134aSSascha Wildner 			window->first_line = tmp->next_screen;
2557*7556134aSSascha Wildner 		if (tmp->prev_screen != NULL)
2558*7556134aSSascha Wildner 			tmp->prev_screen->next_screen = tmp->next_screen;
2559*7556134aSSascha Wildner 		if (tmp->next_screen != NULL)
2560*7556134aSSascha Wildner 		{
2561*7556134aSSascha Wildner 			tmp->next_screen->changed = TRUE;
2562*7556134aSSascha Wildner 			tmp->next_screen->scroll = UP;
2563*7556134aSSascha Wildner 			tmp->next_screen->prev_screen = tmp->prev_screen;
2564*7556134aSSascha Wildner 		}
2565*7556134aSSascha Wildner 		tmpline = tmp;
2566*7556134aSSascha Wildner 		clear_line(tmpline, 0, window->Num_cols);
2567*7556134aSSascha Wildner 		tmpline->number = -1;
2568*7556134aSSascha Wildner 		for (row = 0, tmp = window->first_line; tmp->next_screen != NULL; row++)
2569*7556134aSSascha Wildner 			tmp = tmp->next_screen;
2570*7556134aSSascha Wildner 		if (tmp != NULL)
2571*7556134aSSascha Wildner 		{
2572*7556134aSSascha Wildner 			tmp->next_screen = tmpline;
2573*7556134aSSascha Wildner 			tmp->next_screen->prev_screen = tmp;
2574*7556134aSSascha Wildner 			tmp->changed = TRUE;
2575*7556134aSSascha Wildner 			tmp = tmp->next_screen;
2576*7556134aSSascha Wildner 		}
2577*7556134aSSascha Wildner 		else
2578*7556134aSSascha Wildner 			tmp = tmpline;
2579*7556134aSSascha Wildner 		tmp->next_screen = NULL;
2580*7556134aSSascha Wildner 
2581*7556134aSSascha Wildner 		for (row = 0, tmp = window->first_line; row < window->Num_lines; row++)
2582*7556134aSSascha Wildner 		{
2583*7556134aSSascha Wildner 			window->line_array[row] = tmp;
2584*7556134aSSascha Wildner 			tmp = tmp->next_screen;
2585*7556134aSSascha Wildner 		}
2586*7556134aSSascha Wildner 	}
2587*7556134aSSascha Wildner 	else
2588*7556134aSSascha Wildner 	{
2589*7556134aSSascha Wildner 		clear_line(window->first_line, 0, window->Num_cols);
2590*7556134aSSascha Wildner 	}
2591*7556134aSSascha Wildner }
2592*7556134aSSascha Wildner 
2593*7556134aSSascha Wildner void
wclrtobot(window)2594*7556134aSSascha Wildner wclrtobot(window)	/* delete from current position to end of the window */
2595*7556134aSSascha Wildner WINDOW *window;
2596*7556134aSSascha Wildner {
2597*7556134aSSascha Wildner 	int row, column;
2598*7556134aSSascha Wildner 	struct _line *tmp;
2599*7556134aSSascha Wildner 
2600*7556134aSSascha Wildner 	window->SCROLL_CLEAR |= CLEAR;
2601*7556134aSSascha Wildner 	column = window->LX;
2602*7556134aSSascha Wildner 	row = window->LY;
2603*7556134aSSascha Wildner 	for (row = 0, tmp = window->first_line; row < window->LY; row++)
2604*7556134aSSascha Wildner 		tmp = tmp->next_screen;
2605*7556134aSSascha Wildner 	clear_line(tmp, column, window->Num_cols);
2606*7556134aSSascha Wildner 	for (row = (window->LY + 1); row < window->Num_lines; row++)
2607*7556134aSSascha Wildner 	{
2608*7556134aSSascha Wildner 		tmp = tmp->next_screen;
2609*7556134aSSascha Wildner 		clear_line(tmp, 0, window->Num_cols);
2610*7556134aSSascha Wildner 	}
2611*7556134aSSascha Wildner 	wmove(window, row, column);
2612*7556134aSSascha Wildner }
2613*7556134aSSascha Wildner 
2614*7556134aSSascha Wildner void
wstandout(window)2615*7556134aSSascha Wildner wstandout(window)	/* begin standout mode in window	*/
2616*7556134aSSascha Wildner WINDOW *window;
2617*7556134aSSascha Wildner {
2618*7556134aSSascha Wildner 	if (Numbers[sg__] < 1)	/* if not magic cookie glitch	*/
2619*7556134aSSascha Wildner 		window->Attrib |= A_STANDOUT;
2620*7556134aSSascha Wildner }
2621*7556134aSSascha Wildner 
2622*7556134aSSascha Wildner void
wstandend(window)2623*7556134aSSascha Wildner wstandend(window)	/* end standout mode in window	*/
2624*7556134aSSascha Wildner WINDOW *window;
2625*7556134aSSascha Wildner {
2626*7556134aSSascha Wildner 	window->Attrib &= ~A_STANDOUT;
2627*7556134aSSascha Wildner }
2628*7556134aSSascha Wildner 
2629*7556134aSSascha Wildner void
waddstr(window,string)2630*7556134aSSascha Wildner waddstr(window, string)	/* write 'string' in window	*/
2631*7556134aSSascha Wildner WINDOW *window;
2632*7556134aSSascha Wildner char *string;
2633*7556134aSSascha Wildner {
2634*7556134aSSascha Wildner 	char *wstring;
2635*7556134aSSascha Wildner 
2636*7556134aSSascha Wildner 	for (wstring = string; *wstring != '\0'; wstring++)
2637*7556134aSSascha Wildner 		waddch(window, *wstring);
2638*7556134aSSascha Wildner }
2639*7556134aSSascha Wildner 
2640*7556134aSSascha Wildner void
clearok(window,flag)2641*7556134aSSascha Wildner clearok(window, flag)	/* erase screen and redraw at next refresh	*/
2642*7556134aSSascha Wildner WINDOW *window;
2643*7556134aSSascha Wildner int flag;
2644*7556134aSSascha Wildner {
2645*7556134aSSascha Wildner 	Repaint_screen = TRUE;
2646*7556134aSSascha Wildner }
2647*7556134aSSascha Wildner 
2648*7556134aSSascha Wildner 
2649*7556134aSSascha Wildner void
echo()2650*7556134aSSascha Wildner echo()			/* turn on echoing				*/
2651*7556134aSSascha Wildner {
2652*7556134aSSascha Wildner 	int value;
2653*7556134aSSascha Wildner 
2654*7556134aSSascha Wildner #ifdef SYS5
2655*7556134aSSascha Wildner 	Terminal.c_lflag |= ECHO;		/* enable echo		*/
2656*7556134aSSascha Wildner 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
2657*7556134aSSascha Wildner #else
2658*7556134aSSascha Wildner 	Terminal.sg_flags |= ECHO;		/* enable echo		*/
2659*7556134aSSascha Wildner 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
2660*7556134aSSascha Wildner #endif
2661*7556134aSSascha Wildner }
2662*7556134aSSascha Wildner 
2663*7556134aSSascha Wildner void
noecho()2664*7556134aSSascha Wildner noecho()		/* turn off echoing				*/
2665*7556134aSSascha Wildner {
2666*7556134aSSascha Wildner 	int value;
2667*7556134aSSascha Wildner 
2668*7556134aSSascha Wildner #ifdef SYS5
2669*7556134aSSascha Wildner 	Terminal.c_lflag &= ~ECHO;		/* disable echo		*/
2670*7556134aSSascha Wildner 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
2671*7556134aSSascha Wildner #else
2672*7556134aSSascha Wildner 	Terminal.sg_flags &= ~ECHO;		/* disable echo		*/
2673*7556134aSSascha Wildner 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
2674*7556134aSSascha Wildner #endif
2675*7556134aSSascha Wildner }
2676*7556134aSSascha Wildner 
2677*7556134aSSascha Wildner void
raw()2678*7556134aSSascha Wildner raw()			/* set to read characters immediately		*/
2679*7556134aSSascha Wildner {
2680*7556134aSSascha Wildner 	int value;
2681*7556134aSSascha Wildner 
2682*7556134aSSascha Wildner #ifdef SYS5
2683*7556134aSSascha Wildner 	Intr = Terminal.c_cc[VINTR];	/* get the interrupt character	*/
2684*7556134aSSascha Wildner 	Terminal.c_lflag &= ~ICANON;	/* disable canonical operation	*/
2685*7556134aSSascha Wildner 	Terminal.c_lflag &= ~ISIG;	/* disable signal checking	*/
2686*7556134aSSascha Wildner #ifdef FLUSHO
2687*7556134aSSascha Wildner 	Terminal.c_lflag &= ~FLUSHO;
2688*7556134aSSascha Wildner #endif
2689*7556134aSSascha Wildner #ifdef PENDIN
2690*7556134aSSascha Wildner 	Terminal.c_lflag &= ~PENDIN;
2691*7556134aSSascha Wildner #endif
2692*7556134aSSascha Wildner #ifdef IEXTEN
2693*7556134aSSascha Wildner 	Terminal.c_lflag &= ~IEXTEN;
2694*7556134aSSascha Wildner #endif
2695*7556134aSSascha Wildner 	Terminal.c_cc[VMIN] = 1;		/* minimum of one character */
2696*7556134aSSascha Wildner 	Terminal.c_cc[VTIME] = 0;		/* timeout value	*/
2697*7556134aSSascha Wildner 	Terminal.c_cc[VINTR] = 0;		/* eliminate interrupt	*/
2698*7556134aSSascha Wildner 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
2699*7556134aSSascha Wildner #else
2700*7556134aSSascha Wildner 	Terminal.sg_flags |= RAW;	/* enable raw mode		*/
2701*7556134aSSascha Wildner 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
2702*7556134aSSascha Wildner #endif
2703*7556134aSSascha Wildner }
2704*7556134aSSascha Wildner 
2705*7556134aSSascha Wildner void
noraw()2706*7556134aSSascha Wildner noraw()			/* set to normal character read mode		*/
2707*7556134aSSascha Wildner {
2708*7556134aSSascha Wildner 	int value;
2709*7556134aSSascha Wildner 
2710*7556134aSSascha Wildner #ifdef SYS5
2711*7556134aSSascha Wildner 	Terminal.c_lflag |= ICANON;	/* enable canonical operation	*/
2712*7556134aSSascha Wildner 	Terminal.c_lflag |= ISIG;	/* enable signal checking	*/
2713*7556134aSSascha Wildner 	Terminal.c_cc[VEOF] = 4;		/* EOF character = 4	*/
2714*7556134aSSascha Wildner 	Terminal.c_cc[VEOL] = '\0';	/* EOL = 0		*/
2715*7556134aSSascha Wildner 	Terminal.c_cc[VINTR] = Intr;		/* reset interrupt char	*/
2716*7556134aSSascha Wildner 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
2717*7556134aSSascha Wildner #else
2718*7556134aSSascha Wildner 	Terminal.sg_flags &= ~RAW;	/* disable raw mode		*/
2719*7556134aSSascha Wildner 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
2720*7556134aSSascha Wildner /*	old_arg = fcntl(0, F_GETFL, 0);
2721*7556134aSSascha Wildner 	value = fcntl(0, F_SETFL, old_arg & ~FNDELAY);*/
2722*7556134aSSascha Wildner #endif
2723*7556134aSSascha Wildner }
2724*7556134aSSascha Wildner 
2725*7556134aSSascha Wildner void
nl()2726*7556134aSSascha Wildner nl()
2727*7556134aSSascha Wildner {
2728*7556134aSSascha Wildner 	int value;
2729*7556134aSSascha Wildner 
2730*7556134aSSascha Wildner #ifdef SYS5
2731*7556134aSSascha Wildner 	Terminal.c_iflag |= ICRNL;	/* enable carriage-return to line-feed mapping	*/
2732*7556134aSSascha Wildner 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
2733*7556134aSSascha Wildner #endif
2734*7556134aSSascha Wildner }
2735*7556134aSSascha Wildner 
2736*7556134aSSascha Wildner void
nonl()2737*7556134aSSascha Wildner nonl()
2738*7556134aSSascha Wildner {
2739*7556134aSSascha Wildner 	int value;
2740*7556134aSSascha Wildner 
2741*7556134aSSascha Wildner #ifdef SYS5
2742*7556134aSSascha Wildner 	Terminal.c_iflag &= ~ICRNL;	/* disable carriage-return to line-feed mapping	*/
2743*7556134aSSascha Wildner 	Terminal.c_iflag &= ~IGNCR;	/* do not ignore carriage-return	*/
2744*7556134aSSascha Wildner 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
2745*7556134aSSascha Wildner #endif
2746*7556134aSSascha Wildner }
2747*7556134aSSascha Wildner 
2748*7556134aSSascha Wildner void
saveterm()2749*7556134aSSascha Wildner saveterm()
2750*7556134aSSascha Wildner {
2751*7556134aSSascha Wildner }
2752*7556134aSSascha Wildner 
2753*7556134aSSascha Wildner void
fixterm()2754*7556134aSSascha Wildner fixterm()
2755*7556134aSSascha Wildner {
2756*7556134aSSascha Wildner }
2757*7556134aSSascha Wildner 
2758*7556134aSSascha Wildner void
resetterm()2759*7556134aSSascha Wildner resetterm()
2760*7556134aSSascha Wildner {
2761*7556134aSSascha Wildner }
2762*7556134aSSascha Wildner 
2763*7556134aSSascha Wildner void
nodelay(window,flag)2764*7556134aSSascha Wildner nodelay(window, flag)
2765*7556134aSSascha Wildner WINDOW *window;
2766*7556134aSSascha Wildner int flag;
2767*7556134aSSascha Wildner {
2768*7556134aSSascha Wildner }
2769*7556134aSSascha Wildner 
2770*7556134aSSascha Wildner void
idlok(window,flag)2771*7556134aSSascha Wildner idlok(window, flag)
2772*7556134aSSascha Wildner WINDOW *window;
2773*7556134aSSascha Wildner int flag;
2774*7556134aSSascha Wildner {
2775*7556134aSSascha Wildner }
2776*7556134aSSascha Wildner 
2777*7556134aSSascha Wildner void
keypad(window,flag)2778*7556134aSSascha Wildner keypad(window, flag)
2779*7556134aSSascha Wildner WINDOW *window;
2780*7556134aSSascha Wildner int flag;
2781*7556134aSSascha Wildner {
2782*7556134aSSascha Wildner 	if (flag)
2783*7556134aSSascha Wildner 		String_Out(String_table[ks__], NULL, 0);
2784*7556134aSSascha Wildner 	else
2785*7556134aSSascha Wildner 		String_Out(String_table[ke__], NULL, 0);
2786*7556134aSSascha Wildner }
2787*7556134aSSascha Wildner 
2788*7556134aSSascha Wildner void
savetty()2789*7556134aSSascha Wildner savetty()		/* save current tty stats			*/
2790*7556134aSSascha Wildner {
2791*7556134aSSascha Wildner 	int value;
2792*7556134aSSascha Wildner 
2793*7556134aSSascha Wildner #ifdef SYS5
2794*7556134aSSascha Wildner 	value = ioctl(0, TCGETA, &Saved_tty);	/* set characteristics	*/
2795*7556134aSSascha Wildner #else
2796*7556134aSSascha Wildner 	value = ioctl(0, TIOCGETP, &Saved_tty);	/* set characteristics	*/
2797*7556134aSSascha Wildner #endif
2798*7556134aSSascha Wildner }
2799*7556134aSSascha Wildner 
2800*7556134aSSascha Wildner void
resetty()2801*7556134aSSascha Wildner resetty()		/* restore previous tty stats			*/
2802*7556134aSSascha Wildner {
2803*7556134aSSascha Wildner 	int value;
2804*7556134aSSascha Wildner 
2805*7556134aSSascha Wildner #ifdef SYS5
2806*7556134aSSascha Wildner 	value = ioctl(0, TCSETA, &Saved_tty);	/* set characteristics	*/
2807*7556134aSSascha Wildner #else
2808*7556134aSSascha Wildner 	value = ioctl(0, TIOCSETP, &Saved_tty);	/* set characteristics	*/
2809*7556134aSSascha Wildner #endif
2810*7556134aSSascha Wildner }
2811*7556134aSSascha Wildner 
2812*7556134aSSascha Wildner void
endwin()2813*7556134aSSascha Wildner endwin()		/* end windows					*/
2814*7556134aSSascha Wildner {
2815*7556134aSSascha Wildner 	keypad(stdscr, FALSE);
2816*7556134aSSascha Wildner 	initialized = FALSE;
2817*7556134aSSascha Wildner 	delwin(curscr);
2818*7556134aSSascha Wildner 	delwin(virtual_scr);
2819*7556134aSSascha Wildner 	delwin(stdscr);
2820*7556134aSSascha Wildner #ifndef SYS5
2821*7556134aSSascha Wildner {
2822*7556134aSSascha Wildner 	int old_arg, value;
2823*7556134aSSascha Wildner /*	old_arg = fcntl(0, F_GETFL, 0);
2824*7556134aSSascha Wildner 	value = fcntl(0, F_SETFL, old_arg & ~FNDELAY);*/
2825*7556134aSSascha Wildner }
2826*7556134aSSascha Wildner #endif
2827*7556134aSSascha Wildner }
2828*7556134aSSascha Wildner 
2829*7556134aSSascha Wildner void
delwin(window)2830*7556134aSSascha Wildner delwin(window)		/* delete the window structure			*/
2831*7556134aSSascha Wildner WINDOW *window;
2832*7556134aSSascha Wildner {
2833*7556134aSSascha Wildner 	int i;
2834*7556134aSSascha Wildner 
2835*7556134aSSascha Wildner 	for (i = 1; (i < window->Num_lines) && (window->first_line->next_screen != NULL); i++)
2836*7556134aSSascha Wildner 	{
2837*7556134aSSascha Wildner 		window->first_line = window->first_line->next_screen;
2838*7556134aSSascha Wildner 		free(window->first_line->prev_screen->row);
2839*7556134aSSascha Wildner 		free(window->first_line->prev_screen->attributes);
2840*7556134aSSascha Wildner 		free(window->first_line->prev_screen);
2841*7556134aSSascha Wildner 	}
2842*7556134aSSascha Wildner 	if (window == last_window_refreshed)
2843*7556134aSSascha Wildner 		last_window_refreshed = 0;
2844*7556134aSSascha Wildner 	if (window->first_line != NULL)
2845*7556134aSSascha Wildner 	{
2846*7556134aSSascha Wildner 		free(window->first_line->row);
2847*7556134aSSascha Wildner 		free(window->first_line->attributes);
2848*7556134aSSascha Wildner 		free(window->first_line);
2849*7556134aSSascha Wildner 		free(window);
2850*7556134aSSascha Wildner 	}
2851*7556134aSSascha Wildner }
2852*7556134aSSascha Wildner 
2853*7556134aSSascha Wildner #ifndef __STDC__
2854*7556134aSSascha Wildner void
wprintw(va_alist)2855*7556134aSSascha Wildner wprintw(va_alist)
2856*7556134aSSascha Wildner va_dcl
2857*7556134aSSascha Wildner #else /* __STDC__ */
2858*7556134aSSascha Wildner void
2859*7556134aSSascha Wildner wprintw(WINDOW *window, const char *format, ...)
2860*7556134aSSascha Wildner #endif /* __STDC__ */
2861*7556134aSSascha Wildner {
2862*7556134aSSascha Wildner #ifndef __STDC__
2863*7556134aSSascha Wildner 	WINDOW *window;
2864*7556134aSSascha Wildner 	char *format;
2865*7556134aSSascha Wildner 	va_list ap;
2866*7556134aSSascha Wildner #else
2867*7556134aSSascha Wildner 	va_list ap;
2868*7556134aSSascha Wildner #endif
2869*7556134aSSascha Wildner 	int value;
2870*7556134aSSascha Wildner 	char *fpoint;
2871*7556134aSSascha Wildner 	char *wtemp;
2872*7556134aSSascha Wildner 
2873*7556134aSSascha Wildner #ifndef __STDC__
2874*7556134aSSascha Wildner 	va_start(ap);
2875*7556134aSSascha Wildner 	window = va_arg(ap, WINDOW *);
2876*7556134aSSascha Wildner 	format = va_arg(ap, char *);
2877*7556134aSSascha Wildner #else /* __STDC__ */
2878*7556134aSSascha Wildner 	va_start(ap, format);
2879*7556134aSSascha Wildner #endif /* __STDC__ */
2880*7556134aSSascha Wildner 
2881*7556134aSSascha Wildner 	fpoint = (char *) format;
2882*7556134aSSascha Wildner 	while (*fpoint != '\0')
2883*7556134aSSascha Wildner 	{
2884*7556134aSSascha Wildner 		if (*fpoint == '%')
2885*7556134aSSascha Wildner 		{
2886*7556134aSSascha Wildner 			fpoint++;
2887*7556134aSSascha Wildner 			if (*fpoint == 'd')
2888*7556134aSSascha Wildner 			{
2889*7556134aSSascha Wildner 				value = va_arg(ap, int);
2890*7556134aSSascha Wildner 				iout(window, value);
2891*7556134aSSascha Wildner 			}
2892*7556134aSSascha Wildner 			else if (*fpoint == 'c')
2893*7556134aSSascha Wildner 			{
2894*7556134aSSascha Wildner 				value = va_arg(ap, int);
2895*7556134aSSascha Wildner 				waddch(window, value);
2896*7556134aSSascha Wildner 			}
2897*7556134aSSascha Wildner 			else if (*fpoint == 's')
2898*7556134aSSascha Wildner 			{
2899*7556134aSSascha Wildner 				wtemp = va_arg(ap, char *);
2900*7556134aSSascha Wildner 					waddstr(window, wtemp);
2901*7556134aSSascha Wildner 			}
2902*7556134aSSascha Wildner 			fpoint++;
2903*7556134aSSascha Wildner 		}
2904*7556134aSSascha Wildner 		else if (*fpoint == '\\')
2905*7556134aSSascha Wildner 		{
2906*7556134aSSascha Wildner 			fpoint++;
2907*7556134aSSascha Wildner 			if (*fpoint == 'n')
2908*7556134aSSascha Wildner 				waddch(window, '\n');
2909*7556134aSSascha Wildner 			else if ((*fpoint >= '0') && (*fpoint <= '9'))
2910*7556134aSSascha Wildner 			{
2911*7556134aSSascha Wildner 				value = 0;
2912*7556134aSSascha Wildner 				while ((*fpoint >= '0') && (*fpoint <= '9'))
2913*7556134aSSascha Wildner 				{
2914*7556134aSSascha Wildner 					value = (value * 8) + (*fpoint - '0');
2915*7556134aSSascha Wildner 					fpoint++;
2916*7556134aSSascha Wildner 				}
2917*7556134aSSascha Wildner 				waddch(window, value);
2918*7556134aSSascha Wildner 			}
2919*7556134aSSascha Wildner 			fpoint++;
2920*7556134aSSascha Wildner 		}
2921*7556134aSSascha Wildner 		else
2922*7556134aSSascha Wildner 			waddch(window, *fpoint++);
2923*7556134aSSascha Wildner 	}
2924*7556134aSSascha Wildner #ifdef __STDC__
2925*7556134aSSascha Wildner 	va_end(ap);
2926*7556134aSSascha Wildner #endif /* __STDC__ */
2927*7556134aSSascha Wildner }
2928*7556134aSSascha Wildner 
2929*7556134aSSascha Wildner void
iout(window,value)2930*7556134aSSascha Wildner iout(window, value)	/* output characters		*/
2931*7556134aSSascha Wildner WINDOW *window;
2932*7556134aSSascha Wildner int value;
2933*7556134aSSascha Wildner {
2934*7556134aSSascha Wildner 	int i;
2935*7556134aSSascha Wildner 
2936*7556134aSSascha Wildner 	if ((i = value / 10) != 0)
2937*7556134aSSascha Wildner 		iout(window, i);
2938*7556134aSSascha Wildner 	waddch(window, ((value % 10) + '0'));
2939*7556134aSSascha Wildner }
2940*7556134aSSascha Wildner 
2941*7556134aSSascha Wildner int
Comp_line(line1,line2)2942*7556134aSSascha Wildner Comp_line(line1, line2)		/* compare lines	*/
2943*7556134aSSascha Wildner struct _line *line1;
2944*7556134aSSascha Wildner struct _line *line2;
2945*7556134aSSascha Wildner {
2946*7556134aSSascha Wildner 	int count1;
2947*7556134aSSascha Wildner 	int i;
2948*7556134aSSascha Wildner 	char *att1, *att2;
2949*7556134aSSascha Wildner 	char *c1, *c2;
2950*7556134aSSascha Wildner 
2951*7556134aSSascha Wildner 	if (line1->last_char != line2->last_char)
2952*7556134aSSascha Wildner 		return(2);
2953*7556134aSSascha Wildner 
2954*7556134aSSascha Wildner 	c1 = line1->row;
2955*7556134aSSascha Wildner 	c2 = line2->row;
2956*7556134aSSascha Wildner 	att1 = line1->attributes;
2957*7556134aSSascha Wildner 	att2 = line2->attributes;
2958*7556134aSSascha Wildner 	i = 0;
2959*7556134aSSascha Wildner 	while ((c1[i] != '\0') && (c2[i] != '\0') && (c1[i] == c2[i]) && (att1[i] == att2[i]))
2960*7556134aSSascha Wildner 		i++;
2961*7556134aSSascha Wildner 	count1 = i + 1;
2962*7556134aSSascha Wildner 	if ((count1 == 1) && (c1[i] == '\0') && (c2[i] == '\0'))
2963*7556134aSSascha Wildner 		count1 = 0;			/* both lines blank	*/
2964*7556134aSSascha Wildner 	else if ((c1[i] == '\0') && (c2[i] == '\0'))
2965*7556134aSSascha Wildner 		count1 = -1;			/* equal		*/
2966*7556134aSSascha Wildner 	else
2967*7556134aSSascha Wildner 		count1 = 1;			/* lines unequal	*/
2968*7556134aSSascha Wildner 	return(count1);
2969*7556134aSSascha Wildner }
2970*7556134aSSascha Wildner 
2971*7556134aSSascha Wildner struct _line *
Insert_line(row,end_row,window)2972*7556134aSSascha Wildner Insert_line(row, end_row, window)	/* insert line into screen */
2973*7556134aSSascha Wildner int row;
2974*7556134aSSascha Wildner int end_row;
2975*7556134aSSascha Wildner WINDOW *window;
2976*7556134aSSascha Wildner {
2977*7556134aSSascha Wildner 	int i;
2978*7556134aSSascha Wildner 	struct _line *tmp;
2979*7556134aSSascha Wildner 	struct _line *tmp1;
2980*7556134aSSascha Wildner 
2981*7556134aSSascha Wildner 	for (i = 0, tmp = curscr->first_line; i < window->SR; i++)
2982*7556134aSSascha Wildner 		tmp = tmp->next_screen;
2983*7556134aSSascha Wildner 	if ((end_row + window->SR) == 0)
2984*7556134aSSascha Wildner 		curscr->first_line = curscr->first_line->next_screen;
2985*7556134aSSascha Wildner 	top_of_win = tmp;
2986*7556134aSSascha Wildner 	/*
2987*7556134aSSascha Wildner 	 |	find bottom line to delete
2988*7556134aSSascha Wildner 	 */
2989*7556134aSSascha Wildner 	for (i = 0, tmp = top_of_win; (tmp->next_screen != NULL) && (i < end_row); i++)
2990*7556134aSSascha Wildner 		tmp = tmp->next_screen;
2991*7556134aSSascha Wildner 	if (tmp->prev_screen != NULL)
2992*7556134aSSascha Wildner 		tmp->prev_screen->next_screen = tmp->next_screen;
2993*7556134aSSascha Wildner 	if (tmp->next_screen != NULL)
2994*7556134aSSascha Wildner 		tmp->next_screen->prev_screen = tmp->prev_screen;
2995*7556134aSSascha Wildner 	tmp1 = tmp;
2996*7556134aSSascha Wildner 	/*
2997*7556134aSSascha Wildner 	 |	clear deleted line
2998*7556134aSSascha Wildner 	 */
2999*7556134aSSascha Wildner 	clear_line(tmp, 0, window->Num_cols);
3000*7556134aSSascha Wildner 	tmp1->number = -1;
3001*7556134aSSascha Wildner 	for (i = 0, tmp = curscr->first_line; (tmp->next_screen != NULL) && (i < window->SR); i++)
3002*7556134aSSascha Wildner 		tmp = tmp->next_screen;
3003*7556134aSSascha Wildner 	top_of_win = tmp;
3004*7556134aSSascha Wildner 	for (i = 0, tmp = top_of_win; i < row; i++)
3005*7556134aSSascha Wildner 		tmp = tmp->next_screen;
3006*7556134aSSascha Wildner 	if ((tmp->prev_screen != NULL) && (window->Num_lines > 0))
3007*7556134aSSascha Wildner 		tmp->prev_screen->next_screen = tmp1;
3008*7556134aSSascha Wildner 	tmp1->prev_screen = tmp->prev_screen;
3009*7556134aSSascha Wildner 	tmp->prev_screen = tmp1;
3010*7556134aSSascha Wildner 	tmp1->next_screen = tmp;
3011*7556134aSSascha Wildner 	if ((row + window->SR) == 0)
3012*7556134aSSascha Wildner 		curscr->first_line = tmp1;
3013*7556134aSSascha Wildner 	if (tmp1->next_screen != NULL)
3014*7556134aSSascha Wildner 		tmp1 = tmp1->next_screen;
3015*7556134aSSascha Wildner 
3016*7556134aSSascha Wildner 	if ((!String_table[cs__]) && (end_row < window->Num_lines))
3017*7556134aSSascha Wildner 	{
3018*7556134aSSascha Wildner 		Position(window, (window->SR + end_row), 0);
3019*7556134aSSascha Wildner 		String_Out(String_table[dl__], NULL, 0);
3020*7556134aSSascha Wildner 	}
3021*7556134aSSascha Wildner 	Position(window, (window->SR + row), 0);
3022*7556134aSSascha Wildner 	if (String_table[al__] != NULL)
3023*7556134aSSascha Wildner 		String_Out(String_table[al__], NULL, 0);
3024*7556134aSSascha Wildner 	else
3025*7556134aSSascha Wildner 		String_Out(String_table[sr__], NULL, 0);
3026*7556134aSSascha Wildner 
3027*7556134aSSascha Wildner 	for (i = 0, top_of_win = curscr->first_line; (top_of_win->next_screen != NULL) && (i < window->SR); i++)
3028*7556134aSSascha Wildner 		top_of_win = top_of_win->next_screen;
3029*7556134aSSascha Wildner 	return(tmp1);
3030*7556134aSSascha Wildner }
3031*7556134aSSascha Wildner 
3032*7556134aSSascha Wildner 
3033*7556134aSSascha Wildner struct _line *
Delete_line(row,end_row,window)3034*7556134aSSascha Wildner Delete_line(row, end_row, window)	/* delete a line on screen */
3035*7556134aSSascha Wildner int row;
3036*7556134aSSascha Wildner int end_row;
3037*7556134aSSascha Wildner WINDOW *window;
3038*7556134aSSascha Wildner {
3039*7556134aSSascha Wildner 	int i;
3040*7556134aSSascha Wildner 	struct _line *tmp;
3041*7556134aSSascha Wildner 	struct _line *tmp1;
3042*7556134aSSascha Wildner 	struct _line *tmp2;
3043*7556134aSSascha Wildner 
3044*7556134aSSascha Wildner 	i = 0;
3045*7556134aSSascha Wildner 	tmp = curscr->first_line;
3046*7556134aSSascha Wildner 	while (i < window->SR)
3047*7556134aSSascha Wildner 	{
3048*7556134aSSascha Wildner 		i++;
3049*7556134aSSascha Wildner 		tmp = tmp->next_screen;
3050*7556134aSSascha Wildner 	}
3051*7556134aSSascha Wildner 	/*
3052*7556134aSSascha Wildner 	 |	find line to delete
3053*7556134aSSascha Wildner 	 */
3054*7556134aSSascha Wildner 	top_of_win = tmp;
3055*7556134aSSascha Wildner 	if ((row + window->SR) == 0)
3056*7556134aSSascha Wildner 		curscr->first_line = top_of_win->next_screen;
3057*7556134aSSascha Wildner 	for (i = 0, tmp = top_of_win; i < row; i++)
3058*7556134aSSascha Wildner 		tmp = tmp->next_screen;
3059*7556134aSSascha Wildner 	if (tmp->prev_screen != NULL)
3060*7556134aSSascha Wildner 		tmp->prev_screen->next_screen = tmp->next_screen;
3061*7556134aSSascha Wildner 	if (tmp->next_screen != NULL)
3062*7556134aSSascha Wildner 		tmp->next_screen->prev_screen = tmp->prev_screen;
3063*7556134aSSascha Wildner 	tmp2 = tmp->next_screen;
3064*7556134aSSascha Wildner 	tmp1 = tmp;
3065*7556134aSSascha Wildner 	/*
3066*7556134aSSascha Wildner 	 |	clear deleted line
3067*7556134aSSascha Wildner 	 */
3068*7556134aSSascha Wildner 	clear_line(tmp1, 0, window->Num_cols);
3069*7556134aSSascha Wildner 	tmp1->number = -1;
3070*7556134aSSascha Wildner 	/*
3071*7556134aSSascha Wildner 	 |	find location to insert deleted line
3072*7556134aSSascha Wildner 	 */
3073*7556134aSSascha Wildner 	for (i = 0, tmp = curscr->first_line; (tmp->next_screen != NULL) && (i < window->SR); i++)
3074*7556134aSSascha Wildner 		tmp = tmp->next_screen;
3075*7556134aSSascha Wildner 	top_of_win = tmp;
3076*7556134aSSascha Wildner 	for (i = 0, tmp = top_of_win; (i < end_row) && (tmp->next_screen != NULL); i++)
3077*7556134aSSascha Wildner 		tmp = tmp->next_screen;
3078*7556134aSSascha Wildner 	tmp1->next_screen = tmp;
3079*7556134aSSascha Wildner 	tmp1->prev_screen = tmp->prev_screen;
3080*7556134aSSascha Wildner 	if (tmp1->prev_screen != NULL)
3081*7556134aSSascha Wildner 		tmp1->prev_screen->next_screen = tmp1;
3082*7556134aSSascha Wildner 	tmp->prev_screen = tmp1;
3083*7556134aSSascha Wildner 
3084*7556134aSSascha Wildner 	Position(window, (window->SR + row), 0);
3085*7556134aSSascha Wildner 	String_Out(String_table[dl__], NULL, 0);
3086*7556134aSSascha Wildner 	if ((!String_table[cs__]) && (end_row < window->Num_lines))
3087*7556134aSSascha Wildner 	{
3088*7556134aSSascha Wildner 		Position(window, (window->SR + end_row), 0);
3089*7556134aSSascha Wildner 		String_Out(String_table[al__], NULL, 0);
3090*7556134aSSascha Wildner 	}
3091*7556134aSSascha Wildner 	else if ((String_table[cs__] != NULL) && (String_table[dl__] == NULL))
3092*7556134aSSascha Wildner 	{
3093*7556134aSSascha Wildner 		Position(window, (window->SR + end_row), 0);
3094*7556134aSSascha Wildner 		putchar('\n');
3095*7556134aSSascha Wildner 	}
3096*7556134aSSascha Wildner 
3097*7556134aSSascha Wildner 	if (row == (window->Num_lines-1))
3098*7556134aSSascha Wildner 		tmp2 = tmp1;
3099*7556134aSSascha Wildner 	if ((row + window->SR) == 0)
3100*7556134aSSascha Wildner 		curscr->first_line = top_of_win = tmp2;
3101*7556134aSSascha Wildner 	return(tmp2);
3102*7556134aSSascha Wildner }
3103*7556134aSSascha Wildner 
3104*7556134aSSascha Wildner void
CLEAR_TO_EOL(window,row,column)3105*7556134aSSascha Wildner CLEAR_TO_EOL(window, row, column)
3106*7556134aSSascha Wildner WINDOW *window;
3107*7556134aSSascha Wildner int row, column;
3108*7556134aSSascha Wildner {
3109*7556134aSSascha Wildner 	int x, y;
3110*7556134aSSascha Wildner 	struct _line *tmp1;
3111*7556134aSSascha Wildner 
3112*7556134aSSascha Wildner 	for (y = 0, tmp1 = curscr->first_line; (y < (window->SR+row)) && (tmp1->next_screen != NULL); y++)
3113*7556134aSSascha Wildner 		tmp1 = tmp1->next_screen;
3114*7556134aSSascha Wildner 	for (x = column; x<window->Num_cols; x++)
3115*7556134aSSascha Wildner 	{
3116*7556134aSSascha Wildner 		tmp1->row[x] = ' ';
3117*7556134aSSascha Wildner 		tmp1->attributes[x] = '\0';
3118*7556134aSSascha Wildner 	}
3119*7556134aSSascha Wildner 	tmp1->row[column] = '\0';
3120*7556134aSSascha Wildner 	tmp1->last_char = column;
3121*7556134aSSascha Wildner 	if (column < COLS)
3122*7556134aSSascha Wildner 	{
3123*7556134aSSascha Wildner 		if (STAND)
3124*7556134aSSascha Wildner 		{
3125*7556134aSSascha Wildner 			STAND = FALSE;
3126*7556134aSSascha Wildner 			Position(window, row, column);
3127*7556134aSSascha Wildner 			attribute_off();
3128*7556134aSSascha Wildner 		}
3129*7556134aSSascha Wildner 		if (String_table[ce__] != NULL)
3130*7556134aSSascha Wildner 			String_Out(String_table[ce__], NULL, 0);
3131*7556134aSSascha Wildner 		else
3132*7556134aSSascha Wildner 		{
3133*7556134aSSascha Wildner 			for (x = column; x < window->Num_cols; x++)
3134*7556134aSSascha Wildner 				putchar(' ');
3135*7556134aSSascha Wildner 			Curr_x = x;
3136*7556134aSSascha Wildner 		}
3137*7556134aSSascha Wildner 	}
3138*7556134aSSascha Wildner }
3139*7556134aSSascha Wildner 
3140*7556134aSSascha Wildner int
check_delete(window,line,offset,pointer_new,pointer_old)3141*7556134aSSascha Wildner check_delete(window, line, offset, pointer_new, pointer_old)
3142*7556134aSSascha Wildner WINDOW *window;
3143*7556134aSSascha Wildner int line, offset;
3144*7556134aSSascha Wildner struct _line *pointer_new, *pointer_old;
3145*7556134aSSascha Wildner {
3146*7556134aSSascha Wildner 	int end_old;
3147*7556134aSSascha Wildner 	int end_new;
3148*7556134aSSascha Wildner 	int k;
3149*7556134aSSascha Wildner 	int changed;
3150*7556134aSSascha Wildner 	char *old_lin;
3151*7556134aSSascha Wildner 	char *new_lin;
3152*7556134aSSascha Wildner 	char *old_att;
3153*7556134aSSascha Wildner 	char *new_att;
3154*7556134aSSascha Wildner 
3155*7556134aSSascha Wildner 	changed = FALSE;
3156*7556134aSSascha Wildner 	new_lin = pointer_new->row;
3157*7556134aSSascha Wildner 	new_att = pointer_new->attributes;
3158*7556134aSSascha Wildner 	old_lin = pointer_old->row;
3159*7556134aSSascha Wildner 	old_att = pointer_old->attributes;
3160*7556134aSSascha Wildner 	end_old = end_new = offset;
3161*7556134aSSascha Wildner 	while (((new_lin[end_new] != old_lin[end_old]) || (new_att[end_new] != old_att[end_old])) && (old_lin[end_old] != '\0') && (new_lin[end_old] != '\0'))
3162*7556134aSSascha Wildner 		end_old++;
3163*7556134aSSascha Wildner 	if (old_lin[end_old] != '\0')
3164*7556134aSSascha Wildner 	{
3165*7556134aSSascha Wildner 		k = 0;
3166*7556134aSSascha Wildner 		while ((old_lin[end_old+k] == new_lin[end_new+k]) && (new_att[end_new+k] == old_att[end_old+k]) && (new_lin[end_new+k] != '\0') && (old_lin[end_old+k] != '\0') && (k < 10))
3167*7556134aSSascha Wildner 			k++;
3168*7556134aSSascha Wildner 		if ((k > 8) || ((new_lin[end_new+k] == '\0') && (k != 0)))
3169*7556134aSSascha Wildner 		{
3170*7556134aSSascha Wildner 			if (new_lin[end_new+k] == '\0')
3171*7556134aSSascha Wildner 			{
3172*7556134aSSascha Wildner 				Position(window, line, (end_new+k));
3173*7556134aSSascha Wildner 				CLEAR_TO_EOL(window, line, (end_new+k));
3174*7556134aSSascha Wildner 			}
3175*7556134aSSascha Wildner 			Position(window, line, offset);
3176*7556134aSSascha Wildner 			for (k = offset; k < end_old; k++)
3177*7556134aSSascha Wildner 				Char_del(old_lin, old_att, offset, window->Num_cols);
3178*7556134aSSascha Wildner 			while ((old_lin[offset] != '\0') && (offset < COLS))
3179*7556134aSSascha Wildner 				offset++;
3180*7556134aSSascha Wildner 			pointer_old->last_char = offset;
3181*7556134aSSascha Wildner 			changed = TRUE;
3182*7556134aSSascha Wildner 		}
3183*7556134aSSascha Wildner 	}
3184*7556134aSSascha Wildner 	return(changed);
3185*7556134aSSascha Wildner }
3186*7556134aSSascha Wildner 
3187*7556134aSSascha Wildner /*
3188*7556134aSSascha Wildner  |	Check if characters were inserted in the middle of a line, and if
3189*7556134aSSascha Wildner  |	so, insert them.
3190*7556134aSSascha Wildner  */
3191*7556134aSSascha Wildner 
3192*7556134aSSascha Wildner int
check_insert(window,line,offset,pointer_new,pointer_old)3193*7556134aSSascha Wildner check_insert(window, line, offset, pointer_new, pointer_old)
3194*7556134aSSascha Wildner WINDOW *window;
3195*7556134aSSascha Wildner int line, offset;
3196*7556134aSSascha Wildner struct _line *pointer_new, *pointer_old;
3197*7556134aSSascha Wildner {
3198*7556134aSSascha Wildner 	int changed;
3199*7556134aSSascha Wildner 	int end_old, end_new;
3200*7556134aSSascha Wildner 	int k;
3201*7556134aSSascha Wildner 	int same = FALSE;
3202*7556134aSSascha Wildner 	int old_off;
3203*7556134aSSascha Wildner 	int insert;
3204*7556134aSSascha Wildner 	char *old_lin;
3205*7556134aSSascha Wildner 	char *new_lin;
3206*7556134aSSascha Wildner 	char *old_att;
3207*7556134aSSascha Wildner 	char *new_att;
3208*7556134aSSascha Wildner 
3209*7556134aSSascha Wildner 	changed = FALSE;
3210*7556134aSSascha Wildner 	new_lin = pointer_new->row;
3211*7556134aSSascha Wildner 	new_att = pointer_new->attributes;
3212*7556134aSSascha Wildner 	old_lin = pointer_old->row;
3213*7556134aSSascha Wildner 	old_att = pointer_old->attributes;
3214*7556134aSSascha Wildner 	end_old = end_new = offset;
3215*7556134aSSascha Wildner 	while (((new_lin[end_new] != old_lin[end_old]) || (new_att[end_new] != old_att[end_old])) && (new_lin[end_new] != '\0') && (old_lin[end_new] != '\0'))
3216*7556134aSSascha Wildner 		end_new++;
3217*7556134aSSascha Wildner 	if (new_lin[end_new] != '\0')
3218*7556134aSSascha Wildner 	{
3219*7556134aSSascha Wildner 		k = 0;
3220*7556134aSSascha Wildner 		while ((old_lin[end_old+k] == new_lin[end_new+k]) && (old_att[end_old+k] == new_att[end_new+k]) && (new_lin[end_new+k] != '\0') && (old_lin[end_old+k] != '\0') && (k < 10))
3221*7556134aSSascha Wildner 			k++;
3222*7556134aSSascha Wildner 		/*
3223*7556134aSSascha Wildner 		 |  check for commonality between rest of lines (are the old
3224*7556134aSSascha Wildner 		 |  and new lines the same, except for a chunk in the middle?)
3225*7556134aSSascha Wildner 		 |  if the rest of the lines are common, do not insert text
3226*7556134aSSascha Wildner 		 */
3227*7556134aSSascha Wildner 		old_off = end_new;
3228*7556134aSSascha Wildner 		while ((old_lin[old_off] != '\0') && (new_lin[old_off] != '\0') && (old_lin[old_off] == new_lin[old_off]) && (old_att[old_off] == new_att[old_off]))
3229*7556134aSSascha Wildner 			old_off++;
3230*7556134aSSascha Wildner 		if ((old_lin[old_off] == new_lin[old_off]) && (old_att[old_off] == new_att[old_off]))
3231*7556134aSSascha Wildner 			same = TRUE;
3232*7556134aSSascha Wildner 		if ((!same) && ((k > 8) || ((new_lin[end_new+k] == '\0') && (k != 0))))
3233*7556134aSSascha Wildner 		{
3234*7556134aSSascha Wildner 			Position(window, line, offset);
3235*7556134aSSascha Wildner 			insert = FALSE;
3236*7556134aSSascha Wildner 			if (String_table[ic__] == NULL)
3237*7556134aSSascha Wildner 			{
3238*7556134aSSascha Wildner 				String_Out(String_table[im__], NULL, 0);
3239*7556134aSSascha Wildner 				insert = TRUE;
3240*7556134aSSascha Wildner 			}
3241*7556134aSSascha Wildner 			for (k = offset; k < end_new; k++)
3242*7556134aSSascha Wildner 			{
3243*7556134aSSascha Wildner 				if (!insert)
3244*7556134aSSascha Wildner 					String_Out(String_table[ic__], NULL, 0);
3245*7556134aSSascha Wildner 				Char_ins(old_lin, old_att, new_lin[k], new_att[k], k, window->Num_cols);
3246*7556134aSSascha Wildner 			}
3247*7556134aSSascha Wildner 			if (insert)
3248*7556134aSSascha Wildner 				String_Out(String_table[ei__], NULL, 0);
3249*7556134aSSascha Wildner 			while ((old_lin[offset] != '\0') && (offset < COLS))
3250*7556134aSSascha Wildner 				offset++;
3251*7556134aSSascha Wildner 			pointer_old->last_char = offset;
3252*7556134aSSascha Wildner 			changed = TRUE;
3253*7556134aSSascha Wildner 		}
3254*7556134aSSascha Wildner 	}
3255*7556134aSSascha Wildner 	return(changed);
3256*7556134aSSascha Wildner }
3257*7556134aSSascha Wildner 
3258*7556134aSSascha Wildner void
doupdate()3259*7556134aSSascha Wildner doupdate()
3260*7556134aSSascha Wildner {
3261*7556134aSSascha Wildner 	WINDOW *window;
3262*7556134aSSascha Wildner 	int similar;
3263*7556134aSSascha Wildner 	int diff;
3264*7556134aSSascha Wildner 	int begin_old, begin_new;
3265*7556134aSSascha Wildner 	int end_old, end_new;
3266*7556134aSSascha Wildner 	int count1, j;
3267*7556134aSSascha Wildner 	int from_top, tmp_ft, offset;
3268*7556134aSSascha Wildner 	int changed;
3269*7556134aSSascha Wildner 	int first_time;
3270*7556134aSSascha Wildner 	int first_same;
3271*7556134aSSascha Wildner 	int last_same;
3272*7556134aSSascha Wildner 	int list[10];
3273*7556134aSSascha Wildner 	int bottom;
3274*7556134aSSascha Wildner 
3275*7556134aSSascha Wildner 	struct _line *curr;
3276*7556134aSSascha Wildner 	struct _line *virt;
3277*7556134aSSascha Wildner 	struct _line *old;
3278*7556134aSSascha Wildner 
3279*7556134aSSascha Wildner 	struct _line *new;
3280*7556134aSSascha Wildner 
3281*7556134aSSascha Wildner 	struct _line *old1, *new1;
3282*7556134aSSascha Wildner 
3283*7556134aSSascha Wildner 	char *cur_lin;
3284*7556134aSSascha Wildner 	char *vrt_lin;
3285*7556134aSSascha Wildner 	char *cur_att;
3286*7556134aSSascha Wildner 	char *vrt_att;
3287*7556134aSSascha Wildner 	char *att1, *att2;
3288*7556134aSSascha Wildner 	char *c1, *c2;
3289*7556134aSSascha Wildner 
3290*7556134aSSascha Wildner 	char NC_chinese = FALSE;	/* flag to indicate handling Chinese */
3291*7556134aSSascha Wildner 
3292*7556134aSSascha Wildner 	window = virtual_scr;
3293*7556134aSSascha Wildner 
3294*7556134aSSascha Wildner 	if ((nc_attributes & A_NC_BIG5) != 0)
3295*7556134aSSascha Wildner 		NC_chinese = TRUE;
3296*7556134aSSascha Wildner 
3297*7556134aSSascha Wildner 	if (Repaint_screen)
3298*7556134aSSascha Wildner 	{
3299*7556134aSSascha Wildner 		if (String_table[cl__])
3300*7556134aSSascha Wildner 			String_Out(String_table[cl__], NULL, 0);
3301*7556134aSSascha Wildner 		else
3302*7556134aSSascha Wildner 		{
3303*7556134aSSascha Wildner 			from_top = 0;
3304*7556134aSSascha Wildner 			while (from_top < LINES)
3305*7556134aSSascha Wildner 			{
3306*7556134aSSascha Wildner 				Position(curscr, from_top, 0);
3307*7556134aSSascha Wildner 				if (String_table[ce__] != NULL)
3308*7556134aSSascha Wildner 					String_Out(String_table[ce__], NULL, 0);
3309*7556134aSSascha Wildner 				else
3310*7556134aSSascha Wildner 				{
3311*7556134aSSascha Wildner 					for (j = 0; j < window->Num_cols; j++)
3312*7556134aSSascha Wildner 						putchar(' ');
3313*7556134aSSascha Wildner 				}
3314*7556134aSSascha Wildner 				from_top++;
3315*7556134aSSascha Wildner 			}
3316*7556134aSSascha Wildner 		}
3317*7556134aSSascha Wildner 		for (from_top = 0, curr = curscr->first_line; from_top < curscr->Num_lines; from_top++, curr = curr->next_screen)
3318*7556134aSSascha Wildner 		{
3319*7556134aSSascha Wildner 			Position(curscr, from_top, 0);
3320*7556134aSSascha Wildner 			for (j = 0; (curr->row[j] != '\0') && (j < curscr->Num_cols); j++)
3321*7556134aSSascha Wildner 			{
3322*7556134aSSascha Wildner 				Char_out(curr->row[j], curr->attributes[j], curr->row, curr->attributes, j);
3323*7556134aSSascha Wildner 			}
3324*7556134aSSascha Wildner 			if (STAND)
3325*7556134aSSascha Wildner 			{
3326*7556134aSSascha Wildner 				STAND = FALSE;
3327*7556134aSSascha Wildner 				Position(curscr, from_top, j);
3328*7556134aSSascha Wildner 				attribute_off();
3329*7556134aSSascha Wildner 			}
3330*7556134aSSascha Wildner 		}
3331*7556134aSSascha Wildner 		Repaint_screen = FALSE;
3332*7556134aSSascha Wildner 	}
3333*7556134aSSascha Wildner 
3334*7556134aSSascha Wildner 	similar = 0;
3335*7556134aSSascha Wildner 	diff = FALSE;
3336*7556134aSSascha Wildner 	top_of_win = curscr->first_line;
3337*7556134aSSascha Wildner 
3338*7556134aSSascha Wildner 	for (from_top = 0, curr = top_of_win, virt = window->first_line;
3339*7556134aSSascha Wildner 			from_top < window->Num_lines; from_top++)
3340*7556134aSSascha Wildner 	{
3341*7556134aSSascha Wildner 		virtual_lines[from_top] = TRUE;
3342*7556134aSSascha Wildner 		if ((similar = Comp_line(curr, virt)) > 0)
3343*7556134aSSascha Wildner 		{
3344*7556134aSSascha Wildner 			virtual_lines[from_top] = FALSE;
3345*7556134aSSascha Wildner 			diff = TRUE;
3346*7556134aSSascha Wildner 		}
3347*7556134aSSascha Wildner 		curr = curr->next_screen;
3348*7556134aSSascha Wildner 		virt = virt->next_screen;
3349*7556134aSSascha Wildner 	}
3350*7556134aSSascha Wildner 
3351*7556134aSSascha Wildner 	from_top = 0;
3352*7556134aSSascha Wildner 	virt = window->first_line;
3353*7556134aSSascha Wildner 	curr = top_of_win;
3354*7556134aSSascha Wildner 	similar = 0;
3355*7556134aSSascha Wildner 	/*
3356*7556134aSSascha Wildner 	 |  if the window has lines that are different, check for scrolling
3357*7556134aSSascha Wildner 	 */
3358*7556134aSSascha Wildner 	if (diff)
3359*7556134aSSascha Wildner 	{
3360*7556134aSSascha Wildner 		last_same = -1;
3361*7556134aSSascha Wildner 		changed = FALSE;
3362*7556134aSSascha Wildner 		for (first_same = window->Num_lines;
3363*7556134aSSascha Wildner 		    (first_same > from_top) && (virtual_lines[first_same - 1]);
3364*7556134aSSascha Wildner 		     first_same--)
3365*7556134aSSascha Wildner 			;
3366*7556134aSSascha Wildner 		for (last_same = 0;
3367*7556134aSSascha Wildner 		    (last_same < window->Num_lines) && (virtual_lines[last_same]== FALSE);
3368*7556134aSSascha Wildner 		     last_same++)
3369*7556134aSSascha Wildner 			;
3370*7556134aSSascha Wildner 		while ((from_top < first_same) && nc_scrolling_ability)
3371*7556134aSSascha Wildner 					/* check entire lines for diffs	*/
3372*7556134aSSascha Wildner 		{
3373*7556134aSSascha Wildner 
3374*7556134aSSascha Wildner 			if (from_top >= last_same)
3375*7556134aSSascha Wildner 			{
3376*7556134aSSascha Wildner 				for (last_same = from_top;
3377*7556134aSSascha Wildner 				     (last_same < window->Num_lines) &&
3378*7556134aSSascha Wildner 				     (virtual_lines[last_same] == FALSE);
3379*7556134aSSascha Wildner 				      last_same++)
3380*7556134aSSascha Wildner 					;
3381*7556134aSSascha Wildner 			}
3382*7556134aSSascha Wildner 			if (!virtual_lines[from_top])
3383*7556134aSSascha Wildner 			{
3384*7556134aSSascha Wildner 				diff = TRUE;
3385*7556134aSSascha Wildner 				/*
3386*7556134aSSascha Wildner 				 |	check for lines deleted (scroll up)
3387*7556134aSSascha Wildner 				 */
3388*7556134aSSascha Wildner 				for (tmp_ft = from_top+1, old = curr->next_screen;
3389*7556134aSSascha Wildner 					((window->scroll_up) && (diff) &&
3390*7556134aSSascha Wildner 					(tmp_ft < last_same) &&
3391*7556134aSSascha Wildner 					(!virtual_lines[tmp_ft]));
3392*7556134aSSascha Wildner 						tmp_ft++)
3393*7556134aSSascha Wildner 				{
3394*7556134aSSascha Wildner 					if ((Comp_line(old, virt) == -1) && (!virtual_lines[from_top]))
3395*7556134aSSascha Wildner 					{
3396*7556134aSSascha Wildner 						/*
3397*7556134aSSascha Wildner 						 |	Find the bottom of the
3398*7556134aSSascha Wildner 						 |	area that should be
3399*7556134aSSascha Wildner 						 |	scrolled.
3400*7556134aSSascha Wildner 						 */
3401*7556134aSSascha Wildner 						for (bottom = tmp_ft, old1 = old,
3402*7556134aSSascha Wildner 						     new1 = virt, count1 = 0;
3403*7556134aSSascha Wildner 							(bottom < window->Num_lines) &&
3404*7556134aSSascha Wildner 								(Comp_line(old1, new1) <= 0);
3405*7556134aSSascha Wildner 								bottom++, old1 = old1->next_screen,
3406*7556134aSSascha Wildner 								new1 = new1->next_screen,
3407*7556134aSSascha Wildner 								count1++)
3408*7556134aSSascha Wildner 							;
3409*7556134aSSascha Wildner 						if (count1 > 3)
3410*7556134aSSascha Wildner 						{
3411*7556134aSSascha Wildner 							if (String_table[cs__]) /* scrolling region */
3412*7556134aSSascha Wildner 							{
3413*7556134aSSascha Wildner 								list[1] = from_top;
3414*7556134aSSascha Wildner 								list[0] = min((bottom - 1), (window->Num_lines - 1));
3415*7556134aSSascha Wildner 								String_Out(String_table[cs__], list, 2);
3416*7556134aSSascha Wildner 								Curr_y = Curr_x = -1;
3417*7556134aSSascha Wildner 							}
3418*7556134aSSascha Wildner 
3419*7556134aSSascha Wildner 							for (offset = (tmp_ft - from_top); (offset > 0); offset--)
3420*7556134aSSascha Wildner 							{
3421*7556134aSSascha Wildner 								old = Delete_line(from_top, min((bottom - 1), (window->Num_lines - 1)), window);
3422*7556134aSSascha Wildner 								diff = FALSE;
3423*7556134aSSascha Wildner 							}
3424*7556134aSSascha Wildner 
3425*7556134aSSascha Wildner 							if (String_table[cs__]) /* scrolling region */
3426*7556134aSSascha Wildner 							{
3427*7556134aSSascha Wildner 								list[1] = 0;
3428*7556134aSSascha Wildner 								list[0] = LINES - 1;
3429*7556134aSSascha Wildner 								String_Out(String_table[cs__], list, 2);
3430*7556134aSSascha Wildner 								Curr_y = Curr_x = -1;
3431*7556134aSSascha Wildner 							}
3432*7556134aSSascha Wildner 
3433*7556134aSSascha Wildner 							top_of_win = curscr->first_line;
3434*7556134aSSascha Wildner 							curr = top_of_win;
3435*7556134aSSascha Wildner 							for (offset = 0; offset < from_top; offset++)
3436*7556134aSSascha Wildner 								curr = curr->next_screen;
3437*7556134aSSascha Wildner 							for (offset = from_top, old=curr, new=virt;
3438*7556134aSSascha Wildner 							   offset < window->Num_lines;
3439*7556134aSSascha Wildner 							   old=old->next_screen, new=new->next_screen,
3440*7556134aSSascha Wildner 							   offset++)
3441*7556134aSSascha Wildner 							{
3442*7556134aSSascha Wildner 								similar = Comp_line(old, new);
3443*7556134aSSascha Wildner 								virtual_lines[offset] = (similar > 0 ? FALSE : TRUE);
3444*7556134aSSascha Wildner 							}
3445*7556134aSSascha Wildner 						}
3446*7556134aSSascha Wildner 					}
3447*7556134aSSascha Wildner 					else
3448*7556134aSSascha Wildner 						old = old->next_screen;
3449*7556134aSSascha Wildner 				}
3450*7556134aSSascha Wildner 				/*
3451*7556134aSSascha Wildner 				 |	check for lines inserted (scroll down)
3452*7556134aSSascha Wildner 				 */
3453*7556134aSSascha Wildner 				for (tmp_ft = from_top-1, old = curr->prev_screen;
3454*7556134aSSascha Wildner 					((window->scroll_down) && (tmp_ft >= 0) &&
3455*7556134aSSascha Wildner 					(diff) &&
3456*7556134aSSascha Wildner 					(!virtual_lines[tmp_ft]));
3457*7556134aSSascha Wildner 					  tmp_ft--)
3458*7556134aSSascha Wildner 				{
3459*7556134aSSascha Wildner 					if (Comp_line(old, virt) == -1)
3460*7556134aSSascha Wildner 					{
3461*7556134aSSascha Wildner 						/*
3462*7556134aSSascha Wildner 						 |	Find the bottom of the
3463*7556134aSSascha Wildner 						 |	area that should be
3464*7556134aSSascha Wildner 						 |	scrolled.
3465*7556134aSSascha Wildner 						 */
3466*7556134aSSascha Wildner 						for (bottom = from_top, old1 = old,
3467*7556134aSSascha Wildner 						     new1 = virt, count1 = 0;
3468*7556134aSSascha Wildner 							(bottom < window->Num_lines) &&
3469*7556134aSSascha Wildner 								(Comp_line(old1, new1) <= 0);
3470*7556134aSSascha Wildner 								bottom++, old1 = old1->next_screen,
3471*7556134aSSascha Wildner 								new1 = new1->next_screen,
3472*7556134aSSascha Wildner 								count1++)
3473*7556134aSSascha Wildner 							;
3474*7556134aSSascha Wildner 						if (count1 > 3)
3475*7556134aSSascha Wildner 						{
3476*7556134aSSascha Wildner 							if (String_table[cs__]) /* scrolling region */
3477*7556134aSSascha Wildner 							{
3478*7556134aSSascha Wildner 								list[1] = tmp_ft;
3479*7556134aSSascha Wildner 								list[0] = min((bottom - 1), (window->Num_lines - 1));
3480*7556134aSSascha Wildner 								String_Out(String_table[cs__], list, 2);
3481*7556134aSSascha Wildner 								Curr_y = Curr_x = -1;
3482*7556134aSSascha Wildner 							}
3483*7556134aSSascha Wildner 
3484*7556134aSSascha Wildner 							for (offset = (from_top - tmp_ft); (offset > 0); offset--)
3485*7556134aSSascha Wildner 							{
3486*7556134aSSascha Wildner 								old = Insert_line(tmp_ft, min((bottom - 1), (window->Num_lines -1)), window);
3487*7556134aSSascha Wildner 								diff = FALSE;
3488*7556134aSSascha Wildner 							}
3489*7556134aSSascha Wildner 
3490*7556134aSSascha Wildner 							if (String_table[cs__]) /* scrolling region */
3491*7556134aSSascha Wildner 							{
3492*7556134aSSascha Wildner 								list[1] = 0;
3493*7556134aSSascha Wildner 								list[0] = LINES - 1;
3494*7556134aSSascha Wildner 								String_Out(String_table[cs__], list, 2);
3495*7556134aSSascha Wildner 								Curr_y = Curr_x = -1;
3496*7556134aSSascha Wildner 							}
3497*7556134aSSascha Wildner 
3498*7556134aSSascha Wildner 							top_of_win = curscr->first_line;
3499*7556134aSSascha Wildner 							curr = top_of_win;
3500*7556134aSSascha Wildner 							for (offset = 0; offset < from_top; offset++)
3501*7556134aSSascha Wildner 								curr = curr->next_screen;
3502*7556134aSSascha Wildner 							for (offset = from_top, old=curr, new=virt;
3503*7556134aSSascha Wildner 							   offset < window->Num_lines;
3504*7556134aSSascha Wildner 							   old=old->next_screen, new=new->next_screen,
3505*7556134aSSascha Wildner 							   offset++)
3506*7556134aSSascha Wildner 							{
3507*7556134aSSascha Wildner 								similar = Comp_line(old, new);
3508*7556134aSSascha Wildner 								virtual_lines[offset] = (similar > 0 ? FALSE : TRUE);
3509*7556134aSSascha Wildner 							}
3510*7556134aSSascha Wildner 						}
3511*7556134aSSascha Wildner 					}
3512*7556134aSSascha Wildner 					else
3513*7556134aSSascha Wildner 						old = old->prev_screen;
3514*7556134aSSascha Wildner 				}
3515*7556134aSSascha Wildner 			}
3516*7556134aSSascha Wildner 			from_top++;
3517*7556134aSSascha Wildner 			curr = curr->next_screen;
3518*7556134aSSascha Wildner 			virt = virt->next_screen;
3519*7556134aSSascha Wildner 		}
3520*7556134aSSascha Wildner 	}
3521*7556134aSSascha Wildner 
3522*7556134aSSascha Wildner 
3523*7556134aSSascha Wildner 	/*
3524*7556134aSSascha Wildner 	 |	Scrolling done, now need to insert, delete, or modify text
3525*7556134aSSascha Wildner 	 |	within lines.
3526*7556134aSSascha Wildner 	 */
3527*7556134aSSascha Wildner 
3528*7556134aSSascha Wildner 	for (from_top = 0, curr = curscr->first_line; from_top < window->SR; from_top++)
3529*7556134aSSascha Wildner 		curr = curr->next_screen;
3530*7556134aSSascha Wildner 	top_of_win = curr;
3531*7556134aSSascha Wildner 	for (from_top = 0, curr = top_of_win, virt = window->first_line; from_top < window->Num_lines; from_top++, curr = curr->next_screen, virt = virt->next_screen)
3532*7556134aSSascha Wildner 	{
3533*7556134aSSascha Wildner 
3534*7556134aSSascha Wildner 		/*
3535*7556134aSSascha Wildner 		 |	If either 'insert mode' or 'insert char' are
3536*7556134aSSascha Wildner 		 |	available, enter the following 'if' statement,
3537*7556134aSSascha Wildner 		 |	else, need to simply rewrite the contents of the line
3538*7556134aSSascha Wildner 		 |	at the point where the contents of the line change.
3539*7556134aSSascha Wildner 		 */
3540*7556134aSSascha Wildner 
3541*7556134aSSascha Wildner 		if (((String_table[ic__]) || (String_table[im__])) &&
3542*7556134aSSascha Wildner 		    (String_table[dc__]) && (curr->row[0] != '\0') &&
3543*7556134aSSascha Wildner 		    (!NC_chinese))
3544*7556134aSSascha Wildner 		{
3545*7556134aSSascha Wildner 			j = 0;
3546*7556134aSSascha Wildner 			first_time = TRUE;
3547*7556134aSSascha Wildner 			vrt_lin = virt->row;
3548*7556134aSSascha Wildner 			vrt_att = virt->attributes;
3549*7556134aSSascha Wildner 			cur_lin = curr->row;
3550*7556134aSSascha Wildner 			cur_att = curr->attributes;
3551*7556134aSSascha Wildner 			while ((vrt_lin[j] != '\0') && (j < window->Num_cols))
3552*7556134aSSascha Wildner 			{
3553*7556134aSSascha Wildner 				if ((STAND) && (Booleans[xs__]))
3554*7556134aSSascha Wildner 				{
3555*7556134aSSascha Wildner 					while ((vrt_lin[j] == cur_lin[j]) && (vrt_att[j] == cur_att[j]) && (vrt_lin[j] != '\0') && (vrt_att[j]))
3556*7556134aSSascha Wildner 						j++;
3557*7556134aSSascha Wildner 					if ((STAND) && (!vrt_att[j]))
3558*7556134aSSascha Wildner 					{
3559*7556134aSSascha Wildner 						STAND = FALSE;
3560*7556134aSSascha Wildner 						Position(window, from_top, j);
3561*7556134aSSascha Wildner 						attribute_off();
3562*7556134aSSascha Wildner 						attribute_off();
3563*7556134aSSascha Wildner 					}
3564*7556134aSSascha Wildner 				}
3565*7556134aSSascha Wildner 				else
3566*7556134aSSascha Wildner 				{
3567*7556134aSSascha Wildner 					while ((vrt_lin[j] == cur_lin[j]) && (vrt_att[j] == cur_att[j]) && (vrt_lin[j] != '\0'))
3568*7556134aSSascha Wildner 						j++;
3569*7556134aSSascha Wildner 				}
3570*7556134aSSascha Wildner 				if ((vrt_att[j] != cur_att[j]) && (cur_att[j]) && (Booleans[xs__]))
3571*7556134aSSascha Wildner 				{
3572*7556134aSSascha Wildner 					Position(window, from_top, j);
3573*7556134aSSascha Wildner /*					CLEAR_TO_EOL(window, from_top, j);*/
3574*7556134aSSascha Wildner 					attribute_off();
3575*7556134aSSascha Wildner 					attribute_off();
3576*7556134aSSascha Wildner 				}
3577*7556134aSSascha Wildner 				if (vrt_lin[j] != '\0')
3578*7556134aSSascha Wildner 				{
3579*7556134aSSascha Wildner 					begin_new = j;
3580*7556134aSSascha Wildner 					begin_old = j;
3581*7556134aSSascha Wildner 					end_old = j;
3582*7556134aSSascha Wildner 					end_new = j;
3583*7556134aSSascha Wildner 					if ((first_time) && (virt->changed))
3584*7556134aSSascha Wildner 					{
3585*7556134aSSascha Wildner 						if (curr->last_char <= virt->last_char)
3586*7556134aSSascha Wildner 							changed = check_insert(window, from_top, j, virt, curr);
3587*7556134aSSascha Wildner 					}
3588*7556134aSSascha Wildner 					changed = check_delete(window, from_top, j, virt, curr);
3589*7556134aSSascha Wildner 					first_time = FALSE;
3590*7556134aSSascha Wildner 					virt->changed = FALSE;
3591*7556134aSSascha Wildner 					if (!changed)
3592*7556134aSSascha Wildner 						changed = check_insert(window, from_top, j, virt, curr);
3593*7556134aSSascha Wildner 					if (((!changed) || (cur_lin[j] != vrt_lin[j]) || (cur_att[j] != vrt_att[j])) && (j < window->Num_cols))
3594*7556134aSSascha Wildner 					{
3595*7556134aSSascha Wildner 						if ((vrt_lin[j] == ' ') && (cur_lin[j] == '\0') && (vrt_att[j] == cur_att[j]))
3596*7556134aSSascha Wildner 							cur_lin[j] = ' ';
3597*7556134aSSascha Wildner 						else
3598*7556134aSSascha Wildner 						{
3599*7556134aSSascha Wildner 							Position(window, from_top, j);
3600*7556134aSSascha Wildner 							Char_out(vrt_lin[j], vrt_att[j], cur_lin, cur_att, j);
3601*7556134aSSascha Wildner 						}
3602*7556134aSSascha Wildner 					}
3603*7556134aSSascha Wildner 					if ((vrt_lin[j] != '\0'))
3604*7556134aSSascha Wildner 						j++;
3605*7556134aSSascha Wildner 				}
3606*7556134aSSascha Wildner 				if ((STAND) && (!vrt_att[j]))
3607*7556134aSSascha Wildner 				{
3608*7556134aSSascha Wildner 					STAND = FALSE;
3609*7556134aSSascha Wildner 					Position(window, from_top, j);
3610*7556134aSSascha Wildner 					attribute_off();
3611*7556134aSSascha Wildner 				}
3612*7556134aSSascha Wildner 			}
3613*7556134aSSascha Wildner 			if ((vrt_lin[j] == '\0') && (cur_lin[j] != '\0'))
3614*7556134aSSascha Wildner 			{
3615*7556134aSSascha Wildner 				Position(window, from_top, j);
3616*7556134aSSascha Wildner 				CLEAR_TO_EOL(window, from_top, j);
3617*7556134aSSascha Wildner 			}
3618*7556134aSSascha Wildner 		}
3619*7556134aSSascha Wildner 		else /*if ((similar != -1) && (similar != 0))*/
3620*7556134aSSascha Wildner 		{
3621*7556134aSSascha Wildner 			j = 0;
3622*7556134aSSascha Wildner 			c1 = curr->row;
3623*7556134aSSascha Wildner 			att1 = curr->attributes;
3624*7556134aSSascha Wildner 			c2 = virt->row;
3625*7556134aSSascha Wildner 			att2 = virt->attributes;
3626*7556134aSSascha Wildner 			while ((j < window->Num_cols) && (c2[j] != '\0'))
3627*7556134aSSascha Wildner 			{
3628*7556134aSSascha Wildner 				while ((c1[j] == c2[j]) && (att1[j] == att2[j]) && (j < window->Num_cols) && (c2[j] != '\0'))
3629*7556134aSSascha Wildner 					j++;
3630*7556134aSSascha Wildner 
3631*7556134aSSascha Wildner 				/*
3632*7556134aSSascha Wildner 				 |	if previous character is an eight bit
3633*7556134aSSascha Wildner 				 |	char, start redraw from that character
3634*7556134aSSascha Wildner 				 */
3635*7556134aSSascha Wildner 
3636*7556134aSSascha Wildner 				if ((NC_chinese) && (highbitset(c1[j - 1])))
3637*7556134aSSascha Wildner 					j--;
3638*7556134aSSascha Wildner 				begin_old = j;
3639*7556134aSSascha Wildner 				begin_new = j;
3640*7556134aSSascha Wildner 				if ((j < window->Num_cols) && (c2[j] != '\0'))
3641*7556134aSSascha Wildner 				{
3642*7556134aSSascha Wildner 					Position(window, from_top, begin_old);
3643*7556134aSSascha Wildner 					CLEAR_TO_EOL(window, from_top, j);
3644*7556134aSSascha Wildner 					Position(window, from_top, begin_old);
3645*7556134aSSascha Wildner 					for (j = begin_old; (c2[j] != '\0') && (j < window->Num_cols); j++)
3646*7556134aSSascha Wildner 						Char_out(c2[j], att2[j], c1, att1, j);
3647*7556134aSSascha Wildner 				}
3648*7556134aSSascha Wildner 			}
3649*7556134aSSascha Wildner 			if ((c2[j] == '\0') && (c1[j] != '\0'))
3650*7556134aSSascha Wildner 			{
3651*7556134aSSascha Wildner 				Position(window, from_top, j);
3652*7556134aSSascha Wildner 				CLEAR_TO_EOL(window, from_top, j);
3653*7556134aSSascha Wildner 			}
3654*7556134aSSascha Wildner 		}
3655*7556134aSSascha Wildner 		if (STAND)
3656*7556134aSSascha Wildner 		{
3657*7556134aSSascha Wildner 			STAND = FALSE;
3658*7556134aSSascha Wildner 			Position(window, from_top, j);
3659*7556134aSSascha Wildner 			attribute_off();
3660*7556134aSSascha Wildner 		}
3661*7556134aSSascha Wildner 		virt->number = from_top;
3662*7556134aSSascha Wildner 	}
3663*7556134aSSascha Wildner 	Position(window, window->LY, window->LX);
3664*7556134aSSascha Wildner }
3665*7556134aSSascha Wildner 
3666*7556134aSSascha Wildner void
Position(window,row,col)3667*7556134aSSascha Wildner Position(window, row, col)	/* position the cursor for output on the screen	*/
3668*7556134aSSascha Wildner WINDOW *window;
3669*7556134aSSascha Wildner int row;
3670*7556134aSSascha Wildner int col;
3671*7556134aSSascha Wildner {
3672*7556134aSSascha Wildner 	int list[10];
3673*7556134aSSascha Wildner 	int place;
3674*7556134aSSascha Wildner 
3675*7556134aSSascha Wildner 	int pos_row;
3676*7556134aSSascha Wildner 	int pos_column;
3677*7556134aSSascha Wildner 
3678*7556134aSSascha Wildner 	pos_row = row + window->SR;
3679*7556134aSSascha Wildner 	pos_column = col + window->SC;
3680*7556134aSSascha Wildner 	if ((pos_row != Curr_y) || (pos_column != Curr_x))
3681*7556134aSSascha Wildner 	{
3682*7556134aSSascha Wildner 		if (String_table[cm__] != NULL) /* && (row < window->Num_lines) && (column < window->Num_cols))*/
3683*7556134aSSascha Wildner 		{
3684*7556134aSSascha Wildner 			place = 0;
3685*7556134aSSascha Wildner 			list[place++] = pos_column;
3686*7556134aSSascha Wildner 			list[place++] = pos_row;
3687*7556134aSSascha Wildner 			String_Out(String_table[cm__], list, place);
3688*7556134aSSascha Wildner 			if ((STAND) && (!Booleans[ms__]))
3689*7556134aSSascha Wildner 				attribute_on();
3690*7556134aSSascha Wildner 		}
3691*7556134aSSascha Wildner 		Curr_x = pos_column;
3692*7556134aSSascha Wildner 		Curr_y = pos_row;
3693*7556134aSSascha Wildner 	}
3694*7556134aSSascha Wildner }
3695*7556134aSSascha Wildner 
3696*7556134aSSascha Wildner void
Char_del(line,attrib,offset,maxlen)3697*7556134aSSascha Wildner Char_del(line, attrib, offset, maxlen)	/* delete chars from line	*/
3698*7556134aSSascha Wildner char *line;
3699*7556134aSSascha Wildner char *attrib;
3700*7556134aSSascha Wildner int offset;
3701*7556134aSSascha Wildner int maxlen;
3702*7556134aSSascha Wildner {
3703*7556134aSSascha Wildner 	int one, two;
3704*7556134aSSascha Wildner 
3705*7556134aSSascha Wildner 	for (one = offset, two = offset+1; (line[one] != '\0') && (one < maxlen); one++, two++)
3706*7556134aSSascha Wildner 	{
3707*7556134aSSascha Wildner 		line[one] = line[two];
3708*7556134aSSascha Wildner 		attrib[one] = attrib[two];
3709*7556134aSSascha Wildner 	}
3710*7556134aSSascha Wildner 	String_Out(String_table[dc__], NULL, 0);
3711*7556134aSSascha Wildner }
3712*7556134aSSascha Wildner 
3713*7556134aSSascha Wildner void
Char_ins(line,attrib,newc,newatt,offset,maxlen)3714*7556134aSSascha Wildner Char_ins(line, attrib, newc, newatt, offset, maxlen)	/* insert chars in line	*/
3715*7556134aSSascha Wildner char *line;
3716*7556134aSSascha Wildner char *attrib;
3717*7556134aSSascha Wildner char newc;
3718*7556134aSSascha Wildner char newatt;
3719*7556134aSSascha Wildner int offset;
3720*7556134aSSascha Wildner int maxlen;
3721*7556134aSSascha Wildner {
3722*7556134aSSascha Wildner 	int one, two;
3723*7556134aSSascha Wildner 
3724*7556134aSSascha Wildner 	one = 0;
3725*7556134aSSascha Wildner 	while ((line[one] != '\0') && (one < (maxlen - 2)))
3726*7556134aSSascha Wildner 		one++;
3727*7556134aSSascha Wildner 	for (two = one + 1; (two > offset); one--, two--)
3728*7556134aSSascha Wildner 	{
3729*7556134aSSascha Wildner 		line[two] = line[one];
3730*7556134aSSascha Wildner 		attrib[two] = attrib[one];
3731*7556134aSSascha Wildner 	}
3732*7556134aSSascha Wildner 	line[offset] = newc;
3733*7556134aSSascha Wildner 	attrib[offset] = newatt;
3734*7556134aSSascha Wildner 	Char_out(newc, newatt, line, attrib, offset);
3735*7556134aSSascha Wildner }
3736*7556134aSSascha Wildner 
3737*7556134aSSascha Wildner void
attribute_on()3738*7556134aSSascha Wildner attribute_on()
3739*7556134aSSascha Wildner {
3740*7556134aSSascha Wildner 	if (String_table[sa__])
3741*7556134aSSascha Wildner 	{
3742*7556134aSSascha Wildner 		attributes_set[0] = 1;
3743*7556134aSSascha Wildner 		String_Out(String_table[sa__], attributes_set, 1);
3744*7556134aSSascha Wildner 	}
3745*7556134aSSascha Wildner 	else if (String_table[so__])
3746*7556134aSSascha Wildner 		String_Out(String_table[so__], NULL, 0);
3747*7556134aSSascha Wildner }
3748*7556134aSSascha Wildner 
3749*7556134aSSascha Wildner void
attribute_off()3750*7556134aSSascha Wildner attribute_off()
3751*7556134aSSascha Wildner {
3752*7556134aSSascha Wildner 	if (String_table[me__])
3753*7556134aSSascha Wildner 		String_Out(String_table[me__], NULL, 0);
3754*7556134aSSascha Wildner 	else if (String_table[sa__])
3755*7556134aSSascha Wildner 	{
3756*7556134aSSascha Wildner 		attributes_set[0] = 0;
3757*7556134aSSascha Wildner 		String_Out(String_table[sa__], attributes_set, 1);
3758*7556134aSSascha Wildner 	}
3759*7556134aSSascha Wildner 	else if (String_table[se__])
3760*7556134aSSascha Wildner 		String_Out(String_table[se__], NULL, 0);
3761*7556134aSSascha Wildner }
3762*7556134aSSascha Wildner 
3763*7556134aSSascha Wildner void
Char_out(newc,newatt,line,attrib,offset)3764*7556134aSSascha Wildner Char_out(newc, newatt, line, attrib, offset)	/* output character with proper attribute	*/
3765*7556134aSSascha Wildner char newc;
3766*7556134aSSascha Wildner char newatt;
3767*7556134aSSascha Wildner char *line;
3768*7556134aSSascha Wildner char *attrib;
3769*7556134aSSascha Wildner int offset;
3770*7556134aSSascha Wildner {
3771*7556134aSSascha Wildner 
3772*7556134aSSascha Wildner 
3773*7556134aSSascha Wildner 	if ((newatt) && (!STAND))
3774*7556134aSSascha Wildner 	{
3775*7556134aSSascha Wildner 		STAND = TRUE;
3776*7556134aSSascha Wildner 		attribute_on();
3777*7556134aSSascha Wildner 	}
3778*7556134aSSascha Wildner 	else if ((STAND) && (!newatt))
3779*7556134aSSascha Wildner 	{
3780*7556134aSSascha Wildner 		STAND = FALSE;
3781*7556134aSSascha Wildner 		attribute_off();
3782*7556134aSSascha Wildner 	}
3783*7556134aSSascha Wildner 
3784*7556134aSSascha Wildner 	if ((newatt) && (STAND) && (Booleans[xs__]))
3785*7556134aSSascha Wildner 	{
3786*7556134aSSascha Wildner 		attribute_on();
3787*7556134aSSascha Wildner 	}
3788*7556134aSSascha Wildner 
3789*7556134aSSascha Wildner 	if (!((Curr_y >= (LINES - 1)) && (Curr_x >= (COLS - 1))))
3790*7556134aSSascha Wildner 	{
3791*7556134aSSascha Wildner 		putchar(newc);
3792*7556134aSSascha Wildner 		line[offset] = newc;
3793*7556134aSSascha Wildner 		attrib[offset] = newatt;
3794*7556134aSSascha Wildner 	}
3795*7556134aSSascha Wildner 	Curr_x++;
3796*7556134aSSascha Wildner }
3797*7556134aSSascha Wildner 
3798*7556134aSSascha Wildner /*
3799*7556134aSSascha Wildner  |
3800*7556134aSSascha Wildner  |	The two routines that follow, nc_setattrib(), nc_clearattrib(), are
3801*7556134aSSascha Wildner  |	hacks that notify new_curse to handle characters that have the high
3802*7556134aSSascha Wildner  |	bit set as the first of two bytes of a multi-byte string.
3803*7556134aSSascha Wildner  |
3804*7556134aSSascha Wildner  */
3805*7556134aSSascha Wildner 
3806*7556134aSSascha Wildner void
nc_setattrib(flag)3807*7556134aSSascha Wildner nc_setattrib(flag)
3808*7556134aSSascha Wildner int flag;
3809*7556134aSSascha Wildner {
3810*7556134aSSascha Wildner 	nc_attributes |= flag;
3811*7556134aSSascha Wildner }
3812*7556134aSSascha Wildner 
3813*7556134aSSascha Wildner void
nc_clearattrib(flag)3814*7556134aSSascha Wildner nc_clearattrib(flag)
3815*7556134aSSascha Wildner int flag;
3816*7556134aSSascha Wildner {
3817*7556134aSSascha Wildner 	nc_attributes &= ~flag;
3818*7556134aSSascha Wildner }
3819*7556134aSSascha Wildner 
3820