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