xref: /freebsd/contrib/ee/new_curse.c (revision 10b3b54548f2290bbe8d8f88c59c28d12b7a635d)
172fcea8cSEd Schouten /*
272fcea8cSEd Schouten  |	new_curse.c
372fcea8cSEd Schouten  |
472fcea8cSEd Schouten  |	A subset of curses developed for use with ae.
572fcea8cSEd Schouten  |
672fcea8cSEd Schouten  |	written by Hugh Mahon
772fcea8cSEd Schouten  |
896b676e9SEd Schouten  |      Copyright (c) 1986, 1987, 1988, 1991, 1992, 1993, 1994, 1995, 2009 Hugh Mahon
996b676e9SEd Schouten  |      All rights reserved.
1072fcea8cSEd Schouten  |
1196b676e9SEd Schouten  |      Redistribution and use in source and binary forms, with or without
1296b676e9SEd Schouten  |      modification, are permitted provided that the following conditions
1396b676e9SEd Schouten  |      are met:
1472fcea8cSEd Schouten  |
1596b676e9SEd Schouten  |          * Redistributions of source code must retain the above copyright
1696b676e9SEd Schouten  |            notice, this list of conditions and the following disclaimer.
1796b676e9SEd Schouten  |          * Redistributions in binary form must reproduce the above
1896b676e9SEd Schouten  |            copyright notice, this list of conditions and the following
1996b676e9SEd Schouten  |            disclaimer in the documentation and/or other materials provided
2096b676e9SEd Schouten  |            with the distribution.
2172fcea8cSEd Schouten  |
2296b676e9SEd Schouten  |      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2396b676e9SEd Schouten  |      "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2496b676e9SEd Schouten  |      LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2596b676e9SEd Schouten  |      FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
2696b676e9SEd Schouten  |      COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
2796b676e9SEd Schouten  |      INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
2896b676e9SEd Schouten  |      BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
2996b676e9SEd Schouten  |      LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
3096b676e9SEd Schouten  |      CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3196b676e9SEd Schouten  |      LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
3296b676e9SEd Schouten  |      ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3396b676e9SEd Schouten  |      POSSIBILITY OF SUCH DAMAGE.
3472fcea8cSEd Schouten  |
3596b676e9SEd Schouten  |
3672fcea8cSEd Schouten  |	All are rights reserved.
3772fcea8cSEd Schouten  |
3896b676e9SEd Schouten  |	$Header: /home/hugh/sources/old_ae/RCS/new_curse.c,v 1.54 2002/09/21 00:47:14 hugh Exp $
3972fcea8cSEd Schouten  |
4072fcea8cSEd Schouten  */
4172fcea8cSEd Schouten 
4296b676e9SEd Schouten char *copyright_message[] = { "Copyright (c) 1986, 1987, 1988, 1991, 1992, 1993, 1994, 1995, 2009 Hugh Mahon",
4372fcea8cSEd Schouten 				"All rights are reserved."};
4472fcea8cSEd Schouten 
4596b676e9SEd Schouten char * new_curse_name= "@(#) new_curse.c $Revision: 1.54 $";
4672fcea8cSEd Schouten 
4772fcea8cSEd Schouten #include "new_curse.h"
4872fcea8cSEd Schouten #include <signal.h>
4972fcea8cSEd Schouten #include <fcntl.h>
5072fcea8cSEd Schouten 
5172fcea8cSEd Schouten #ifdef SYS5
5272fcea8cSEd Schouten #include <string.h>
5372fcea8cSEd Schouten #else
5472fcea8cSEd Schouten #include <strings.h>
5572fcea8cSEd Schouten #endif
5672fcea8cSEd Schouten 
5772fcea8cSEd Schouten #ifdef BSD_SELECT
5872fcea8cSEd Schouten #include <sys/types.h>
5972fcea8cSEd Schouten #include <sys/time.h>
6072fcea8cSEd Schouten 
6172fcea8cSEd Schouten #ifdef SLCT_HDR
6272fcea8cSEd Schouten #include <sys/select.h>  /* on AIX */
6372fcea8cSEd Schouten #endif /* SLCT_HDR */
6472fcea8cSEd Schouten 
6572fcea8cSEd Schouten #endif /* BSD_SELECT */
6672fcea8cSEd Schouten 
6772fcea8cSEd Schouten #ifdef HAS_STDLIB
6872fcea8cSEd Schouten #include <stdlib.h>
6972fcea8cSEd Schouten #endif
7072fcea8cSEd Schouten 
7172fcea8cSEd Schouten #if defined(__STDC__)
7272fcea8cSEd Schouten #include <stdarg.h>
7372fcea8cSEd Schouten #else
7472fcea8cSEd Schouten #include <varargs.h>
7572fcea8cSEd Schouten #endif
7672fcea8cSEd Schouten 
7772fcea8cSEd Schouten #ifdef HAS_UNISTD
7872fcea8cSEd Schouten #include <unistd.h>
7972fcea8cSEd Schouten #endif
8072fcea8cSEd Schouten 
8172fcea8cSEd Schouten #ifdef HAS_SYS_IOCTL
8272fcea8cSEd Schouten #include <sys/ioctl.h>
8372fcea8cSEd Schouten #endif
8472fcea8cSEd Schouten 
8572fcea8cSEd Schouten 
8672fcea8cSEd Schouten WINDOW *curscr;
8772fcea8cSEd Schouten static WINDOW *virtual_scr;
8872fcea8cSEd Schouten WINDOW *stdscr;
8972fcea8cSEd Schouten WINDOW *last_window_refreshed;
9072fcea8cSEd Schouten 
9172fcea8cSEd Schouten #ifdef TIOCGWINSZ
9272fcea8cSEd Schouten 	struct winsize ws;
9372fcea8cSEd Schouten #endif
9472fcea8cSEd Schouten 
9572fcea8cSEd Schouten #define min(a, b)	(a < b ? a : b)
9672fcea8cSEd Schouten #define highbitset(a)	((a) & 0x80)
9772fcea8cSEd Schouten 
9872fcea8cSEd Schouten #ifndef CAP
9972fcea8cSEd Schouten #define String_Out(table, stack, place) Info_Out(table, stack, place)
10072fcea8cSEd Schouten #else
10172fcea8cSEd Schouten #define String_Out(table, stack, place) Cap_Out(table, stack, place)
10272fcea8cSEd Schouten #endif
10372fcea8cSEd Schouten 
10472fcea8cSEd Schouten #define bw__ 0	/* booleans	*/
10572fcea8cSEd Schouten #define am__ 1
10672fcea8cSEd Schouten #define xb__ 2
10772fcea8cSEd Schouten #define xs__ 3	/* hp glitch (standout not erased by overwrite)	*/
10872fcea8cSEd Schouten #define xn__ 4
10972fcea8cSEd Schouten #define eo__ 5
11072fcea8cSEd Schouten #define gn__ 6	/* generic type terminal	*/
11172fcea8cSEd Schouten #define hc__ 7	/* hardcopy terminal		*/
11272fcea8cSEd Schouten #define km__ 8
11372fcea8cSEd Schouten #define hs__ 9
11472fcea8cSEd Schouten #define in__ 10
11572fcea8cSEd Schouten #define da__ 11
11672fcea8cSEd Schouten #define db__ 12
11772fcea8cSEd Schouten #define mi__ 13	/* safe to move during insert mode	*/
11872fcea8cSEd Schouten #define ms__ 14	/* safe to move during standout mode	*/
11972fcea8cSEd Schouten #define os__ 15
12072fcea8cSEd Schouten #define es__ 16
12172fcea8cSEd Schouten #define xt__ 17
12272fcea8cSEd Schouten #define hz__ 18	/* hazeltine glitch	*/
12372fcea8cSEd Schouten #define ul__ 19
12472fcea8cSEd Schouten #define xo__ 20
12572fcea8cSEd Schouten #define chts__ 21
12672fcea8cSEd Schouten #define nxon__ 22
12772fcea8cSEd Schouten #define nrrmc__ 23
12872fcea8cSEd Schouten #define npc__ 24
12972fcea8cSEd Schouten #define mc5i__ 25
13072fcea8cSEd Schouten 
13172fcea8cSEd Schouten #define co__ 0	/* number of columns	*/	/* numbers		*/
13272fcea8cSEd Schouten #define it__ 1	/* spaces per tab	*/
13372fcea8cSEd Schouten #define li__ 2	/* number of lines	*/
13472fcea8cSEd Schouten #define lm__ 3
13572fcea8cSEd Schouten #define sg__ 4	/* magic cookie glitch	*/
13672fcea8cSEd Schouten #define pb__ 5
13772fcea8cSEd Schouten #define vt__ 6
13872fcea8cSEd Schouten #define ws__ 7
13972fcea8cSEd Schouten 
14072fcea8cSEd Schouten #define cols__ 0
14172fcea8cSEd Schouten #define lines__ 2
14272fcea8cSEd Schouten #define xmc__ 4
14372fcea8cSEd Schouten #define vt__ 6
14472fcea8cSEd Schouten #define wsl__ 7
14572fcea8cSEd Schouten #define nlab__ 8
14672fcea8cSEd Schouten #define lh__ 9
14772fcea8cSEd Schouten #define lw__ 10
14872fcea8cSEd Schouten 
14972fcea8cSEd Schouten #define bt__ 0	/* back tab		*/	/* strings	*/
15072fcea8cSEd Schouten #define bl__ 1	/* bell			*/
15172fcea8cSEd Schouten #define cr__ 2	/* carriage return	*/
15272fcea8cSEd Schouten #define cs__ 3	/* change scroll region	*/
15372fcea8cSEd Schouten #define ct__ 4	/* clear all tab stops	*/
15472fcea8cSEd Schouten #define cl__ 5	/* clear screen and home cursor	*/
15572fcea8cSEd Schouten #define ce__ 6	/* clear to end of line	*/
15672fcea8cSEd Schouten #define cd__ 7	/* clear to end of display	*/
15772fcea8cSEd Schouten #define ch__ 8	/* set cursor column	*/
15872fcea8cSEd Schouten #define CC__ 9	/* term, settable cmd char in 	*/
15972fcea8cSEd Schouten #define cm__ 10	/* screen rel cursor motion, row, column	*/
16072fcea8cSEd Schouten #define do__ 11	/* down one line	*/
16172fcea8cSEd Schouten #define ho__ 12	/* home cursor	*/
16272fcea8cSEd Schouten #define vi__ 13	/* make cursor invisible	*/
16372fcea8cSEd Schouten #define le__ 14	/* move cursor left one space	*/
16472fcea8cSEd Schouten #define CM__ 15	/* memory rel cursor addressing	*/
16572fcea8cSEd Schouten #define ve__ 16	/* make cursor appear normal	*/
16672fcea8cSEd Schouten #define nd__ 17	/* non-destructive space (cursor right)	*/
16772fcea8cSEd Schouten #define ll__ 18	/* last line, first col	*/
16872fcea8cSEd Schouten #define up__ 19	/* cursor up		*/
16972fcea8cSEd Schouten #define vs__ 20
17072fcea8cSEd Schouten #define dc__ 21	/* delete character	*/
17172fcea8cSEd Schouten #define dl__ 22	/* delete line		*/
17272fcea8cSEd Schouten #define ds__ 23
17372fcea8cSEd Schouten #define hd__ 24
17472fcea8cSEd Schouten #define as__ 25
17572fcea8cSEd Schouten #define mb__ 26
17672fcea8cSEd Schouten #define md__ 27	/* turn on bold		*/
17772fcea8cSEd Schouten #define ti__ 28
17872fcea8cSEd Schouten #define dm__ 29	/* turn on delete mode	*/
17972fcea8cSEd Schouten #define mh__ 30	/* half bright mode	*/
18072fcea8cSEd Schouten #define im__ 31	/* insert mode		*/
18172fcea8cSEd Schouten #define mk__ 32
18272fcea8cSEd Schouten #define mp__ 33
18372fcea8cSEd Schouten #define mr__ 34
18472fcea8cSEd Schouten #define so__ 35	/* enter standout mode	*/
18572fcea8cSEd Schouten #define us__ 36
18672fcea8cSEd Schouten #define ec__ 37
18772fcea8cSEd Schouten #define ae__ 38
18872fcea8cSEd Schouten #define me__ 39
18972fcea8cSEd Schouten #define te__ 40
19072fcea8cSEd Schouten #define ed__ 41
19172fcea8cSEd Schouten #define ei__ 42	/* exit insert mode	*/
19272fcea8cSEd Schouten #define se__ 43	/* exit standout mode	*/
19372fcea8cSEd Schouten #define ue__ 44
19472fcea8cSEd Schouten #define vb__ 45
19572fcea8cSEd Schouten #define ff__ 46
19672fcea8cSEd Schouten #define fs__ 47
19772fcea8cSEd Schouten #define i1__ 48
19872fcea8cSEd Schouten #define i2__ 49
19972fcea8cSEd Schouten #define i3__ 50
20072fcea8cSEd Schouten #define if__ 51
20172fcea8cSEd Schouten #define ic__ 52
20272fcea8cSEd Schouten #define al__ 53
20372fcea8cSEd Schouten #define ip__ 54
20472fcea8cSEd Schouten #define kb__ 55		/* backspace key	*/
20572fcea8cSEd Schouten #define ka__ 56
20672fcea8cSEd Schouten #define kC__ 57
20772fcea8cSEd Schouten #define kt__ 58
20872fcea8cSEd Schouten #define kD__ 59
20972fcea8cSEd Schouten #define kL__ 60
21072fcea8cSEd Schouten #define kd__ 61
21172fcea8cSEd Schouten #define kM__ 62
21272fcea8cSEd Schouten #define kE__ 63
21372fcea8cSEd Schouten #define kS__ 64
21472fcea8cSEd Schouten #define k0__ 65
21572fcea8cSEd Schouten #define k1__ 66
21672fcea8cSEd Schouten #define kf10__ 67
21772fcea8cSEd Schouten #define k2__ 68
21872fcea8cSEd Schouten #define k3__ 69
21972fcea8cSEd Schouten #define k4__ 70
22072fcea8cSEd Schouten #define k5__ 71
22172fcea8cSEd Schouten #define k6__ 72
22272fcea8cSEd Schouten #define k7__ 73
22372fcea8cSEd Schouten #define k8__ 74
22472fcea8cSEd Schouten #define k9__ 75
22572fcea8cSEd Schouten #define kh__ 76
22672fcea8cSEd Schouten #define kI__ 77
22772fcea8cSEd Schouten #define kA__ 78
22872fcea8cSEd Schouten #define kl__ 79
22972fcea8cSEd Schouten #define kH__ 80
23072fcea8cSEd Schouten #define kN__ 81
23172fcea8cSEd Schouten #define kP__ 82
23272fcea8cSEd Schouten #define kr__ 83
23372fcea8cSEd Schouten #define kF__ 84
23472fcea8cSEd Schouten #define kR__ 85
23572fcea8cSEd Schouten #define kT__ 86
23672fcea8cSEd Schouten #define ku__ 87	/* key up	*/
23772fcea8cSEd Schouten #define ke__ 88
23872fcea8cSEd Schouten #define ks__ 89
23972fcea8cSEd Schouten #define l0__ 90
24072fcea8cSEd Schouten #define l1__ 91
24172fcea8cSEd Schouten #define la__ 92
24272fcea8cSEd Schouten #define l2__ 93
24372fcea8cSEd Schouten #define l3__ 94
24472fcea8cSEd Schouten #define l4__ 95
24572fcea8cSEd Schouten #define l5__ 96
24672fcea8cSEd Schouten #define l6__ 97
24772fcea8cSEd Schouten #define l7__ 98
24872fcea8cSEd Schouten #define l8__ 99
24972fcea8cSEd Schouten #define l9__ 100
25072fcea8cSEd Schouten #define mo__ 101
25172fcea8cSEd Schouten #define mm__ 102
25272fcea8cSEd Schouten #define nw__ 103
25372fcea8cSEd Schouten #define pc__ 104
25472fcea8cSEd Schouten #define DC__ 105
25572fcea8cSEd Schouten #define DL__ 106
25672fcea8cSEd Schouten #define DO__ 107
25772fcea8cSEd Schouten #define IC__ 118
25872fcea8cSEd Schouten #define SF__ 109
25972fcea8cSEd Schouten #define AL__ 110
26072fcea8cSEd Schouten #define LE__ 111
26172fcea8cSEd Schouten #define RI__ 112
26272fcea8cSEd Schouten #define SR__ 113
26372fcea8cSEd Schouten #define UP__ 114
26472fcea8cSEd Schouten #define pk__ 115
26572fcea8cSEd Schouten #define pl__ 116
26672fcea8cSEd Schouten #define px__ 117
26772fcea8cSEd Schouten #define ps__ 118
26872fcea8cSEd Schouten #define pf__ 119
26972fcea8cSEd Schouten #define po__ 120
27072fcea8cSEd Schouten #define rp__ 121
27172fcea8cSEd Schouten #define r1__ 122
27272fcea8cSEd Schouten #define r2__ 123
27372fcea8cSEd Schouten #define r3__ 124
27472fcea8cSEd Schouten #define rf__ 125
27572fcea8cSEd Schouten #define rc__ 126
27672fcea8cSEd Schouten #define cv__ 127
27772fcea8cSEd Schouten #define sc__ 128
27872fcea8cSEd Schouten #define sf__ 129
27972fcea8cSEd Schouten #define sr__ 130
28072fcea8cSEd Schouten #define sa__ 131	/* sgr	*/
28172fcea8cSEd Schouten #define st__ 132
28272fcea8cSEd Schouten #define wi__ 133
28372fcea8cSEd Schouten #define ta__ 134
28472fcea8cSEd Schouten #define ts__ 135
28572fcea8cSEd Schouten #define uc__ 136
28672fcea8cSEd Schouten #define hu__ 137
28772fcea8cSEd Schouten #define iP__ 138
28872fcea8cSEd Schouten #define K1__ 139
28972fcea8cSEd Schouten #define K2__ 140
29072fcea8cSEd Schouten #define K3__ 141
29172fcea8cSEd Schouten #define K4__ 142
29272fcea8cSEd Schouten #define K5__ 143
29372fcea8cSEd Schouten #define pO__ 144
29472fcea8cSEd Schouten #define ml__ 145
29572fcea8cSEd Schouten #define mu__ 146
29672fcea8cSEd Schouten #define rmp__ 145
29772fcea8cSEd Schouten #define acsc__ 146
29872fcea8cSEd Schouten #define pln__ 147
29972fcea8cSEd Schouten #define kcbt__ 148
30072fcea8cSEd Schouten #define smxon__ 149
30172fcea8cSEd Schouten #define rmxon__ 150
30272fcea8cSEd Schouten #define smam__ 151
30372fcea8cSEd Schouten #define rmam__ 152
30472fcea8cSEd Schouten #define xonc__ 153
30572fcea8cSEd Schouten #define xoffc__ 154
30672fcea8cSEd Schouten #define enacs__ 155
30772fcea8cSEd Schouten #define smln__ 156
30872fcea8cSEd Schouten #define rmln__ 157
30972fcea8cSEd Schouten #define kbeg__ 158
31072fcea8cSEd Schouten #define kcan__ 159
31172fcea8cSEd Schouten #define kclo__ 160
31272fcea8cSEd Schouten #define kcmd__ 161
31372fcea8cSEd Schouten #define kcpy__ 162
31472fcea8cSEd Schouten #define kcrt__ 163
31572fcea8cSEd Schouten #define kend__ 164
31672fcea8cSEd Schouten #define kent__ 165
31772fcea8cSEd Schouten #define kext__ 166
31872fcea8cSEd Schouten #define kfnd__ 167
31972fcea8cSEd Schouten #define khlp__ 168
32072fcea8cSEd Schouten #define kmrk__ 169
32172fcea8cSEd Schouten #define kmsg__ 170
32272fcea8cSEd Schouten #define kmov__ 171
32372fcea8cSEd Schouten #define knxt__ 172
32472fcea8cSEd Schouten #define kopn__ 173
32572fcea8cSEd Schouten #define kopt__ 174
32672fcea8cSEd Schouten #define kprv__ 175
32772fcea8cSEd Schouten #define kprt__ 176
32872fcea8cSEd Schouten #define krdo__ 177
32972fcea8cSEd Schouten #define kref__ 178
33072fcea8cSEd Schouten #define krfr__ 179
33172fcea8cSEd Schouten #define krpl__ 180
33272fcea8cSEd Schouten #define krst__ 181
33372fcea8cSEd Schouten #define kres__ 182
33472fcea8cSEd Schouten #define ksav__ 183
33572fcea8cSEd Schouten #define kspd__ 184
33672fcea8cSEd Schouten #define kund__ 185
33772fcea8cSEd Schouten #define kBEG__ 186
33872fcea8cSEd Schouten #define kCAN__ 187
33972fcea8cSEd Schouten #define kCMD__ 188
34072fcea8cSEd Schouten #define kCPY__ 189
34172fcea8cSEd Schouten #define kCRT__ 190
34272fcea8cSEd Schouten #define kDC__ 191
34372fcea8cSEd Schouten #define kDL__ 192
34472fcea8cSEd Schouten #define kslt__ 193
34572fcea8cSEd Schouten #define kEND__ 194
34672fcea8cSEd Schouten #define kEOL__ 195
34772fcea8cSEd Schouten #define kEXT__ 196
34872fcea8cSEd Schouten #define kFND__ 197
34972fcea8cSEd Schouten #define kHLP__ 198
35072fcea8cSEd Schouten #define kHOM__ 199
35172fcea8cSEd Schouten #define kIC__ 200
35272fcea8cSEd Schouten #define kLFT__ 201
35372fcea8cSEd Schouten #define kMSG__ 202
35472fcea8cSEd Schouten #define kMOV__ 203
35572fcea8cSEd Schouten #define kNXT__ 204
35672fcea8cSEd Schouten #define kOPT__ 205
35772fcea8cSEd Schouten #define kPRV__ 206
35872fcea8cSEd Schouten #define kPRT__ 207
35972fcea8cSEd Schouten #define kRDO__ 208
36072fcea8cSEd Schouten #define kRPL__ 209
36172fcea8cSEd Schouten #define kRIT__ 210
36272fcea8cSEd Schouten #define kRES__ 211
36372fcea8cSEd Schouten #define kSAV__ 212
36472fcea8cSEd Schouten #define kSPD__ 213
36572fcea8cSEd Schouten #define kUND__ 214
36672fcea8cSEd Schouten #define rfi__ 215
36772fcea8cSEd Schouten #define kf11__ 216
36872fcea8cSEd Schouten #define kf12__ 217
36972fcea8cSEd Schouten #define kf13__ 218
37072fcea8cSEd Schouten #define kf14__ 219
37172fcea8cSEd Schouten #define kf15__ 220
37272fcea8cSEd Schouten #define kf16__ 221
37372fcea8cSEd Schouten #define kf17__ 222
37472fcea8cSEd Schouten #define kf18__ 223
37572fcea8cSEd Schouten #define kf19__ 224
37672fcea8cSEd Schouten #define kf20__ 225
37772fcea8cSEd Schouten #define kf21__ 226
37872fcea8cSEd Schouten #define kf22__ 227
37972fcea8cSEd Schouten #define kf23__ 228
38072fcea8cSEd Schouten #define kf24__ 229
38172fcea8cSEd Schouten #define kf25__ 230
38272fcea8cSEd Schouten #define kf26__ 231
38372fcea8cSEd Schouten #define kf27__ 232
38472fcea8cSEd Schouten #define kf28__ 233
38572fcea8cSEd Schouten #define kf29__ 234
38672fcea8cSEd Schouten #define kf30__ 235
38772fcea8cSEd Schouten #define kf31__ 236
38872fcea8cSEd Schouten #define kf32__ 237
38972fcea8cSEd Schouten #define kf33__ 238
39072fcea8cSEd Schouten #define kf34__ 239
39172fcea8cSEd Schouten #define kf35__ 240
39272fcea8cSEd Schouten #define kf36__ 241
39372fcea8cSEd Schouten #define kf37__ 242
39472fcea8cSEd Schouten #define kf38__ 243
39572fcea8cSEd Schouten #define kf39__ 244
39672fcea8cSEd Schouten #define kf40__ 245
39772fcea8cSEd Schouten #define kf41__ 246
39872fcea8cSEd Schouten #define kf42__ 247
39972fcea8cSEd Schouten #define kf43__ 248
40072fcea8cSEd Schouten #define kf44__ 249
40172fcea8cSEd Schouten #define kf45__ 250
40272fcea8cSEd Schouten #define kf46__ 251
40372fcea8cSEd Schouten #define kf47__ 252
40472fcea8cSEd Schouten #define kf48__ 253
40572fcea8cSEd Schouten #define kf49__ 254
40672fcea8cSEd Schouten #define kf50__ 255
40772fcea8cSEd Schouten #define kf51__ 256
40872fcea8cSEd Schouten #define kf52__ 257
40972fcea8cSEd Schouten #define kf53__ 258
41072fcea8cSEd Schouten #define kf54__ 259
41172fcea8cSEd Schouten #define kf55__ 260
41272fcea8cSEd Schouten #define kf56__ 261
41372fcea8cSEd Schouten #define kf57__ 262
41472fcea8cSEd Schouten #define kf58__ 263
41572fcea8cSEd Schouten #define kf59__ 264
41672fcea8cSEd Schouten #define kf60__ 265
41772fcea8cSEd Schouten #define kf61__ 266
41872fcea8cSEd Schouten #define kf62__ 267
41972fcea8cSEd Schouten #define kf63__ 268
42072fcea8cSEd Schouten #define el1__ 269
42172fcea8cSEd Schouten #define mgc__ 270
42272fcea8cSEd Schouten #define smgl__ 271
42372fcea8cSEd Schouten #define smgr__ 272
42472fcea8cSEd Schouten 
42572fcea8cSEd Schouten #ifdef CAP
42672fcea8cSEd Schouten char *Boolean_names[] = {
42772fcea8cSEd Schouten "bw", "am", "xb", "xs", "xn", "eo", "gn", "hc", "km", "hs", "in", "da", "db",
42872fcea8cSEd Schouten "mi", "ms", "os", "es", "xt", "hz", "ul", "xo", "HC", "nx", "NR", "NP", "5i"
42972fcea8cSEd Schouten };
43072fcea8cSEd Schouten 
43172fcea8cSEd Schouten char *Number_names[] = {
43272fcea8cSEd Schouten "co#", "it#", "li#", "lm#", "sg#", "pb#", "vt#", "ws#", "Nl#", "lh#", "lw#"
43372fcea8cSEd Schouten };
43472fcea8cSEd Schouten 
43572fcea8cSEd Schouten char *String_names[] = {
43672fcea8cSEd Schouten "bt=", "bl=", "cr=", "cs=", "ct=", "cl=", "ce=", "cd=", "ch=", "CC=", "cm=",
43772fcea8cSEd Schouten "do=", "ho=", "vi=", "le=", "CM=", "ve=", "nd=", "ll=", "up=", "vs=", "dc=",
43872fcea8cSEd Schouten "dl=", "ds=", "hd=", "as=", "mb=", "md=", "ti=", "dm=", "mh=", "im=", "mk=",
43972fcea8cSEd Schouten "mp=", "mr=", "so=", "us=", "ec=", "ae=", "me=", "te=", "ed=", "ei=", "se=",
44072fcea8cSEd Schouten "ue=", "vb=", "ff=", "fs=", "i1=", "i2=", "i3=", "if=", "ic=", "al=", "ip=",
44172fcea8cSEd Schouten "kb=", "ka=", "kC=", "kt=", "kD=", "kL=", "kd=", "kM=", "kE=", "kS=", "k0=",
44272fcea8cSEd Schouten "k1=", "k;=", "k2=", "k3=", "k4=", "k5=", "k6=", "k7=", "k8=", "k9=", "kh=",
44372fcea8cSEd Schouten "kI=", "kA=", "kl=", "kH=", "kN=", "kP=", "kr=", "kF=", "kR=", "kT=", "ku=",
44472fcea8cSEd Schouten "ke=", "ks=", "l0=", "l1=", "la=", "l2=", "l3=", "l4=", "l5=", "l6=", "l7=",
44572fcea8cSEd Schouten "l8=", "l9=", "mo=", "mm=", "nw=", "pc=", "DC=", "DL=", "DO=", "IC=", "SF=",
44672fcea8cSEd Schouten "AL=", "LE=", "RI=", "SR=", "UP=", "pk=", "pl=", "px=", "ps=", "pf=", "po=",
44772fcea8cSEd Schouten "rp=", "r1=", "r2=", "r3=", "rf=", "rc=", "cv=", "sc=", "sf=", "sr=", "sa=",
44872fcea8cSEd Schouten "st=", "wi=", "ta=", "ts=", "uc=", "hu=", "iP=", "K1=", "K3=", "K2=", "K4=",
44972fcea8cSEd Schouten "K5=", "pO=", "rP=", "ac=", "pn=", "kB=", "SX=", "RX=", "SA=", "RA=", "XN=",
45072fcea8cSEd Schouten "XF=", "eA=", "LO=", "LF=", "@1=", "@2=", "@3=", "@4=", "@5=", "@6=", "@7=",
45172fcea8cSEd Schouten "@8=", "@9=", "@0=", "%1=", "%2=", "%3=", "%4=", "%5=", "%6=", "%7=", "%8=",
45272fcea8cSEd Schouten "%9=", "%0=", "&1=", "&2=", "&3=", "&4=", "&5=", "&6=", "&7=", "&8=", "&9=",
45372fcea8cSEd Schouten "&0=", "*1=", "*2=", "*3=", "*4=", "*5=", "*6=", "*7=", "*8=", "*9=", "*0=",
45472fcea8cSEd Schouten "#1=", "#2=", "#3=", "#4=", "%a=", "%b=", "%c=", "%d=", "%e=", "%f=", "%g=",
45572fcea8cSEd Schouten "%h=", "%i=", "%j=", "!1=", "!2=", "!3=", "RF=", "F1=", "F2=", "F3=", "F4=",
45672fcea8cSEd Schouten "F5=", "F6=", "F7=", "F8=", "F9=", "FA=", "FB=", "FC=", "FD=", "FE=", "FF=",
45772fcea8cSEd Schouten "FG=", "FH=", "FI=", "FJ=", "FK=", "FL=", "FM=", "FN=", "FO=", "FP=", "FQ=",
45872fcea8cSEd Schouten "FR=", "FS=", "FT=", "FU=", "FV=", "FW=", "FX=", "FY=", "FZ=", "Fa=", "Fb=",
45972fcea8cSEd Schouten "Fc=", "Fd=", "Fe=", "Ff=", "Fg=", "Fh=", "Fi=", "Fj=", "Fk=", "Fl=", "Fm=",
46072fcea8cSEd Schouten "Fn=", "Fo=", "Fp=", "Fq=", "Fr=", "cb=", "MC=", "ML=", "MR="
46172fcea8cSEd Schouten };
46272fcea8cSEd Schouten #endif
46372fcea8cSEd Schouten 
46472fcea8cSEd Schouten char *new_curse = "October 1987";
46572fcea8cSEd Schouten 
46672fcea8cSEd Schouten char in_buff[100];	/* buffer for ungetch			*/
46772fcea8cSEd Schouten int bufp;		/* next free position in in_buff	*/
46872fcea8cSEd Schouten 
46972fcea8cSEd Schouten char *TERMINAL_TYPE = NULL; /* terminal type to be gotten from environment	*/
47072fcea8cSEd Schouten int CFOUND = FALSE;
47172fcea8cSEd Schouten int Data_Line_len = 0;
47272fcea8cSEd Schouten int Max_Key_len;	/* max length of a sequence sent by a key	*/
47372fcea8cSEd Schouten char *Data_Line = NULL;
47472fcea8cSEd Schouten char *TERM_PATH = NULL;
47572fcea8cSEd Schouten char *TERM_data_ptr = NULL;
47672fcea8cSEd Schouten char *Term_File_name = NULL;	/* name of file containing terminal description	*/
47772fcea8cSEd Schouten FILE *TFP;		/* file pointer to file with terminal des.	*/
47872fcea8cSEd Schouten int Fildes;		/* file descriptor for terminfo file		*/
47972fcea8cSEd Schouten int STAND = FALSE;	/* is standout mode activated?			*/
48072fcea8cSEd Schouten int TERM_INFO = FALSE;	/* is terminfo being used (TRUE), or termcap (FALSE) */
48172fcea8cSEd Schouten int Time_Out;	/* set when time elapsed while trying to read function key */
48272fcea8cSEd Schouten int Curr_x;		/* current x position on screen			*/
48372fcea8cSEd Schouten int Curr_y;		/* current y position on the screen		*/
48472fcea8cSEd Schouten int LINES;
48572fcea8cSEd Schouten int COLS;
48672fcea8cSEd Schouten int Move_It;		/* flag to move cursor if magic cookie glitch	*/
48772fcea8cSEd Schouten int initialized = FALSE;	/* tells whether new_curse is initialized	*/
48872fcea8cSEd Schouten float speed;
48972fcea8cSEd Schouten float chars_per_millisecond;
49072fcea8cSEd Schouten int Repaint_screen;	/* if an operation to change screen impossible, repaint screen	*/
49172fcea8cSEd Schouten int Intr;		/* storeage for interrupt character		*/
49272fcea8cSEd Schouten int Parity;		/* 0 = no parity, 1 = odd parity, 2 = even parity */
49372fcea8cSEd Schouten int Noblock;		/* for BSD systems				*/
49472fcea8cSEd Schouten int Num_bits;	/* number of bits per character	*/
49572fcea8cSEd Schouten int Flip_Bytes;	/* some systems have byte order reversed	*/
49672fcea8cSEd Schouten int interrupt_flag = FALSE;	/* set true if SIGWINCH received	*/
49772fcea8cSEd Schouten 
49872fcea8cSEd Schouten #ifndef CAP
49972fcea8cSEd Schouten char *Strings;
50072fcea8cSEd Schouten #endif
50172fcea8cSEd Schouten 
50296b676e9SEd Schouten #if !defined(TERMCAP)
50396b676e9SEd Schouten #define TERMCAP "/etc/termcap"
50496b676e9SEd Schouten #endif
50596b676e9SEd Schouten 
50672fcea8cSEd Schouten struct KEYS {
50772fcea8cSEd Schouten 	int length;	/* length of string sent by key			*/
50872fcea8cSEd Schouten 	char *string;	/* string sent by key				*/
50972fcea8cSEd Schouten 	int value;	/* CURSES value of key (9-bit)			*/
51072fcea8cSEd Schouten 	};
51172fcea8cSEd Schouten 
51272fcea8cSEd Schouten struct KEY_STACK {
51372fcea8cSEd Schouten 	struct KEYS *element;
51472fcea8cSEd Schouten 	struct KEY_STACK *next;
51572fcea8cSEd Schouten 	};
51672fcea8cSEd Schouten 
51772fcea8cSEd Schouten struct KEY_STACK *KEY_TOS = NULL;
51872fcea8cSEd Schouten struct KEY_STACK *KEY_POINT;
51972fcea8cSEd Schouten 
52072fcea8cSEd Schouten /*
52172fcea8cSEd Schouten  |
52272fcea8cSEd Schouten  |	Not all systems have good terminal information, so we will define
52372fcea8cSEd Schouten  |	keyboard information here for the most widely used terminal type,
52472fcea8cSEd Schouten  |	the VT100.
52572fcea8cSEd Schouten  |
52672fcea8cSEd Schouten  */
52772fcea8cSEd Schouten 
52872fcea8cSEd Schouten struct KEYS vt100[] =
52972fcea8cSEd Schouten 	{
53072fcea8cSEd Schouten 		{ 3, "\033[A", 0403 },	/* key up 	*/
53172fcea8cSEd Schouten 		{ 3, "\033[C", 0405 },	/* key right	*/
53272fcea8cSEd Schouten 		{ 3, "\033[D", 0404 },	/* key left	*/
53372fcea8cSEd Schouten 
53472fcea8cSEd Schouten 		{ 4, "\033[6~", 0522 },	/* key next page	*/
53572fcea8cSEd Schouten 		{ 4, "\033[5~", 0523 },	/* key prev page	*/
53672fcea8cSEd Schouten 		{ 3, "\033[[", 0550 },	/* key end	*/
53772fcea8cSEd Schouten 		{ 3, "\033[@", 0406 },	/* key home	*/
53872fcea8cSEd Schouten 		{ 4, "\033[2~", 0513 },	/* key insert char	*/
53972fcea8cSEd Schouten 
54072fcea8cSEd Schouten 		{ 3, "\033[y", 0410 },	/* key F0	*/
54172fcea8cSEd Schouten 		{ 3, "\033[P", 0411 },	/* key F1	*/
54272fcea8cSEd Schouten 		{ 3, "\033[Q", 0412 },	/* key F2	*/
54372fcea8cSEd Schouten 		{ 3, "\033[R", 0413 },	/* key F3	*/
54472fcea8cSEd Schouten 		{ 3, "\033[S", 0414 },	/* key F4	*/
54572fcea8cSEd Schouten 		{ 3, "\033[t", 0415 },	/* key F5	*/
54672fcea8cSEd Schouten 		{ 3, "\033[u", 0416 },	/* key F6	*/
54772fcea8cSEd Schouten 		{ 3, "\033[v", 0417 },	/* key F7	*/
54872fcea8cSEd Schouten 		{ 3, "\033[l", 0420 },	/* key F8	*/
54972fcea8cSEd Schouten 		{ 3, "\033[w", 0421 },	/* key F9	*/
55072fcea8cSEd Schouten 		{ 3, "\033[x", 0422 },	/* key F10	*/
55172fcea8cSEd Schouten 
55272fcea8cSEd Schouten 		{ 5, "\033[10~", 0410 },	/* key F0	*/
55372fcea8cSEd Schouten 		{ 5, "\033[11~", 0411 },	/* key F1	*/
55472fcea8cSEd Schouten 		{ 5, "\033[12~", 0412 },	/* key F2	*/
55572fcea8cSEd Schouten 		{ 5, "\033[13~", 0413 },	/* key F3	*/
55672fcea8cSEd Schouten 		{ 5, "\033[14~", 0414 },	/* key F4	*/
55772fcea8cSEd Schouten 		{ 5, "\033[15~", 0415 },	/* key F5	*/
55872fcea8cSEd Schouten 		{ 5, "\033[17~", 0416 },	/* key F6	*/
55972fcea8cSEd Schouten 		{ 5, "\033[18~", 0417 },	/* key F7	*/
56072fcea8cSEd Schouten 		{ 5, "\033[19~", 0420 },	/* key F8	*/
56172fcea8cSEd Schouten 		{ 5, "\033[20~", 0421 },	/* key F9	*/
56272fcea8cSEd Schouten 		{ 5, "\033[21~", 0422 },	/* key F10	*/
56372fcea8cSEd Schouten 		{ 5, "\033[23~", 0423 },	/* key F11	*/
56472fcea8cSEd Schouten 		{ 5, "\033[24~", 0424 },	/* key F12	*/
56572fcea8cSEd Schouten 		{ 3, "\033[q", 0534 },	/* ka1 upper-left of keypad	*/
56672fcea8cSEd Schouten 		{ 3, "\033[s", 0535 },	/* ka3 upper-right of keypad	*/
56772fcea8cSEd Schouten 		{ 3, "\033[r", 0536 },	/* kb2 center of keypad	*/
56872fcea8cSEd Schouten  		{ 3, "\033[p", 0537 },	/* kc1 lower-left of keypad	*/
56972fcea8cSEd Schouten 		{ 3, "\033[n", 0540 },	/* kc3 lower-right of keypad	*/
57072fcea8cSEd Schouten 
57172fcea8cSEd Schouten 		/*
57272fcea8cSEd Schouten 		 |	The following are the same keys as above, but with
57372fcea8cSEd Schouten 		 |	a different character following the escape char.
57472fcea8cSEd Schouten 		 */
57572fcea8cSEd Schouten 
57672fcea8cSEd Schouten 		{ 3, "\033OA", 0403 },	/* key up 	*/
57772fcea8cSEd Schouten 		{ 3, "\033OC", 0405 },	/* key right	*/
57872fcea8cSEd Schouten 		{ 3, "\033OD", 0404 },	/* key left	*/
57972fcea8cSEd Schouten 		{ 3, "\033OB", 0402 },	/* key down	*/
58072fcea8cSEd Schouten 		{ 4, "\033O6~", 0522 },	/* key next page	*/
58172fcea8cSEd Schouten 		{ 4, "\033O5~", 0523 },	/* key prev page	*/
58272fcea8cSEd Schouten 		{ 3, "\033O[", 0550 },	/* key end	*/
58372fcea8cSEd Schouten 		{ 3, "\033O@", 0406 },	/* key home	*/
58472fcea8cSEd Schouten 		{ 4, "\033O2~", 0513 },	/* key insert char	*/
58572fcea8cSEd Schouten 
58672fcea8cSEd Schouten 		{ 3, "\033Oy", 0410 },	/* key F0	*/
58772fcea8cSEd Schouten 		{ 3, "\033OP", 0411 },	/* key F1	*/
58872fcea8cSEd Schouten 		{ 3, "\033OQ", 0412 },	/* key F2	*/
58972fcea8cSEd Schouten 		{ 3, "\033OR", 0413 },	/* key F3	*/
59072fcea8cSEd Schouten 		{ 3, "\033OS", 0414 },	/* key F4	*/
59172fcea8cSEd Schouten 		{ 3, "\033Ot", 0415 },	/* key F5	*/
59272fcea8cSEd Schouten 		{ 3, "\033Ou", 0416 },	/* key F6	*/
59372fcea8cSEd Schouten 		{ 3, "\033Ov", 0417 },	/* key F7	*/
59472fcea8cSEd Schouten 		{ 3, "\033Ol", 0420 },	/* key F8	*/
59572fcea8cSEd Schouten 		{ 3, "\033Ow", 0421 },	/* key F9	*/
59672fcea8cSEd Schouten 		{ 3, "\033Ox", 0422 },	/* key F10	*/
59772fcea8cSEd Schouten 
59872fcea8cSEd Schouten 		{ 5, "\033O10~", 0410 },	/* key F0	*/
59972fcea8cSEd Schouten 		{ 5, "\033O11~", 0411 },	/* key F1	*/
60072fcea8cSEd Schouten 		{ 5, "\033O12~", 0412 },	/* key F2	*/
60172fcea8cSEd Schouten 		{ 5, "\033O13~", 0413 },	/* key F3	*/
60272fcea8cSEd Schouten 		{ 5, "\033O14~", 0414 },	/* key F4	*/
60372fcea8cSEd Schouten 		{ 5, "\033O15~", 0415 },	/* key F5	*/
60472fcea8cSEd Schouten 		{ 5, "\033O17~", 0416 },	/* key F6	*/
60572fcea8cSEd Schouten 		{ 5, "\033O18~", 0417 },	/* key F7	*/
60672fcea8cSEd Schouten 		{ 5, "\033O19~", 0420 },	/* key F8	*/
60772fcea8cSEd Schouten 		{ 5, "\033O20~", 0421 },	/* key F9	*/
60872fcea8cSEd Schouten 		{ 5, "\033O21~", 0422 },	/* key F10	*/
60972fcea8cSEd Schouten 		{ 5, "\033O23~", 0423 },	/* key F11	*/
61072fcea8cSEd Schouten 		{ 5, "\033O24~", 0424 },	/* key F12	*/
61172fcea8cSEd Schouten 		{ 3, "\033Oq", 0534 },	/* ka1 upper-left of keypad	*/
61272fcea8cSEd Schouten 		{ 3, "\033Os", 0535 },	/* ka3 upper-right of keypad	*/
61372fcea8cSEd Schouten 		{ 3, "\033Or", 0536 },	/* kb2 center of keypad	*/
61472fcea8cSEd Schouten  		{ 3, "\033Op", 0537 },	/* kc1 lower-left of keypad	*/
61572fcea8cSEd Schouten 		{ 3, "\033On", 0540 },	/* kc3 lower-right of keypad	*/
61672fcea8cSEd Schouten 
61772fcea8cSEd Schouten 		{ 0, "", 0 }	/* end	*/
61872fcea8cSEd Schouten 	};
61972fcea8cSEd Schouten 
62072fcea8cSEd Schouten struct Parameters {
62172fcea8cSEd Schouten 	int value;
62272fcea8cSEd Schouten 	struct Parameters *next;
62372fcea8cSEd Schouten 	};
62472fcea8cSEd Schouten 
62572fcea8cSEd Schouten int Key_vals[] = {
62672fcea8cSEd Schouten 	0407, 0526, 0515, 0525, 0512, 0510, 0402, 0514, 0517, 0516, 0410, 0411,
62772fcea8cSEd Schouten 	0422, 0412, 0413, 0414, 0415, 0416, 0417, 0420, 0421, 0406, 0513, 0511,
62872fcea8cSEd Schouten 	0404, 0533, 0522, 0523, 0405, 0520, 0521, 0524, 0403,
62972fcea8cSEd Schouten 	0534, 0535, 0536, 0537, 0540, 0541, 0542, 0543, 0544, 0545, 0546, 0547,
63072fcea8cSEd Schouten 	0550, 0527, 0551, 0552, 0553, 0554, 0555, 0556, 0557, 0560, 0561, 0562,
63172fcea8cSEd Schouten 	0532, 0563, 0564, 0565, 0566, 0567, 0570, 0571, 0627, 0630, 0572, 0573,
63272fcea8cSEd Schouten 	0574, 0575, 0576, 0577, 0600, 0601, 0602, 0603, 0604, 0605, 0606, 0607,
63372fcea8cSEd Schouten 	0610, 0611, 0612, 0613, 0614, 0615, 0616, 0617, 0620, 0621, 0622, 0623,
63472fcea8cSEd Schouten 	0624, 0625, 0626, 0423, 0424, 0425, 0426, 0427, 0430, 0431,
63572fcea8cSEd Schouten 	0432, 0433, 0434, 0435, 0436, 0437, 0440, 0441, 0442, 0443, 0444, 0445,
63672fcea8cSEd Schouten 	0446, 0447, 0450, 0451, 0452, 0453, 0454, 0455, 0456, 0457, 0460, 0461,
63772fcea8cSEd Schouten 	0462, 0463, 0464, 0465, 0466, 0467, 0470, 0471, 0472, 0473, 0474, 0475,
63872fcea8cSEd Schouten 	0476, 0477, 0500, 0501, 0502, 0503, 0504, 0505, 0506, 0507
63972fcea8cSEd Schouten };
64072fcea8cSEd Schouten 
64172fcea8cSEd Schouten int attributes_set[9];
64272fcea8cSEd Schouten 
64372fcea8cSEd Schouten static int nc_attributes = 0;	/* global attributes for new_curse to observe */
64472fcea8cSEd Schouten 
64572fcea8cSEd Schouten #ifdef SYS5
64672fcea8cSEd Schouten struct termio Terminal;
64772fcea8cSEd Schouten struct termio Saved_tty;
64872fcea8cSEd Schouten #else
64972fcea8cSEd Schouten struct sgttyb Terminal;
65072fcea8cSEd Schouten struct sgttyb Saved_tty;
65172fcea8cSEd Schouten #endif
65272fcea8cSEd Schouten 
65372fcea8cSEd Schouten char *tc_;
65472fcea8cSEd Schouten 
65572fcea8cSEd Schouten int Booleans[128];
65672fcea8cSEd Schouten int Numbers[128];
65772fcea8cSEd Schouten char *String_table[1024];
65872fcea8cSEd Schouten 
65972fcea8cSEd Schouten int *virtual_lines;
66072fcea8cSEd Schouten 
66172fcea8cSEd Schouten static char nc_scrolling_ability = FALSE;
66272fcea8cSEd Schouten 
66396b676e9SEd Schouten char *terminfo_path[] = {
66496b676e9SEd Schouten         "/usr/lib/terminfo",
66596b676e9SEd Schouten         "/usr/share/lib/terminfo",
66696b676e9SEd Schouten         "/usr/share/terminfo",
66796b676e9SEd Schouten         NULL
66896b676e9SEd Schouten         };
66996b676e9SEd Schouten 
67072fcea8cSEd Schouten #ifdef CAP
67172fcea8cSEd Schouten 
67272fcea8cSEd Schouten #if defined(__STDC__) || defined(__cplusplus)
67372fcea8cSEd Schouten #define P_(s) s
67472fcea8cSEd Schouten #else
67572fcea8cSEd Schouten #define P_(s) ()
67672fcea8cSEd Schouten #endif /* __STDC__ */
67772fcea8cSEd Schouten 
67872fcea8cSEd Schouten int tc_Get_int P_((int));
67972fcea8cSEd Schouten void CAP_PARSE P_((void));
68072fcea8cSEd Schouten void Find_term P_((void));
68172fcea8cSEd Schouten 
68272fcea8cSEd Schouten #undef P_
68372fcea8cSEd Schouten 
68472fcea8cSEd Schouten #endif /* CAP */
68572fcea8cSEd Schouten 
68672fcea8cSEd Schouten 
68772fcea8cSEd Schouten #ifndef __STDC__
68872fcea8cSEd Schouten #ifndef HAS_STDLIB
68972fcea8cSEd Schouten extern char *fgets();
69072fcea8cSEd Schouten extern char *malloc();
69172fcea8cSEd Schouten extern char *getenv();
69272fcea8cSEd Schouten FILE *fopen();			/* declaration for open function	*/
69372fcea8cSEd Schouten #endif /* HAS_STDLIB */
69472fcea8cSEd Schouten #endif /* __STDC__ */
69572fcea8cSEd Schouten 
69672fcea8cSEd Schouten #ifdef SIGWINCH
69772fcea8cSEd Schouten 
69872fcea8cSEd Schouten /*
69972fcea8cSEd Schouten  |	Copy the contents of one window to another.
70072fcea8cSEd Schouten  */
70172fcea8cSEd Schouten 
70272fcea8cSEd Schouten void
copy_window(origin,destination)70372fcea8cSEd Schouten copy_window(origin, destination)
70472fcea8cSEd Schouten WINDOW *origin, *destination;
70572fcea8cSEd Schouten {
70672fcea8cSEd Schouten 	int row, column;
70772fcea8cSEd Schouten 	struct _line *orig, *dest;
70872fcea8cSEd Schouten 
70972fcea8cSEd Schouten 	orig = origin->first_line;
71072fcea8cSEd Schouten 	dest = destination->first_line;
71172fcea8cSEd Schouten 
71272fcea8cSEd Schouten 	for (row = 0;
71372fcea8cSEd Schouten 		row < (min(origin->Num_lines, destination->Num_lines));
71472fcea8cSEd Schouten 			row++)
71572fcea8cSEd Schouten 	{
71672fcea8cSEd Schouten 		for (column = 0;
71772fcea8cSEd Schouten 		    column < (min(origin->Num_cols, destination->Num_cols));
71872fcea8cSEd Schouten 			column++)
71972fcea8cSEd Schouten 		{
72072fcea8cSEd Schouten 			dest->row[column] = orig->row[column];
72172fcea8cSEd Schouten 			dest->attributes[column] = orig->attributes[column];
72272fcea8cSEd Schouten 		}
72372fcea8cSEd Schouten 		dest->changed = orig->changed;
72472fcea8cSEd Schouten 		dest->scroll = orig->scroll;
72572fcea8cSEd Schouten 		dest->last_char = min(orig->last_char, destination->Num_cols);
72672fcea8cSEd Schouten 		orig = orig->next_screen;
72772fcea8cSEd Schouten 		dest = dest->next_screen;
72872fcea8cSEd Schouten 	}
72972fcea8cSEd Schouten 	destination->LX = min((destination->Num_cols - 1), origin->LX);
73072fcea8cSEd Schouten 	destination->LY = min((destination->Num_lines - 1), origin->LY);
73172fcea8cSEd Schouten 	destination->Attrib = origin->Attrib;
73272fcea8cSEd Schouten 	destination->scroll_up = origin->scroll_up;
73372fcea8cSEd Schouten 	destination->scroll_down = origin->scroll_down;
73472fcea8cSEd Schouten 	destination->SCROLL_CLEAR = origin->SCROLL_CLEAR;
73572fcea8cSEd Schouten }
73672fcea8cSEd Schouten 
73772fcea8cSEd Schouten void
reinitscr(foo)73872fcea8cSEd Schouten reinitscr(foo)
73972fcea8cSEd Schouten int foo;
74072fcea8cSEd Schouten {
74172fcea8cSEd Schouten 	WINDOW *local_virt;
74272fcea8cSEd Schouten 	WINDOW *local_std;
74372fcea8cSEd Schouten 	WINDOW *local_cur;
74472fcea8cSEd Schouten 
74572fcea8cSEd Schouten 	signal(SIGWINCH, reinitscr);
74672fcea8cSEd Schouten #ifdef TIOCGWINSZ
74772fcea8cSEd Schouten 	if (ioctl(0, TIOCGWINSZ, &ws) >= 0)
74872fcea8cSEd Schouten 	{
74972fcea8cSEd Schouten 		if (ws.ws_row == LINES && ws.ws_col == COLS)
75072fcea8cSEd Schouten 			return;
75172fcea8cSEd Schouten 		if (ws.ws_row > 0)
75272fcea8cSEd Schouten 			LINES = ws.ws_row;
75372fcea8cSEd Schouten 		if (ws.ws_col > 0)
75472fcea8cSEd Schouten 			COLS = ws.ws_col;
75572fcea8cSEd Schouten 	}
75672fcea8cSEd Schouten #endif /* TIOCGWINSZ */
75772fcea8cSEd Schouten 	local_virt = newwin(LINES, COLS, 0, 0);
75872fcea8cSEd Schouten 	local_std = newwin(LINES, COLS, 0, 0);
75972fcea8cSEd Schouten 	local_cur = newwin(LINES, COLS, 0, 0);
76072fcea8cSEd Schouten 	copy_window(virtual_scr, local_virt);
76172fcea8cSEd Schouten 	copy_window(stdscr, local_std);
76272fcea8cSEd Schouten 	copy_window(curscr, local_cur);
76372fcea8cSEd Schouten 	delwin(virtual_scr);
76472fcea8cSEd Schouten 	delwin(stdscr);
76572fcea8cSEd Schouten 	delwin(curscr);
76672fcea8cSEd Schouten 	virtual_scr = local_virt;
76772fcea8cSEd Schouten 	stdscr = local_std;
76872fcea8cSEd Schouten 	curscr = local_cur;
76972fcea8cSEd Schouten 	free(virtual_lines);
77072fcea8cSEd Schouten 	virtual_lines = (int *) malloc(LINES * (sizeof(int)));
77172fcea8cSEd Schouten 	interrupt_flag = TRUE;
77272fcea8cSEd Schouten }
77372fcea8cSEd Schouten #endif /* SIGWINCH */
77472fcea8cSEd Schouten 
77572fcea8cSEd Schouten void
initscr()77672fcea8cSEd Schouten initscr()		/* initialize terminal for operations	*/
77772fcea8cSEd Schouten {
77872fcea8cSEd Schouten 	int value;
77996b676e9SEd Schouten 	int counter;
78072fcea8cSEd Schouten 	char *lines_string;
78172fcea8cSEd Schouten 	char *columns_string;
78272fcea8cSEd Schouten #ifdef CAP
78372fcea8cSEd Schouten 	char *pointer;
78472fcea8cSEd Schouten #endif /* CAP */
78572fcea8cSEd Schouten 
78672fcea8cSEd Schouten #ifdef DIAG
78772fcea8cSEd Schouten printf("starting initscr \n");fflush(stdout);
78872fcea8cSEd Schouten #endif
78972fcea8cSEd Schouten 	if (initialized)
79072fcea8cSEd Schouten 		return;
79172fcea8cSEd Schouten #ifdef BSD_SELECT
79272fcea8cSEd Schouten 	setbuf(stdin, NULL);
79372fcea8cSEd Schouten #endif /* BSD_SELECT */
79472fcea8cSEd Schouten 	Flip_Bytes = FALSE;
79572fcea8cSEd Schouten 	Parity = 0;
79672fcea8cSEd Schouten 	Time_Out = FALSE;
79772fcea8cSEd Schouten 	bufp = 0;
79872fcea8cSEd Schouten 	Move_It = FALSE;
79972fcea8cSEd Schouten 	Noblock = FALSE;
80072fcea8cSEd Schouten #ifdef SYS5
80172fcea8cSEd Schouten 	value = ioctl(0, TCGETA, &Terminal);
80272fcea8cSEd Schouten 	if (Terminal.c_cflag & PARENB)
80372fcea8cSEd Schouten 	{
80472fcea8cSEd Schouten 		if (Terminal.c_cflag & PARENB)
80572fcea8cSEd Schouten 			Parity = 1;
80672fcea8cSEd Schouten 		else
80772fcea8cSEd Schouten 			Parity = 2;
80872fcea8cSEd Schouten 	}
80972fcea8cSEd Schouten 	if ((Terminal.c_cflag & CS8) == CS8)
81072fcea8cSEd Schouten 	{
81172fcea8cSEd Schouten 		Num_bits = 8;
81272fcea8cSEd Schouten 	}
81372fcea8cSEd Schouten 	else if ((Terminal.c_cflag & CS7) == CS7)
81472fcea8cSEd Schouten 		Num_bits = 7;
81572fcea8cSEd Schouten 	else if ((Terminal.c_cflag & CS6) == CS6)
81672fcea8cSEd Schouten 		Num_bits = 6;
81772fcea8cSEd Schouten 	else
81872fcea8cSEd Schouten 		Num_bits = 5;
81972fcea8cSEd Schouten 	value = Terminal.c_cflag & 037;
82072fcea8cSEd Schouten 	switch (value) {
82172fcea8cSEd Schouten 	case 01:	speed = 50.0;
82272fcea8cSEd Schouten 		break;
82372fcea8cSEd Schouten 	case 02:	speed = 75.0;
82472fcea8cSEd Schouten 		break;
82572fcea8cSEd Schouten 	case 03:	speed = 110.0;
82672fcea8cSEd Schouten 		break;
82772fcea8cSEd Schouten 	case 04:	speed = 134.5;
82872fcea8cSEd Schouten 		break;
82972fcea8cSEd Schouten 	case 05:	speed = 150.0;
83072fcea8cSEd Schouten 		break;
83172fcea8cSEd Schouten 	case 06:	speed = 200.0;
83272fcea8cSEd Schouten 		break;
83372fcea8cSEd Schouten 	case 07:	speed = 300.0;
83472fcea8cSEd Schouten 		break;
83572fcea8cSEd Schouten 	case 010:	speed = 600.0;
83672fcea8cSEd Schouten 		break;
83772fcea8cSEd Schouten 	case 011:	speed = 900.0;
83872fcea8cSEd Schouten 		break;
83972fcea8cSEd Schouten 	case 012:	speed = 1200.0;
84072fcea8cSEd Schouten 		break;
84172fcea8cSEd Schouten 	case 013:	speed = 1800.0;
84272fcea8cSEd Schouten 		break;
84372fcea8cSEd Schouten 	case 014:	speed = 2400.0;
84472fcea8cSEd Schouten 		break;
84572fcea8cSEd Schouten 	case 015:	speed = 3600.0;
84672fcea8cSEd Schouten 		break;
84772fcea8cSEd Schouten 	case 016:	speed = 4800.0;
84872fcea8cSEd Schouten 		break;
84972fcea8cSEd Schouten 	case 017:	speed = 7200.0;
85072fcea8cSEd Schouten 		break;
85172fcea8cSEd Schouten 	case 020:	speed = 9600.0;
85272fcea8cSEd Schouten 		break;
85372fcea8cSEd Schouten 	case 021:	speed = 19200.0;
85472fcea8cSEd Schouten 		break;
85572fcea8cSEd Schouten 	case 022:	speed = 38400.0;
85672fcea8cSEd Schouten 		break;
85772fcea8cSEd Schouten 	default:	speed = 0.0;
85872fcea8cSEd Schouten 	}
85972fcea8cSEd Schouten #else
86072fcea8cSEd Schouten 	value = ioctl(0, TIOCGETP, &Terminal);
86172fcea8cSEd Schouten 	if (Terminal.sg_flags & EVENP)
86272fcea8cSEd Schouten 		Parity = 2;
86372fcea8cSEd Schouten 	else if (Terminal.sg_flags & ODDP)
86472fcea8cSEd Schouten 		Parity = 1;
86572fcea8cSEd Schouten 	value = Terminal.sg_ospeed;
86672fcea8cSEd Schouten 	switch (value) {
86772fcea8cSEd Schouten 	case 01:	speed = 50.0;
86872fcea8cSEd Schouten 		break;
86972fcea8cSEd Schouten 	case 02:	speed = 75.0;
87072fcea8cSEd Schouten 		break;
87172fcea8cSEd Schouten 	case 03:	speed = 110.0;
87272fcea8cSEd Schouten 		break;
87372fcea8cSEd Schouten 	case 04:	speed = 134.5;
87472fcea8cSEd Schouten 		break;
87572fcea8cSEd Schouten 	case 05:	speed = 150.0;
87672fcea8cSEd Schouten 		break;
87772fcea8cSEd Schouten 	case 06:	speed = 200.0;
87872fcea8cSEd Schouten 		break;
87972fcea8cSEd Schouten 	case 07:	speed = 300.0;
88072fcea8cSEd Schouten 		break;
88172fcea8cSEd Schouten 	case 010:	speed = 600.0;
88272fcea8cSEd Schouten 		break;
88372fcea8cSEd Schouten 	case 011:	speed = 1200.0;
88472fcea8cSEd Schouten 		break;
88572fcea8cSEd Schouten 	case 012:	speed = 1800.0;
88672fcea8cSEd Schouten 		break;
88772fcea8cSEd Schouten 	case 013:	speed = 2400.0;
88872fcea8cSEd Schouten 		break;
88972fcea8cSEd Schouten 	case 014:	speed = 4800.0;
89072fcea8cSEd Schouten 		break;
89172fcea8cSEd Schouten 	case 015:	speed = 9600.0;
89272fcea8cSEd Schouten 		break;
89372fcea8cSEd Schouten 	default:	speed = 0.0;
89472fcea8cSEd Schouten 	}
89572fcea8cSEd Schouten #endif
89672fcea8cSEd Schouten 	chars_per_millisecond = (0.001 * speed) / 8.0;
89772fcea8cSEd Schouten 	TERMINAL_TYPE = getenv("TERM");
89872fcea8cSEd Schouten 	if (TERMINAL_TYPE == NULL)
89972fcea8cSEd Schouten 	{
90072fcea8cSEd Schouten 		printf("unknown terminal type\n");
90172fcea8cSEd Schouten 		exit(0);
90272fcea8cSEd Schouten 	}
90372fcea8cSEd Schouten #ifndef CAP
90472fcea8cSEd Schouten 	Fildes = -1;
90572fcea8cSEd Schouten 	TERM_PATH = getenv("TERMINFO");
90672fcea8cSEd Schouten 	if (TERM_PATH != NULL)
90772fcea8cSEd Schouten 	{
90872fcea8cSEd Schouten 		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
90972fcea8cSEd Schouten 		Term_File_name = malloc(Data_Line_len);
91072fcea8cSEd Schouten 		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
91172fcea8cSEd Schouten 		Fildes = open(Term_File_name, O_RDONLY);
91272fcea8cSEd Schouten 		if (Fildes == -1)
91372fcea8cSEd Schouten 		{
91496b676e9SEd Schouten         		sprintf(Term_File_name, "%s/%x/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
91596b676e9SEd Schouten         		Fildes = open(Term_File_name, O_RDONLY);
91696b676e9SEd Schouten 		}
91796b676e9SEd Schouten 	}
91896b676e9SEd Schouten 	counter = 0;
91996b676e9SEd Schouten 	while ((Fildes == -1) && (terminfo_path[counter] != NULL))
92096b676e9SEd Schouten 	{
92196b676e9SEd Schouten 		TERM_PATH = terminfo_path[counter];
92272fcea8cSEd Schouten 		Data_Line_len = 23 + strlen(TERM_PATH) + strlen(TERMINAL_TYPE);
92372fcea8cSEd Schouten 		Term_File_name = malloc(Data_Line_len);
92472fcea8cSEd Schouten 		sprintf(Term_File_name, "%s/%c/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
92572fcea8cSEd Schouten 		Fildes = open(Term_File_name, O_RDONLY);
92672fcea8cSEd Schouten 		if (Fildes == -1)
92772fcea8cSEd Schouten 		{
92896b676e9SEd Schouten         		sprintf(Term_File_name, "%s/%x/%s", TERM_PATH, *TERMINAL_TYPE, TERMINAL_TYPE);
92972fcea8cSEd Schouten         		Fildes = open(Term_File_name, O_RDONLY);
93072fcea8cSEd Schouten 		}
93196b676e9SEd Schouten 		counter++;
93272fcea8cSEd Schouten 	}
93372fcea8cSEd Schouten 	if (Fildes == -1)
93472fcea8cSEd Schouten 	{
93572fcea8cSEd Schouten 		free(Term_File_name);
93672fcea8cSEd Schouten 		Term_File_name = NULL;
93772fcea8cSEd Schouten 	}
93872fcea8cSEd Schouten 	else
93972fcea8cSEd Schouten 		TERM_INFO = INFO_PARSE();
94072fcea8cSEd Schouten #else
94172fcea8cSEd Schouten 	/*
94272fcea8cSEd Schouten 	 |	termcap information can be in the TERMCAP env variable, if so
94372fcea8cSEd Schouten 	 |	use that, otherwise check the /etc/termcap file
94472fcea8cSEd Schouten 	 */
94572fcea8cSEd Schouten 	if ((pointer = Term_File_name = getenv("TERMCAP")) != NULL)
94672fcea8cSEd Schouten 	{
94772fcea8cSEd Schouten 		if (*Term_File_name != '/')
94896b676e9SEd Schouten 			Term_File_name = TERMCAP;
94972fcea8cSEd Schouten 	}
95072fcea8cSEd Schouten 	else
95172fcea8cSEd Schouten 	{
95296b676e9SEd Schouten 		Term_File_name = TERMCAP;
95372fcea8cSEd Schouten 	}
95472fcea8cSEd Schouten 	if ((TFP = fopen(Term_File_name, "r")) == NULL)
95572fcea8cSEd Schouten 	{
95696b676e9SEd Schouten 		printf("unable to open %s file \n", TERMCAP);
95772fcea8cSEd Schouten 		exit(0);
95872fcea8cSEd Schouten 	}
95972fcea8cSEd Schouten  	for (value = 0; value < 1024; value++)
96072fcea8cSEd Schouten 		String_table[value] = NULL;
96172fcea8cSEd Schouten 	for (value = 0; value < 128; value++)
96272fcea8cSEd Schouten 		Booleans[value] = 0;
96372fcea8cSEd Schouten 	for (value = 0; value < 128; value++)
96472fcea8cSEd Schouten 		Numbers[value] = 0;
96572fcea8cSEd Schouten 	Data_Line = malloc(512);
96672fcea8cSEd Schouten 	if (pointer && *pointer != '/')
96772fcea8cSEd Schouten 	{
96872fcea8cSEd Schouten 		TERM_data_ptr = pointer;
96972fcea8cSEd Schouten 		CAP_PARSE();
97072fcea8cSEd Schouten 	}
97172fcea8cSEd Schouten 	else
97272fcea8cSEd Schouten 	{
97372fcea8cSEd Schouten 		Find_term();
97472fcea8cSEd Schouten 		CAP_PARSE();
97572fcea8cSEd Schouten 	}
97672fcea8cSEd Schouten #endif
97772fcea8cSEd Schouten 	if (String_table[pc__] == NULL)
97872fcea8cSEd Schouten 		String_table[pc__] = "\0";
97972fcea8cSEd Schouten 	if ((String_table[cm__] == NULL) || (Booleans[hc__]))
98072fcea8cSEd Schouten 	{
98172fcea8cSEd Schouten 		fprintf(stderr, "sorry, unable to use this terminal type for screen editing\n");
98272fcea8cSEd Schouten 		exit(0);
98372fcea8cSEd Schouten 	}
98472fcea8cSEd Schouten 	Key_Get();
98572fcea8cSEd Schouten 	keys_vt100();
98672fcea8cSEd Schouten 	LINES = Numbers[li__];
98772fcea8cSEd Schouten 	COLS = Numbers[co__];
98872fcea8cSEd Schouten 	if ((lines_string = getenv("LINES")) != NULL)
98972fcea8cSEd Schouten 	{
99072fcea8cSEd Schouten 		value = atoi(lines_string);
99172fcea8cSEd Schouten 		if (value > 0)
99272fcea8cSEd Schouten 			LINES = value;
99372fcea8cSEd Schouten 	}
99472fcea8cSEd Schouten 	if ((columns_string = getenv("COLUMNS")) != NULL)
99572fcea8cSEd Schouten 	{
99672fcea8cSEd Schouten 		value = atoi(columns_string);
99772fcea8cSEd Schouten 		if (value > 0)
99872fcea8cSEd Schouten 			COLS = value;
99972fcea8cSEd Schouten 	}
100072fcea8cSEd Schouten #ifdef TIOCGWINSZ
100172fcea8cSEd Schouten 	/*
100272fcea8cSEd Schouten 	 |	get the window size
100372fcea8cSEd Schouten 	 */
100472fcea8cSEd Schouten 	if (ioctl(0, TIOCGWINSZ, &ws) >= 0)
100572fcea8cSEd Schouten 	{
100672fcea8cSEd Schouten 		if (ws.ws_row > 0)
100772fcea8cSEd Schouten 			LINES = ws.ws_row;
100872fcea8cSEd Schouten 		if (ws.ws_col > 0)
100972fcea8cSEd Schouten 			COLS = ws.ws_col;
101072fcea8cSEd Schouten 	}
101172fcea8cSEd Schouten #endif
101272fcea8cSEd Schouten 	virtual_scr = newwin(LINES, COLS, 0, 0);
101372fcea8cSEd Schouten 	stdscr = newwin(LINES, COLS, 0, 0);
101472fcea8cSEd Schouten 	curscr = newwin(LINES, COLS, 0, 0);
101572fcea8cSEd Schouten 	wmove(stdscr, 0, 0);
101672fcea8cSEd Schouten 	werase(stdscr);
101772fcea8cSEd Schouten 	Repaint_screen = TRUE;
101872fcea8cSEd Schouten 	initialized = TRUE;
101972fcea8cSEd Schouten 	virtual_lines = (int *) malloc(LINES * (sizeof(int)));
102072fcea8cSEd Schouten 
102172fcea8cSEd Schouten #ifdef SIGWINCH
102272fcea8cSEd Schouten 	/*
102372fcea8cSEd Schouten 	 |	reset size of windows and LINES and COLS if term window
102472fcea8cSEd Schouten 	 |	changes size
102572fcea8cSEd Schouten 	 */
102672fcea8cSEd Schouten 	signal(SIGWINCH, reinitscr);
102772fcea8cSEd Schouten #endif /* SIGWINCH */
102872fcea8cSEd Schouten 
102972fcea8cSEd Schouten 	/*
103072fcea8cSEd Schouten 	 |	check if scrolling is available
103172fcea8cSEd Schouten 	 */
103272fcea8cSEd Schouten 
103372fcea8cSEd Schouten 	nc_scrolling_ability = ((String_table[al__] != NULL) &&
103472fcea8cSEd Schouten 				(String_table[dl__])) || ((String_table[cs__])
103572fcea8cSEd Schouten 				&& (String_table[sr__]));
103672fcea8cSEd Schouten 
103772fcea8cSEd Schouten }
103872fcea8cSEd Schouten 
103972fcea8cSEd Schouten #ifndef CAP
104072fcea8cSEd Schouten int
Get_int()104172fcea8cSEd Schouten Get_int()		/* get a two-byte integer from the terminfo file */
104272fcea8cSEd Schouten {
104372fcea8cSEd Schouten 	int High_byte;
104472fcea8cSEd Schouten 	int Low_byte;
104572fcea8cSEd Schouten 	int temp;
104672fcea8cSEd Schouten 
104772fcea8cSEd Schouten 	Low_byte = *((unsigned char *) TERM_data_ptr++);
104872fcea8cSEd Schouten 	High_byte = *((unsigned char *) TERM_data_ptr++);
104972fcea8cSEd Schouten 	if (Flip_Bytes)
105072fcea8cSEd Schouten 	{
105172fcea8cSEd Schouten 		temp = Low_byte;
105272fcea8cSEd Schouten 		Low_byte = High_byte;
105372fcea8cSEd Schouten 		High_byte = temp;
105472fcea8cSEd Schouten 	}
105572fcea8cSEd Schouten 	if ((High_byte == 255) && (Low_byte == 255))
105672fcea8cSEd Schouten 		return (-1);
105772fcea8cSEd Schouten 	else
105872fcea8cSEd Schouten 		return(Low_byte + (High_byte * 256));
105972fcea8cSEd Schouten }
106072fcea8cSEd Schouten 
106172fcea8cSEd Schouten int
INFO_PARSE()106272fcea8cSEd Schouten INFO_PARSE()		/* parse off the data in the terminfo data file	*/
106372fcea8cSEd Schouten {
106472fcea8cSEd Schouten 	int offset;
106572fcea8cSEd Schouten 	int magic_number = 0;
106672fcea8cSEd Schouten 	int counter = 0;
106772fcea8cSEd Schouten 	int Num_names = 0;
106872fcea8cSEd Schouten 	int Num_bools = 0;
106972fcea8cSEd Schouten 	int Num_ints = 0;
107072fcea8cSEd Schouten 	int Num_strings = 0;
107172fcea8cSEd Schouten 	int string_table_len = 0;
107272fcea8cSEd Schouten 	char *temp_ptr;
107372fcea8cSEd Schouten 
107472fcea8cSEd Schouten 	TERM_data_ptr = Data_Line = malloc((10240 * (sizeof(char))));
107572fcea8cSEd Schouten 	Data_Line_len = read(Fildes, Data_Line, 10240);
107672fcea8cSEd Schouten 	if ((Data_Line_len >= 10240) || (Data_Line_len < 0))
107772fcea8cSEd Schouten 		return(0);
107872fcea8cSEd Schouten 	/*
107972fcea8cSEd Schouten 	 |	get magic number
108072fcea8cSEd Schouten 	 */
108172fcea8cSEd Schouten 	magic_number = Get_int();
108272fcea8cSEd Schouten 	/*
108372fcea8cSEd Schouten 	 |	if magic number not right, reverse byte order and check again
108472fcea8cSEd Schouten 	 */
108572fcea8cSEd Schouten 	if (magic_number != 282)
108672fcea8cSEd Schouten 	{
108772fcea8cSEd Schouten 		Flip_Bytes = TRUE;
108872fcea8cSEd Schouten 		TERM_data_ptr--;
108972fcea8cSEd Schouten 		TERM_data_ptr--;
109072fcea8cSEd Schouten 		magic_number = Get_int();
109172fcea8cSEd Schouten 		if (magic_number != 282)
109272fcea8cSEd Schouten 			return(0);
109372fcea8cSEd Schouten 	}
109472fcea8cSEd Schouten 	/*
109572fcea8cSEd Schouten 	 |	get the number of each type in the terminfo data file
109672fcea8cSEd Schouten 	 */
109772fcea8cSEd Schouten 	Num_names = Get_int();
109872fcea8cSEd Schouten 	Num_bools = Get_int();
109972fcea8cSEd Schouten 	Num_ints = Get_int();
110072fcea8cSEd Schouten 	Num_strings = Get_int();
110172fcea8cSEd Schouten 	string_table_len = Get_int();
110272fcea8cSEd Schouten 	Strings = malloc(string_table_len);
110372fcea8cSEd Schouten 	while (Num_names > 0)
110472fcea8cSEd Schouten 	{
110572fcea8cSEd Schouten 		TERM_data_ptr++;
110672fcea8cSEd Schouten 		Num_names--;
110772fcea8cSEd Schouten 	}
110872fcea8cSEd Schouten 	counter = 0;
110972fcea8cSEd Schouten 	while (Num_bools)
111072fcea8cSEd Schouten 	{
111172fcea8cSEd Schouten 		Num_bools--;
111272fcea8cSEd Schouten 		Booleans[counter++] = *TERM_data_ptr++;
111372fcea8cSEd Schouten 	}
111496b676e9SEd Schouten 	if ((unsigned long)TERM_data_ptr & 1)	/* force alignment	*/
111572fcea8cSEd Schouten 		TERM_data_ptr++;
111672fcea8cSEd Schouten 	counter = 0;
111772fcea8cSEd Schouten 	while (Num_ints)
111872fcea8cSEd Schouten 	{
111972fcea8cSEd Schouten 		Num_ints--;
112072fcea8cSEd Schouten 		Numbers[counter] = Get_int();
112172fcea8cSEd Schouten 		counter++;
112272fcea8cSEd Schouten 	}
112372fcea8cSEd Schouten 	temp_ptr = TERM_data_ptr + Num_strings + Num_strings;
112472fcea8cSEd Schouten 	memcpy(Strings, temp_ptr, string_table_len);
112572fcea8cSEd Schouten 	counter = bt__;
112672fcea8cSEd Schouten 	while (Num_strings)
112772fcea8cSEd Schouten 	{
112872fcea8cSEd Schouten 		Num_strings--;
112972fcea8cSEd Schouten 		if ((offset=Get_int()) != -1)
113072fcea8cSEd Schouten 		{
113172fcea8cSEd Schouten 			if (String_table[counter] == NULL)
113272fcea8cSEd Schouten 				String_table[counter] = Strings + offset;
113372fcea8cSEd Schouten 		}
113472fcea8cSEd Schouten 		else
113572fcea8cSEd Schouten 			String_table[counter] = NULL;
113672fcea8cSEd Schouten 		counter++;
113772fcea8cSEd Schouten 	}
113872fcea8cSEd Schouten 	close(Fildes);
113972fcea8cSEd Schouten 	free(Data_Line);
114072fcea8cSEd Schouten 	return(TRUE);
114172fcea8cSEd Schouten }
114272fcea8cSEd Schouten #endif		/* ifndef CAP	*/
114372fcea8cSEd Schouten 
114472fcea8cSEd Schouten int
AtoI()114572fcea8cSEd Schouten AtoI()		/* convert ascii text to integers	*/
114672fcea8cSEd Schouten {
114772fcea8cSEd Schouten 	int Temp;
114872fcea8cSEd Schouten 
114972fcea8cSEd Schouten 	Temp = 0;
115072fcea8cSEd Schouten 	while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
115172fcea8cSEd Schouten 	{
115272fcea8cSEd Schouten 		Temp = (Temp * 10) + (*TERM_data_ptr - '0');
115372fcea8cSEd Schouten 		TERM_data_ptr++;
115472fcea8cSEd Schouten 	}
115572fcea8cSEd Schouten 	return(Temp);
115672fcea8cSEd Schouten }
115772fcea8cSEd Schouten 
115872fcea8cSEd Schouten void
Key_Get()115972fcea8cSEd Schouten Key_Get()		/* create linked list with all key sequences obtained from terminal database	*/
116072fcea8cSEd Schouten {
116172fcea8cSEd Schouten 	int Counter;
116272fcea8cSEd Schouten 	int Klen;
116372fcea8cSEd Schouten 	int key_def;
116472fcea8cSEd Schouten 	struct KEY_STACK *Spoint;
116572fcea8cSEd Schouten 
116672fcea8cSEd Schouten 	Max_Key_len = 0;
116772fcea8cSEd Schouten 	Counter = 0;
116872fcea8cSEd Schouten 	key_def = kb__;
116972fcea8cSEd Schouten 	while (key_def <= kf63__)
117072fcea8cSEd Schouten 	{
117172fcea8cSEd Schouten 		if (key_def == ke__)
117272fcea8cSEd Schouten 			key_def = K1__;
117372fcea8cSEd Schouten 		else if (key_def == (K5__ + 1))
117472fcea8cSEd Schouten 			key_def = kcbt__;
117572fcea8cSEd Schouten 		else if (key_def == (kcbt__ + 1))
117672fcea8cSEd Schouten 			key_def = kbeg__;
117772fcea8cSEd Schouten 		else if (key_def == (kUND__ + 1))
117872fcea8cSEd Schouten 			key_def = kf11__;
117972fcea8cSEd Schouten 		if (String_table[key_def] != NULL)
118072fcea8cSEd Schouten 		{
118172fcea8cSEd Schouten 			if (KEY_TOS == NULL)
118272fcea8cSEd Schouten 				Spoint = KEY_TOS = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
118372fcea8cSEd Schouten 			else
118472fcea8cSEd Schouten 			{
118572fcea8cSEd Schouten 				Spoint = KEY_TOS;
118672fcea8cSEd Schouten 				while (Spoint->next != NULL)
118772fcea8cSEd Schouten 					Spoint = Spoint->next;
118872fcea8cSEd Schouten 				Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
118972fcea8cSEd Schouten 				Spoint = Spoint->next;
119072fcea8cSEd Schouten 			}
119172fcea8cSEd Schouten 			Spoint->next = NULL;
119272fcea8cSEd Schouten 			Spoint->element = (struct KEYS *) malloc(sizeof(struct KEYS));
119372fcea8cSEd Schouten 			Spoint->element->string = String_table[key_def];
119472fcea8cSEd Schouten 			Spoint->element->length = strlen(String_table[key_def]);
119572fcea8cSEd Schouten 			Spoint->element->value = Key_vals[Counter];
119672fcea8cSEd Schouten 			Klen = strlen(Spoint->element->string);
119772fcea8cSEd Schouten 			if (Klen > Max_Key_len)
119872fcea8cSEd Schouten 				Max_Key_len = Klen;
119972fcea8cSEd Schouten 			/*
120072fcea8cSEd Schouten 			 |  Some terminal types accept keystrokes of the form
120172fcea8cSEd Schouten 			 |  \E[A and \EOA, substituting '[' for 'O'.  Make a
120272fcea8cSEd Schouten 			 |  duplicate of such key strings (since the
120372fcea8cSEd Schouten 			 |  database will only have one version) so new_curse
120472fcea8cSEd Schouten 			 |  can understand both.
120572fcea8cSEd Schouten 			 */
120672fcea8cSEd Schouten 			if ((Spoint->element->length > 1) &&
120772fcea8cSEd Schouten 			    ((String_table[key_def][1] == '[') ||
120872fcea8cSEd Schouten 			     (String_table[key_def][1] == 'O')))
120972fcea8cSEd Schouten 			{
121072fcea8cSEd Schouten 				Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
121172fcea8cSEd Schouten 				Spoint = Spoint->next;
121272fcea8cSEd Schouten 				Spoint->next = NULL;
121372fcea8cSEd Schouten 				Spoint->element = (struct KEYS *) malloc(sizeof(struct KEYS));
121472fcea8cSEd Schouten 				Spoint->element->length = strlen(String_table[key_def]);
121572fcea8cSEd Schouten 				Spoint->element->string = malloc(Spoint->element->length + 1);
121672fcea8cSEd Schouten 				strcpy(Spoint->element->string, String_table[key_def]);
121772fcea8cSEd Schouten 				Spoint->element->value = Key_vals[Counter];
121872fcea8cSEd Schouten 				Klen = strlen(Spoint->element->string);
121972fcea8cSEd Schouten 				if (Klen > Max_Key_len)
122072fcea8cSEd Schouten 					Max_Key_len = Klen;
122172fcea8cSEd Schouten 
122272fcea8cSEd Schouten 				if (String_table[key_def][1] == '[')
122372fcea8cSEd Schouten 					Spoint->element->string[1] = 'O';
122472fcea8cSEd Schouten 				else
122572fcea8cSEd Schouten 					Spoint->element->string[1] = '[';
122672fcea8cSEd Schouten 			}
122772fcea8cSEd Schouten 		}
122872fcea8cSEd Schouten 		key_def++;
122972fcea8cSEd Schouten 		Counter++;
123072fcea8cSEd Schouten 	}
123172fcea8cSEd Schouten }
123272fcea8cSEd Schouten 
123372fcea8cSEd Schouten /*
123472fcea8cSEd Schouten  |	insert information about keys for a vt100 terminal
123572fcea8cSEd Schouten  */
123672fcea8cSEd Schouten 
123772fcea8cSEd Schouten void
keys_vt100()123872fcea8cSEd Schouten keys_vt100()
123972fcea8cSEd Schouten {
124072fcea8cSEd Schouten 	int counter;
124172fcea8cSEd Schouten 	int Klen;
124272fcea8cSEd Schouten 	struct KEY_STACK *Spoint;
124372fcea8cSEd Schouten 
124472fcea8cSEd Schouten 	Spoint = KEY_TOS;
124572fcea8cSEd Schouten 	while (Spoint->next != NULL)
124672fcea8cSEd Schouten 		Spoint = Spoint->next;
124772fcea8cSEd Schouten 	for (counter = 0; vt100[counter].length != 0; counter++)
124872fcea8cSEd Schouten 	{
124972fcea8cSEd Schouten 		Spoint->next = (struct KEY_STACK *) malloc(sizeof(struct KEY_STACK));
125072fcea8cSEd Schouten 		Spoint = Spoint->next;
125172fcea8cSEd Schouten 		Spoint->next = NULL;
125272fcea8cSEd Schouten 		Spoint->element = &vt100[counter];
125372fcea8cSEd Schouten 		Klen = strlen(Spoint->element->string);
125472fcea8cSEd Schouten 		if (Klen > Max_Key_len)
125572fcea8cSEd Schouten 			Max_Key_len = Klen;
125672fcea8cSEd Schouten 	}
125772fcea8cSEd Schouten }
125872fcea8cSEd Schouten 
125972fcea8cSEd Schouten #ifdef CAP
126072fcea8cSEd Schouten char *
String_Get(param)126172fcea8cSEd Schouten String_Get(param)		/* read the string */
126272fcea8cSEd Schouten char *param;
126372fcea8cSEd Schouten {
126472fcea8cSEd Schouten 	char *String;
126572fcea8cSEd Schouten 	char *Temp;
126672fcea8cSEd Schouten 	int Counter;
126772fcea8cSEd Schouten 
126872fcea8cSEd Schouten 	if (param == NULL)
126972fcea8cSEd Schouten 	{
127072fcea8cSEd Schouten 		while (*TERM_data_ptr != '=')
127172fcea8cSEd Schouten 			TERM_data_ptr++;
127272fcea8cSEd Schouten 		Temp = ++TERM_data_ptr;
127372fcea8cSEd Schouten 		Counter = 1;
127472fcea8cSEd Schouten 		while ((*Temp != ':') && (*Temp != (char)NULL))
127572fcea8cSEd Schouten 		{
127672fcea8cSEd Schouten 			Counter++;
127772fcea8cSEd Schouten 			Temp++;
127872fcea8cSEd Schouten 		}
127972fcea8cSEd Schouten 		if (Counter == 1)	/* no data */
128072fcea8cSEd Schouten 			return(NULL);
128172fcea8cSEd Schouten 		String = Temp = malloc(Counter);
128272fcea8cSEd Schouten 		while ((*TERM_data_ptr != ':') && (*TERM_data_ptr != (char)NULL))
128372fcea8cSEd Schouten 		{
128472fcea8cSEd Schouten 			if (*TERM_data_ptr == '\\')
128572fcea8cSEd Schouten 			{
128672fcea8cSEd Schouten 				TERM_data_ptr++;
128772fcea8cSEd Schouten 				if (*TERM_data_ptr == 'n')
128872fcea8cSEd Schouten 					*Temp = '\n';
128972fcea8cSEd Schouten 				else if (*TERM_data_ptr == 't')
129072fcea8cSEd Schouten 					*Temp = '\t';
129172fcea8cSEd Schouten 				else if (*TERM_data_ptr == 'b')
129272fcea8cSEd Schouten 					*Temp = '\b';
129372fcea8cSEd Schouten 				else if (*TERM_data_ptr == 'r')
129472fcea8cSEd Schouten 					*Temp = '\r';
129572fcea8cSEd Schouten 				else if (*TERM_data_ptr == 'f')
129672fcea8cSEd Schouten 					*Temp = '\f';
129772fcea8cSEd Schouten 				else if ((*TERM_data_ptr == 'e') || (*TERM_data_ptr == 'E'))
129872fcea8cSEd Schouten 					*Temp = '\033';		/* escape */
129972fcea8cSEd Schouten 				else if (*TERM_data_ptr == '\\')
130072fcea8cSEd Schouten 					*Temp = '\\';
130172fcea8cSEd Schouten 				else if (*TERM_data_ptr == '\'')
130272fcea8cSEd Schouten 					*Temp = '\'';
130372fcea8cSEd Schouten 				else if ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
130472fcea8cSEd Schouten 				{
130572fcea8cSEd Schouten 					Counter = 0;
130672fcea8cSEd Schouten 					while ((*TERM_data_ptr >= '0') && (*TERM_data_ptr <= '9'))
130772fcea8cSEd Schouten 					{
130872fcea8cSEd Schouten 						Counter = (8 * Counter) + (*TERM_data_ptr - '0');
130972fcea8cSEd Schouten 						TERM_data_ptr++;  /* ? */
131072fcea8cSEd Schouten 					}
131172fcea8cSEd Schouten 					*Temp = Counter;
131272fcea8cSEd Schouten 					TERM_data_ptr--;
131372fcea8cSEd Schouten 				}
131472fcea8cSEd Schouten 				TERM_data_ptr++;
131572fcea8cSEd Schouten 				Temp++;
131672fcea8cSEd Schouten 			}
131772fcea8cSEd Schouten 			else if (*TERM_data_ptr == '^')
131872fcea8cSEd Schouten 			{
131972fcea8cSEd Schouten 				TERM_data_ptr++;
132072fcea8cSEd Schouten 				if ((*TERM_data_ptr >= '@') && (*TERM_data_ptr <= '_'))
132172fcea8cSEd Schouten 					*Temp = *TERM_data_ptr - '@';
132272fcea8cSEd Schouten 				else if (*TERM_data_ptr == '?')
132372fcea8cSEd Schouten 					*Temp = 127;
132472fcea8cSEd Schouten 				TERM_data_ptr++;
132572fcea8cSEd Schouten 				Temp++;
132672fcea8cSEd Schouten 			}
132772fcea8cSEd Schouten 			else
132872fcea8cSEd Schouten 				*Temp++ = *TERM_data_ptr++;
132972fcea8cSEd Schouten 		}
133072fcea8cSEd Schouten 		*Temp = (char)NULL;
133172fcea8cSEd Schouten 		param = String;
133272fcea8cSEd Schouten 	}
133372fcea8cSEd Schouten 	else
133472fcea8cSEd Schouten 	{
133572fcea8cSEd Schouten 		while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != ':'))
133672fcea8cSEd Schouten 			TERM_data_ptr++;
133772fcea8cSEd Schouten 	}
133872fcea8cSEd Schouten 	return(param);
133972fcea8cSEd Schouten }
134072fcea8cSEd Schouten 
134172fcea8cSEd Schouten int
tc_Get_int(param)134272fcea8cSEd Schouten tc_Get_int(param)		/* read the integer			*/
134372fcea8cSEd Schouten int param;
134472fcea8cSEd Schouten {
134572fcea8cSEd Schouten 	int Itemp;
134672fcea8cSEd Schouten 
134772fcea8cSEd Schouten 	if (param == 0)
134872fcea8cSEd Schouten 	{
134972fcea8cSEd Schouten 		while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != '#'))
135072fcea8cSEd Schouten 			TERM_data_ptr++;
135172fcea8cSEd Schouten 		TERM_data_ptr++;
135272fcea8cSEd Schouten 		Itemp = AtoI();
135372fcea8cSEd Schouten 		param = Itemp;
135472fcea8cSEd Schouten 	}
135572fcea8cSEd Schouten 	else
135672fcea8cSEd Schouten 	{
135772fcea8cSEd Schouten 		while (*TERM_data_ptr != ':')
135872fcea8cSEd Schouten 			TERM_data_ptr++;
135972fcea8cSEd Schouten 	}
136072fcea8cSEd Schouten 	return(param);
136172fcea8cSEd Schouten }
136272fcea8cSEd Schouten 
136372fcea8cSEd Schouten void
Find_term()136472fcea8cSEd Schouten Find_term()		/* find terminal description in termcap file	*/
136572fcea8cSEd Schouten {
136672fcea8cSEd Schouten 	char *Name;
136772fcea8cSEd Schouten 	char *Ftemp;
136872fcea8cSEd Schouten 
136996b676e9SEd Schouten 	Ftemp = Name = malloc(strlen(TERMINAL_TYPE) + 2);
137072fcea8cSEd Schouten 	strcpy(Name, TERMINAL_TYPE);
137172fcea8cSEd Schouten 	while (*Ftemp != (char)NULL)
137272fcea8cSEd Schouten 		Ftemp++;
137372fcea8cSEd Schouten 	*Ftemp++ = '|';
137472fcea8cSEd Schouten 	*Ftemp = (char)NULL;
137572fcea8cSEd Schouten 	CFOUND = FALSE;
137672fcea8cSEd Schouten 	Data_Line_len = strlen(TERMINAL_TYPE) + 1;
137772fcea8cSEd Schouten 	while ((!CFOUND) && ((TERM_data_ptr=fgets(Data_Line, 512, TFP)) != NULL))
137872fcea8cSEd Schouten 	{
137972fcea8cSEd Schouten 		if ((*TERM_data_ptr != ' ') && (*TERM_data_ptr != '\t') && (*TERM_data_ptr != '#'))
138072fcea8cSEd Schouten 		{
138172fcea8cSEd Schouten 			while ((!CFOUND) && (*TERM_data_ptr != (char)NULL))
138272fcea8cSEd Schouten 			{
138372fcea8cSEd Schouten 				CFOUND = !strncmp(TERM_data_ptr, Name, Data_Line_len);
138472fcea8cSEd Schouten 				while ((*TERM_data_ptr != (char)NULL) && (*TERM_data_ptr != '|') && (*TERM_data_ptr != '#') && (*TERM_data_ptr != ':'))
138572fcea8cSEd Schouten 					TERM_data_ptr++;
138672fcea8cSEd Schouten 				if (*TERM_data_ptr == '|')
138772fcea8cSEd Schouten 					TERM_data_ptr++;
138872fcea8cSEd Schouten 				else if (!CFOUND)
138972fcea8cSEd Schouten 					*TERM_data_ptr = (char)NULL;
139072fcea8cSEd Schouten 			}
139172fcea8cSEd Schouten 		}
139272fcea8cSEd Schouten 	}
139372fcea8cSEd Schouten 	if (!CFOUND)
139472fcea8cSEd Schouten 	{
139572fcea8cSEd Schouten 		printf("terminal type %s not found\n", TERMINAL_TYPE);
139672fcea8cSEd Schouten 		exit(0);
139772fcea8cSEd Schouten 	}
139872fcea8cSEd Schouten }
139972fcea8cSEd Schouten 
140072fcea8cSEd Schouten void
CAP_PARSE()140172fcea8cSEd Schouten CAP_PARSE()		/* parse off the data in the termcap data file	*/
140272fcea8cSEd Schouten {
140372fcea8cSEd Schouten 	int offset;
140472fcea8cSEd Schouten 	int found;
140572fcea8cSEd Schouten 
140672fcea8cSEd Schouten 	do
140772fcea8cSEd Schouten 	{
140872fcea8cSEd Schouten 		while (*TERM_data_ptr != (char)NULL)
140972fcea8cSEd Schouten 		{
141072fcea8cSEd Schouten 			for (found = FALSE, offset = 0; (!found) && (offset < 26); offset++)
141172fcea8cSEd Schouten 			{
141272fcea8cSEd Schouten 				if (!strncmp(TERM_data_ptr, Boolean_names[offset], 2))
141372fcea8cSEd Schouten 				{
141472fcea8cSEd Schouten 					found = TRUE;
141572fcea8cSEd Schouten 					Booleans[offset] = TRUE;
141672fcea8cSEd Schouten 				}
141772fcea8cSEd Schouten 			}
141872fcea8cSEd Schouten 			if (!found)
141972fcea8cSEd Schouten 			{
142072fcea8cSEd Schouten 				for (found = FALSE, offset = 0; (!found) && (offset < lw__); offset++)
142172fcea8cSEd Schouten 				{
142272fcea8cSEd Schouten 					if (!strncmp(TERM_data_ptr, Number_names[offset], 3))
142372fcea8cSEd Schouten 					{
142472fcea8cSEd Schouten 						found = TRUE;
142572fcea8cSEd Schouten 						Numbers[offset] = tc_Get_int(Numbers[offset]);
142672fcea8cSEd Schouten 					}
142772fcea8cSEd Schouten 				}
142872fcea8cSEd Schouten 			}
142972fcea8cSEd Schouten 			if (!found)
143072fcea8cSEd Schouten 			{
143172fcea8cSEd Schouten 				for (found = FALSE, offset = 0; (!found) && (offset < smgr__); offset++)
143272fcea8cSEd Schouten 				{
143372fcea8cSEd Schouten 					if (!strncmp(TERM_data_ptr, String_names[offset], 3))
143472fcea8cSEd Schouten 					{
143572fcea8cSEd Schouten 						found = TRUE;
143672fcea8cSEd Schouten 						String_table[offset] = String_Get(String_table[offset]);
143772fcea8cSEd Schouten 					}
143872fcea8cSEd Schouten 				}
143972fcea8cSEd Schouten 			}
144072fcea8cSEd Schouten 
144172fcea8cSEd Schouten 			if (!strncmp(TERM_data_ptr, "tc=", 3))
144272fcea8cSEd Schouten 				tc_ = String_Get(NULL);
144372fcea8cSEd Schouten 			while ((*TERM_data_ptr != ':') && (*TERM_data_ptr != (char)NULL))
144472fcea8cSEd Schouten 				TERM_data_ptr++;
144572fcea8cSEd Schouten 			if (*TERM_data_ptr == ':')
144672fcea8cSEd Schouten 				TERM_data_ptr++;
144772fcea8cSEd Schouten 		}
144872fcea8cSEd Schouten 	} while (((TERM_data_ptr = fgets(Data_Line, 512, TFP)) != NULL) && ((*TERM_data_ptr == ' ') || (*TERM_data_ptr == '\t')));
144972fcea8cSEd Schouten 	if (tc_ != NULL)
145072fcea8cSEd Schouten 	{
145172fcea8cSEd Schouten 		TERMINAL_TYPE = tc_;
145272fcea8cSEd Schouten 		rewind(TFP);
145372fcea8cSEd Schouten 		Find_term();
145472fcea8cSEd Schouten 		tc_ = NULL;
145572fcea8cSEd Schouten 		CAP_PARSE();
145672fcea8cSEd Schouten 	}
145772fcea8cSEd Schouten 	else
145872fcea8cSEd Schouten 		fclose(TFP);
145972fcea8cSEd Schouten }
146072fcea8cSEd Schouten #endif		/* ifdef CAP	*/
146172fcea8cSEd Schouten 
146272fcea8cSEd Schouten struct _line *
Screenalloc(columns)146372fcea8cSEd Schouten Screenalloc(columns)
146472fcea8cSEd Schouten int columns;
146572fcea8cSEd Schouten {
146672fcea8cSEd Schouten 	int i;
146772fcea8cSEd Schouten 	struct _line *tmp;
146872fcea8cSEd Schouten 
146972fcea8cSEd Schouten 	tmp = (struct _line *) malloc(sizeof (struct _line));
147072fcea8cSEd Schouten 	tmp->row = malloc(columns + 1);
147172fcea8cSEd Schouten 	tmp->attributes = malloc(columns + 1);
147272fcea8cSEd Schouten 	tmp->prev_screen = NULL;
147372fcea8cSEd Schouten 	tmp->next_screen = NULL;
147472fcea8cSEd Schouten 	for (i = 0; i < columns; i++)
147572fcea8cSEd Schouten 	{
147672fcea8cSEd Schouten 		tmp->row[i] = ' ';
147796b676e9SEd Schouten 		tmp->attributes[i] = '\0';
147872fcea8cSEd Schouten 	}
147972fcea8cSEd Schouten 	tmp->scroll = tmp->changed = FALSE;
148096b676e9SEd Schouten 	tmp->row[0] = '\0';
148196b676e9SEd Schouten 	tmp->attributes[0] = '\0';
148296b676e9SEd Schouten 	tmp->row[columns] = '\0';
148396b676e9SEd Schouten 	tmp->attributes[columns] = '\0';
148472fcea8cSEd Schouten 	tmp->last_char = 0;
148572fcea8cSEd Schouten 	return(tmp);
148672fcea8cSEd Schouten }
148772fcea8cSEd Schouten 
newwin(lines,cols,start_l,start_c)148872fcea8cSEd Schouten WINDOW *newwin(lines, cols, start_l, start_c)
148972fcea8cSEd Schouten int lines, cols;	/* number of lines and columns to be in window	*/
149072fcea8cSEd Schouten int start_l, start_c;	/* starting line and column to be inwindow	*/
149172fcea8cSEd Schouten {
149272fcea8cSEd Schouten 	WINDOW *Ntemp;
149372fcea8cSEd Schouten 	struct _line *temp_screen;
149472fcea8cSEd Schouten 	int i;
149572fcea8cSEd Schouten 
149672fcea8cSEd Schouten 	Ntemp = (WINDOW *) malloc(sizeof(WINDOW));
149772fcea8cSEd Schouten 	Ntemp->SR = start_l;
149872fcea8cSEd Schouten 	Ntemp->SC = start_c;
149972fcea8cSEd Schouten 	Ntemp->Num_lines = lines;
150072fcea8cSEd Schouten 	Ntemp->Num_cols = cols;
150172fcea8cSEd Schouten 	Ntemp->LX = 0;
150272fcea8cSEd Schouten 	Ntemp->LY = 0;
150372fcea8cSEd Schouten 	Ntemp->scroll_down = Ntemp->scroll_up = 0;
150472fcea8cSEd Schouten 	Ntemp->SCROLL_CLEAR = FALSE;
150572fcea8cSEd Schouten 	Ntemp->Attrib = FALSE;
150672fcea8cSEd Schouten 	Ntemp->first_line = temp_screen = Screenalloc(cols);
150772fcea8cSEd Schouten 	Ntemp->first_line->number = 0;
150872fcea8cSEd Schouten 	Ntemp->line_array = (struct _line **) malloc(LINES * sizeof(struct _line *));
150972fcea8cSEd Schouten 
151072fcea8cSEd Schouten 	Ntemp->line_array[0] = Ntemp->first_line;
151172fcea8cSEd Schouten 
151272fcea8cSEd Schouten 	for (i = 1; i < lines; i++)
151372fcea8cSEd Schouten 	{
151472fcea8cSEd Schouten 		temp_screen->next_screen = Screenalloc(cols);
151572fcea8cSEd Schouten 		temp_screen->next_screen->number = i;
151672fcea8cSEd Schouten 		temp_screen->next_screen->prev_screen = temp_screen;
151772fcea8cSEd Schouten 		temp_screen = temp_screen->next_screen;
151872fcea8cSEd Schouten 		Ntemp->line_array[i] = temp_screen;
151972fcea8cSEd Schouten 	}
152072fcea8cSEd Schouten 	Ntemp->first_line->prev_screen = NULL;
152172fcea8cSEd Schouten 	temp_screen->next_screen = NULL;
152272fcea8cSEd Schouten 	return(Ntemp);
152372fcea8cSEd Schouten }
152472fcea8cSEd Schouten 
152572fcea8cSEd Schouten #ifdef CAP
152672fcea8cSEd Schouten void
Cap_Out(string,p_list,place)152772fcea8cSEd Schouten Cap_Out(string, p_list, place)	/* interpret the output string if necessary */
152872fcea8cSEd Schouten char *string;
152972fcea8cSEd Schouten int p_list[];			/* stack of values	*/
153072fcea8cSEd Schouten int place;			/* place keeper of top of stack	*/
153172fcea8cSEd Schouten {
153272fcea8cSEd Schouten 	char *Otemp;		/* temporary string pointer to parse output */
153372fcea8cSEd Schouten 	int delay;
153472fcea8cSEd Schouten 	int p1, p2, temp;
153572fcea8cSEd Schouten 	float chars;
153672fcea8cSEd Schouten 
153772fcea8cSEd Schouten 	if (string == NULL)
153872fcea8cSEd Schouten 		return;
153972fcea8cSEd Schouten 
154072fcea8cSEd Schouten 	if (p_list != NULL)
154172fcea8cSEd Schouten 	{
154272fcea8cSEd Schouten 		p1 = p_list[--place];
154372fcea8cSEd Schouten 		p2 = p_list[--place];
154472fcea8cSEd Schouten 	}
154572fcea8cSEd Schouten 	delay = 0;
154672fcea8cSEd Schouten 	Otemp = string;
154772fcea8cSEd Schouten 	if ((*Otemp >= '0') && (*Otemp <= '9'))
154872fcea8cSEd Schouten 	{
154972fcea8cSEd Schouten 		delay = atoi(Otemp);
155072fcea8cSEd Schouten 		while ((*Otemp >= '0') && (*Otemp <= '9'))
155172fcea8cSEd Schouten 			Otemp++;
155272fcea8cSEd Schouten 		if (*Otemp == '*')
155372fcea8cSEd Schouten 			Otemp++;
155472fcea8cSEd Schouten 	}
155572fcea8cSEd Schouten 	while (*Otemp != (char)NULL)
155672fcea8cSEd Schouten 	{
155772fcea8cSEd Schouten 		if (*Otemp == '%')
155872fcea8cSEd Schouten 		{
155972fcea8cSEd Schouten 			Otemp++;
156072fcea8cSEd Schouten 			if ((*Otemp == 'd') || (*Otemp == '2') || (*Otemp == '3') || (*Otemp == '.') || (*Otemp == '+'))
156172fcea8cSEd Schouten 			{
156272fcea8cSEd Schouten 				if (*Otemp == 'd')
156372fcea8cSEd Schouten 				 	printf("%d", p1);
156472fcea8cSEd Schouten 				else if (*Otemp == '2')
156572fcea8cSEd Schouten 					printf("%02d", p1);
156672fcea8cSEd Schouten 				else if (*Otemp == '3')
156772fcea8cSEd Schouten 					printf("%03d", p1);
156872fcea8cSEd Schouten 				else if (*Otemp == '+')
156972fcea8cSEd Schouten 				{
157072fcea8cSEd Schouten 					Otemp++;
157172fcea8cSEd Schouten 					p1 += *Otemp;
157272fcea8cSEd Schouten 					putchar(p1);
157372fcea8cSEd Schouten 				}
157472fcea8cSEd Schouten 				else if (*Otemp == '.')
157572fcea8cSEd Schouten 					putchar(p1);
157672fcea8cSEd Schouten 				p1 = p2;
157772fcea8cSEd Schouten 				p2 = 0;
157872fcea8cSEd Schouten 			}
157972fcea8cSEd Schouten 			else if (*Otemp == '>')
158072fcea8cSEd Schouten 			{
158172fcea8cSEd Schouten 				Otemp++;
158272fcea8cSEd Schouten 				if (p1 > *Otemp)
158372fcea8cSEd Schouten 				{
158472fcea8cSEd Schouten 					Otemp++;
158572fcea8cSEd Schouten 					p1 += *Otemp;
158672fcea8cSEd Schouten 				}
158772fcea8cSEd Schouten 				else
158872fcea8cSEd Schouten 					Otemp++;
158972fcea8cSEd Schouten 			}
159072fcea8cSEd Schouten 			else if (*Otemp == 'r')
159172fcea8cSEd Schouten 			{
159272fcea8cSEd Schouten 				temp = p1;
159372fcea8cSEd Schouten 				p1 = p2;
159472fcea8cSEd Schouten 				p2 = temp;
159572fcea8cSEd Schouten 			}
159672fcea8cSEd Schouten 			else if (*Otemp == 'i')
159772fcea8cSEd Schouten 			{
159872fcea8cSEd Schouten 				p1++;
159972fcea8cSEd Schouten 				p2++;
160072fcea8cSEd Schouten 			}
160172fcea8cSEd Schouten 			else if (*Otemp == '%')
160272fcea8cSEd Schouten 				putchar(*Otemp);
160372fcea8cSEd Schouten 			else if (*Otemp == 'n')
160472fcea8cSEd Schouten 			{
160572fcea8cSEd Schouten 				p1 ^= 0140;
160672fcea8cSEd Schouten 				p2 ^= 0140;
160772fcea8cSEd Schouten 			}
160872fcea8cSEd Schouten 			else if (*Otemp == 'B')
160972fcea8cSEd Schouten 			{
161072fcea8cSEd Schouten 				p1 = (16 * (p1/10)) + (p1 % 10);
161172fcea8cSEd Schouten 				p2 = (16 * (p2/10)) + (p2 % 10);
161272fcea8cSEd Schouten 			}
161372fcea8cSEd Schouten 			else if (*Otemp == 'D')
161472fcea8cSEd Schouten 			{
161572fcea8cSEd Schouten 				p1 = (p1 - 2 * (p1 % 16));
161672fcea8cSEd Schouten 				p2 = (p2 - 2 * (p2 % 16));
161772fcea8cSEd Schouten 			}
161872fcea8cSEd Schouten 		}
161972fcea8cSEd Schouten 		else
162072fcea8cSEd Schouten 			putchar (*Otemp);
162172fcea8cSEd Schouten 		Otemp++;
162272fcea8cSEd Schouten 	}
162372fcea8cSEd Schouten 	if (delay != 0)
162472fcea8cSEd Schouten 	{
162572fcea8cSEd Schouten 		chars = delay * chars_per_millisecond;
162672fcea8cSEd Schouten 		delay = chars;
162772fcea8cSEd Schouten 		if ((chars - delay) > 0.0)
162872fcea8cSEd Schouten 			delay++;
162972fcea8cSEd Schouten 		for (; delay > 0; delay--)
163072fcea8cSEd Schouten 			putchar(*String_table[pc__]);
163172fcea8cSEd Schouten 	}
163272fcea8cSEd Schouten 	fflush(stdout);
163372fcea8cSEd Schouten }
163472fcea8cSEd Schouten 
163572fcea8cSEd Schouten #else
163672fcea8cSEd Schouten 
163772fcea8cSEd Schouten 	char *Otemp;		/* temporary string pointer to parse output */
163872fcea8cSEd Schouten 	float chars;
163972fcea8cSEd Schouten 	int p[10];
164072fcea8cSEd Schouten 	int variable[27];
164172fcea8cSEd Schouten 
164272fcea8cSEd Schouten int
Operation(Temp_Stack,place)164372fcea8cSEd Schouten Operation(Temp_Stack, place)	/* handle conditional operations	*/
164472fcea8cSEd Schouten int Temp_Stack[];
164572fcea8cSEd Schouten int place;
164672fcea8cSEd Schouten {
164772fcea8cSEd Schouten 	int temp;
164872fcea8cSEd Schouten 
164972fcea8cSEd Schouten 	if (*Otemp == 'd')
165072fcea8cSEd Schouten 	{
165172fcea8cSEd Schouten 		Otemp++;
165272fcea8cSEd Schouten 		temp = Temp_Stack[--place];
165372fcea8cSEd Schouten 	 	printf("%d", temp);
165472fcea8cSEd Schouten 	}
165572fcea8cSEd Schouten 	else if (!strncmp(Otemp, "2d", 2))
165672fcea8cSEd Schouten 	{
165772fcea8cSEd Schouten 		temp = Temp_Stack[--place];
165872fcea8cSEd Schouten 		printf("%2d", temp);
165972fcea8cSEd Schouten 		Otemp++;
166072fcea8cSEd Schouten 		Otemp++;
166172fcea8cSEd Schouten 	}
166272fcea8cSEd Schouten 	else if (!strncmp(Otemp, "3d", 2))
166372fcea8cSEd Schouten 	{
166472fcea8cSEd Schouten 		temp = Temp_Stack[--place];
166572fcea8cSEd Schouten 		printf("%0d", temp);
166672fcea8cSEd Schouten 		Otemp++;
166772fcea8cSEd Schouten 		Otemp++;
166872fcea8cSEd Schouten 	}
166972fcea8cSEd Schouten 	else if (!strncmp(Otemp, "02d", 3))
167072fcea8cSEd Schouten 	{
167172fcea8cSEd Schouten 		temp = Temp_Stack[--place];
167272fcea8cSEd Schouten 		printf("%02d", temp);
167372fcea8cSEd Schouten 		Otemp++;
167472fcea8cSEd Schouten 		Otemp++;
167572fcea8cSEd Schouten 		Otemp++;
167672fcea8cSEd Schouten 	}
167772fcea8cSEd Schouten 	else if (!strncmp(Otemp, "03d", 3))
167872fcea8cSEd Schouten 	{
167972fcea8cSEd Schouten 		temp = Temp_Stack[--place];
168072fcea8cSEd Schouten 		printf("%03d", temp);
168172fcea8cSEd Schouten 		Otemp++;
168272fcea8cSEd Schouten 		Otemp++;
168372fcea8cSEd Schouten 		Otemp++;
168472fcea8cSEd Schouten 	}
168572fcea8cSEd Schouten 	else if (*Otemp == '+')
168672fcea8cSEd Schouten 	{
168772fcea8cSEd Schouten 		Otemp++;
168872fcea8cSEd Schouten 		temp = Temp_Stack[--place];
168972fcea8cSEd Schouten 		temp += Temp_Stack[--place];
169072fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
169172fcea8cSEd Schouten 	}
169272fcea8cSEd Schouten 	else if (*Otemp == '-')
169372fcea8cSEd Schouten 	{
169472fcea8cSEd Schouten 		Otemp++;
169572fcea8cSEd Schouten 		temp = Temp_Stack[--place];
169672fcea8cSEd Schouten 		temp -= Temp_Stack[--place];
169772fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
169872fcea8cSEd Schouten 	}
169972fcea8cSEd Schouten 	else if (*Otemp == '*')
170072fcea8cSEd Schouten 	{
170172fcea8cSEd Schouten 		Otemp++;
170272fcea8cSEd Schouten 		temp = Temp_Stack[--place];
170372fcea8cSEd Schouten 		temp *= Temp_Stack[--place];
170472fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
170572fcea8cSEd Schouten 	}
170672fcea8cSEd Schouten 	else if (*Otemp == '/')
170772fcea8cSEd Schouten 	{
170872fcea8cSEd Schouten 		Otemp++;
170972fcea8cSEd Schouten 		temp = Temp_Stack[--place];
171072fcea8cSEd Schouten 		temp /= Temp_Stack[--place];
171172fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
171272fcea8cSEd Schouten 	}
171372fcea8cSEd Schouten 	else if (*Otemp == 'm')
171472fcea8cSEd Schouten 	{
171572fcea8cSEd Schouten 		Otemp++;
171672fcea8cSEd Schouten 		temp = Temp_Stack[--place];
171772fcea8cSEd Schouten 		temp %= Temp_Stack[--place];
171872fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
171972fcea8cSEd Schouten 	}
172072fcea8cSEd Schouten 	else if (*Otemp == '&')
172172fcea8cSEd Schouten 	{
172272fcea8cSEd Schouten 		Otemp++;
172372fcea8cSEd Schouten 		temp = Temp_Stack[--place];
172472fcea8cSEd Schouten 		temp &= Temp_Stack[--place];
172572fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
172672fcea8cSEd Schouten 	}
172772fcea8cSEd Schouten 	else if (*Otemp == '|')
172872fcea8cSEd Schouten 	{
172972fcea8cSEd Schouten 		Otemp++;
173072fcea8cSEd Schouten 		temp = Temp_Stack[--place];
173172fcea8cSEd Schouten 		temp |= Temp_Stack[--place];
173272fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
173372fcea8cSEd Schouten 	}
173472fcea8cSEd Schouten 	else if (*Otemp == '^')
173572fcea8cSEd Schouten 	{
173672fcea8cSEd Schouten 		Otemp++;
173772fcea8cSEd Schouten 		temp = Temp_Stack[--place];
173872fcea8cSEd Schouten 		temp ^= Temp_Stack[--place];
173972fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
174072fcea8cSEd Schouten 	}
174172fcea8cSEd Schouten 	else if (*Otemp == '=')
174272fcea8cSEd Schouten 	{
174372fcea8cSEd Schouten 		Otemp++;
174472fcea8cSEd Schouten 		temp = Temp_Stack[--place];
174572fcea8cSEd Schouten 		temp = (temp == Temp_Stack[--place]);
174672fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
174772fcea8cSEd Schouten 	}
174872fcea8cSEd Schouten 	else if (*Otemp == '>')
174972fcea8cSEd Schouten 	{
175072fcea8cSEd Schouten 		Otemp++;
175172fcea8cSEd Schouten 		temp = Temp_Stack[--place];
175272fcea8cSEd Schouten 		temp = temp > Temp_Stack[--place];
175372fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
175472fcea8cSEd Schouten 	}
175572fcea8cSEd Schouten 	else if (*Otemp == '<')
175672fcea8cSEd Schouten 	{
175772fcea8cSEd Schouten 		Otemp++;
175872fcea8cSEd Schouten 		temp = Temp_Stack[--place];
175972fcea8cSEd Schouten 		temp = temp < Temp_Stack[--place];
176072fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
176172fcea8cSEd Schouten 	}
176272fcea8cSEd Schouten 	else if (*Otemp == 'c')
176372fcea8cSEd Schouten 	{
176472fcea8cSEd Schouten 		Otemp++;
176572fcea8cSEd Schouten 		putchar(Temp_Stack[--place]);
176672fcea8cSEd Schouten 	}
176772fcea8cSEd Schouten 	else if (*Otemp == 'i')
176872fcea8cSEd Schouten 	{
176972fcea8cSEd Schouten 		Otemp++;
177072fcea8cSEd Schouten 		p[1]++;
177172fcea8cSEd Schouten 		p[2]++;
177272fcea8cSEd Schouten 	}
177372fcea8cSEd Schouten 	else if (*Otemp == '%')
177472fcea8cSEd Schouten 	{
177572fcea8cSEd Schouten 		putchar(*Otemp);
177672fcea8cSEd Schouten 		Otemp++;
177772fcea8cSEd Schouten 	}
177872fcea8cSEd Schouten 	else if (*Otemp == '!')
177972fcea8cSEd Schouten 	{
178072fcea8cSEd Schouten 		temp = ! Temp_Stack[--place];
178172fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
178272fcea8cSEd Schouten 		Otemp++;
178372fcea8cSEd Schouten 	}
178472fcea8cSEd Schouten 	else if (*Otemp == '~')
178572fcea8cSEd Schouten 	{
178672fcea8cSEd Schouten 		temp = ~Temp_Stack[--place];
178772fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
178872fcea8cSEd Schouten 		Otemp++;
178972fcea8cSEd Schouten 	}
179072fcea8cSEd Schouten 	else if (*Otemp == 'p')
179172fcea8cSEd Schouten 	{
179272fcea8cSEd Schouten 		Otemp++;
179372fcea8cSEd Schouten 		Temp_Stack[place++] = p[*Otemp - '0'];
179472fcea8cSEd Schouten 		Otemp++;
179572fcea8cSEd Schouten 	}
179672fcea8cSEd Schouten 	else if (*Otemp == 'P')
179772fcea8cSEd Schouten 	{
179872fcea8cSEd Schouten 		Otemp++;
179972fcea8cSEd Schouten 		Temp_Stack[place++] = variable[*Otemp - 'a'];
180072fcea8cSEd Schouten 		Otemp++;
180172fcea8cSEd Schouten 	}
180272fcea8cSEd Schouten 	else if (*Otemp == 'g')
180372fcea8cSEd Schouten 	{
180472fcea8cSEd Schouten 		Otemp++;
180572fcea8cSEd Schouten 		variable[*Otemp - 'a'] = Temp_Stack[--place];
180672fcea8cSEd Schouten 		Otemp++;
180772fcea8cSEd Schouten 	}
180872fcea8cSEd Schouten 	else if (*Otemp == '\'')
180972fcea8cSEd Schouten 	{
181072fcea8cSEd Schouten 		Otemp++;
181172fcea8cSEd Schouten 		Temp_Stack[place++] = *Otemp;
181272fcea8cSEd Schouten 		Otemp++;
181372fcea8cSEd Schouten 		Otemp++;
181472fcea8cSEd Schouten 	}
181572fcea8cSEd Schouten 	else if (*Otemp == '{')
181672fcea8cSEd Schouten 	{
181772fcea8cSEd Schouten 		Otemp++;
181872fcea8cSEd Schouten 		temp = atoi(Otemp);
181972fcea8cSEd Schouten 		Temp_Stack[place++] = temp;
182072fcea8cSEd Schouten 		while (*Otemp != '}')
182172fcea8cSEd Schouten 			Otemp++;
182272fcea8cSEd Schouten 		Otemp++;
182372fcea8cSEd Schouten 	}
182472fcea8cSEd Schouten 	return(place);
182572fcea8cSEd Schouten }
182672fcea8cSEd Schouten 
182772fcea8cSEd Schouten void
Info_Out(string,p_list,place)182872fcea8cSEd Schouten Info_Out(string, p_list, place)	/* interpret the output string if necessary */
182972fcea8cSEd Schouten char *string;
183072fcea8cSEd Schouten int p_list[];
183172fcea8cSEd Schouten int place;
183272fcea8cSEd Schouten {
183372fcea8cSEd Schouten 	char *tchar;
183472fcea8cSEd Schouten 	int delay;
183572fcea8cSEd Schouten 	int temp;
183672fcea8cSEd Schouten 	int Cond_FLAG;
183772fcea8cSEd Schouten 	int EVAL;
183872fcea8cSEd Schouten 	int Cond_Stack[128];
183972fcea8cSEd Schouten 	int Cond_place;
184072fcea8cSEd Schouten 	int Stack[128];
184172fcea8cSEd Schouten 	int Top_of_stack;
184272fcea8cSEd Schouten 
184372fcea8cSEd Schouten 	if (string == NULL)
184472fcea8cSEd Schouten 		return;
184572fcea8cSEd Schouten 
184672fcea8cSEd Schouten 	Cond_FLAG = FALSE;
184772fcea8cSEd Schouten 	Cond_place = 0;
184872fcea8cSEd Schouten 	Top_of_stack = 0;
184972fcea8cSEd Schouten 	p[0] = 0;
185072fcea8cSEd Schouten 	p[1] = 0;
185172fcea8cSEd Schouten 	p[2] = 0;
185272fcea8cSEd Schouten 	p[3] = 0;
185372fcea8cSEd Schouten 	p[4] = 0;
185472fcea8cSEd Schouten 	p[5] = 0;
185572fcea8cSEd Schouten 	p[6] = 0;
185672fcea8cSEd Schouten 	p[7] = 0;
185772fcea8cSEd Schouten 	p[8] = 0;
185872fcea8cSEd Schouten 	p[9] = 0;
185972fcea8cSEd Schouten 	if (p_list != NULL)
186072fcea8cSEd Schouten 	{
186172fcea8cSEd Schouten 		for (temp = 1; (place != 0); temp++)
186272fcea8cSEd Schouten 		{
186372fcea8cSEd Schouten 			p[temp] = p_list[--place];
186472fcea8cSEd Schouten 		}
186572fcea8cSEd Schouten 	}
186672fcea8cSEd Schouten 	delay = 0;
186772fcea8cSEd Schouten 	Otemp = string;
186896b676e9SEd Schouten 	while (*Otemp != '\0')
186972fcea8cSEd Schouten 	{
187072fcea8cSEd Schouten 		if (*Otemp == '%')
187172fcea8cSEd Schouten 		{
187272fcea8cSEd Schouten 			Otemp++;
187372fcea8cSEd Schouten 			if ((*Otemp == '?') || (*Otemp == 't') || (*Otemp == 'e') || (*Otemp == ';'))
187472fcea8cSEd Schouten 			{
187572fcea8cSEd Schouten 				if (*Otemp == '?')
187672fcea8cSEd Schouten 				{
187772fcea8cSEd Schouten 					Otemp++;
187872fcea8cSEd Schouten 					Cond_FLAG = TRUE;
187972fcea8cSEd Schouten 					EVAL = TRUE;
188072fcea8cSEd Schouten 					while (EVAL)
188172fcea8cSEd Schouten 					{
188272fcea8cSEd Schouten 						/*
188372fcea8cSEd Schouten 						 |  find the end of the
188472fcea8cSEd Schouten 						 |  conditional statement
188572fcea8cSEd Schouten 						 */
188696b676e9SEd Schouten 						while ((strncmp(Otemp, "%t", 2)) && (*Otemp != '\0'))
188772fcea8cSEd Schouten 						{
188872fcea8cSEd Schouten 							/*
188972fcea8cSEd Schouten 							 |  move past '%'
189072fcea8cSEd Schouten 							 */
189172fcea8cSEd Schouten 							Otemp++;
189272fcea8cSEd Schouten 							Cond_place = Operation(Cond_Stack, Cond_place);
189372fcea8cSEd Schouten 						}
189472fcea8cSEd Schouten 
189572fcea8cSEd Schouten 						/*
189672fcea8cSEd Schouten 						 |  if condition is true
189772fcea8cSEd Schouten 						 */
189872fcea8cSEd Schouten 						if ((Cond_place > 0) && (Cond_Stack[Cond_place-1]))
189972fcea8cSEd Schouten 						{
190072fcea8cSEd Schouten 							/*
190172fcea8cSEd Schouten 							 |  end conditional
190272fcea8cSEd Schouten 							 |  parsing
190372fcea8cSEd Schouten 							 */
190472fcea8cSEd Schouten 							EVAL = FALSE;
190572fcea8cSEd Schouten 							Otemp++;
190672fcea8cSEd Schouten 							Otemp++;
190772fcea8cSEd Schouten 						}
190872fcea8cSEd Schouten 						else	/* condition is false */
190972fcea8cSEd Schouten 						{
191072fcea8cSEd Schouten 							/*
191172fcea8cSEd Schouten 							 |  find 'else' or end
191272fcea8cSEd Schouten 							 |  of if statement
191372fcea8cSEd Schouten 							 */
191496b676e9SEd Schouten 							while ((strncmp(Otemp, "%e", 2)) && (strncmp(Otemp, "%;", 2)) && (*Otemp != '\0'))
191572fcea8cSEd Schouten 								Otemp++;
191672fcea8cSEd Schouten 							/*
191772fcea8cSEd Schouten 							 |  if an 'else' found
191872fcea8cSEd Schouten 							 */
191996b676e9SEd Schouten 							if ((*Otemp != '\0') && (!strncmp(Otemp, "%e", 2)))
192072fcea8cSEd Schouten 							{
192172fcea8cSEd Schouten 								Otemp++;
192272fcea8cSEd Schouten 								Otemp++;
192372fcea8cSEd Schouten 								tchar = Otemp;
192472fcea8cSEd Schouten 								/*
192572fcea8cSEd Schouten 								 |  check for 'then' part
192672fcea8cSEd Schouten 								 */
192796b676e9SEd Schouten 								while ((*tchar != '\0') && (strncmp(tchar, "%t", 2)) && (strncmp(tchar, "%;", 2)))
192872fcea8cSEd Schouten 									tchar++;
192972fcea8cSEd Schouten 								/*
193072fcea8cSEd Schouten 								 |  if end of string
193172fcea8cSEd Schouten 								 */
193296b676e9SEd Schouten 								if (*tchar == '\0')
193372fcea8cSEd Schouten 								{
193472fcea8cSEd Schouten 									EVAL = FALSE;
193572fcea8cSEd Schouten 									Cond_FLAG = FALSE;
193672fcea8cSEd Schouten 									Otemp = tchar;
193772fcea8cSEd Schouten 								}
193872fcea8cSEd Schouten 								/*
193972fcea8cSEd Schouten 								 |  if end of if found,
194072fcea8cSEd Schouten 								 |  set up to parse
194172fcea8cSEd Schouten 								 |  info
194272fcea8cSEd Schouten 								 */
194372fcea8cSEd Schouten 								else if (!strncmp(tchar, "%;", 2))
194472fcea8cSEd Schouten 									EVAL = FALSE;
194572fcea8cSEd Schouten 								/*
194672fcea8cSEd Schouten 								 |  otherwise, check
194772fcea8cSEd Schouten 								 |  conditional in
194872fcea8cSEd Schouten 								 |  'else'
194972fcea8cSEd Schouten 								 */
195072fcea8cSEd Schouten 							}
195172fcea8cSEd Schouten 							/*
195272fcea8cSEd Schouten 							 |  if end of if found,
195372fcea8cSEd Schouten 							 |  get out of if
195472fcea8cSEd Schouten 							 |  statement
195572fcea8cSEd Schouten 							 */
195696b676e9SEd Schouten 							else if ((*Otemp != '\0') && (!strncmp(Otemp, "%;", 2)))
195772fcea8cSEd Schouten 							{
195872fcea8cSEd Schouten 								EVAL = FALSE;
195972fcea8cSEd Schouten 								Otemp++;
196072fcea8cSEd Schouten 								Otemp++;
196172fcea8cSEd Schouten 							}
196272fcea8cSEd Schouten 							else /* Otemp == NULL */
196372fcea8cSEd Schouten 							{
196472fcea8cSEd Schouten 								EVAL = FALSE;
196572fcea8cSEd Schouten 								Cond_FLAG = FALSE;
196672fcea8cSEd Schouten 							}
196772fcea8cSEd Schouten 						}
196872fcea8cSEd Schouten 					}
196972fcea8cSEd Schouten 				}
197072fcea8cSEd Schouten 				else
197172fcea8cSEd Schouten 				{
197272fcea8cSEd Schouten 					Otemp++;
197372fcea8cSEd Schouten 					Cond_FLAG = FALSE;
197472fcea8cSEd Schouten 					if (*Otemp != ';')
197572fcea8cSEd Schouten 					{
197696b676e9SEd Schouten 						while ((*Otemp != '\0') && (strncmp(Otemp, "%;", 2)))
197772fcea8cSEd Schouten 							Otemp++;
197896b676e9SEd Schouten 						if (*Otemp != '\0')
197972fcea8cSEd Schouten 						{
198072fcea8cSEd Schouten 							Otemp++;
198172fcea8cSEd Schouten 							Otemp++;
198272fcea8cSEd Schouten 						}
198372fcea8cSEd Schouten 					}
198472fcea8cSEd Schouten 					else
198572fcea8cSEd Schouten 						Otemp++;
198672fcea8cSEd Schouten 				}
198772fcea8cSEd Schouten 			}
198872fcea8cSEd Schouten 			else
198972fcea8cSEd Schouten 			{
199072fcea8cSEd Schouten 				Top_of_stack = Operation(Stack, Top_of_stack);
199172fcea8cSEd Schouten 			}
199272fcea8cSEd Schouten 		}
199372fcea8cSEd Schouten 		else if (!strncmp(Otemp, "$<", 2))
199472fcea8cSEd Schouten 		{
199572fcea8cSEd Schouten 			Otemp++;
199672fcea8cSEd Schouten 			Otemp++;
199772fcea8cSEd Schouten 			delay = atoi(Otemp);
199872fcea8cSEd Schouten 			while (*Otemp != '>')
199972fcea8cSEd Schouten 				Otemp++;
200072fcea8cSEd Schouten 			Otemp++;
200172fcea8cSEd Schouten 			chars = delay * chars_per_millisecond;
200272fcea8cSEd Schouten 			delay = chars;
200372fcea8cSEd Schouten 			if ((chars - delay) > 0.0)
200472fcea8cSEd Schouten 				delay++;
200572fcea8cSEd Schouten 			if (String_table[pc__] == NULL)
200672fcea8cSEd Schouten 				temp = 0;
200772fcea8cSEd Schouten 			else
200872fcea8cSEd Schouten 				temp = *String_table[pc__];
200972fcea8cSEd Schouten 			for (; delay > 0; delay--)
201072fcea8cSEd Schouten 				putc(temp, stdout);
201172fcea8cSEd Schouten 		}
201272fcea8cSEd Schouten 		else
201372fcea8cSEd Schouten 		{
201472fcea8cSEd Schouten 			putchar(*Otemp);
201572fcea8cSEd Schouten 			Otemp++;
201672fcea8cSEd Schouten 		}
201772fcea8cSEd Schouten 	}
201872fcea8cSEd Schouten 	fflush(stdout);
201972fcea8cSEd Schouten }
202072fcea8cSEd Schouten #endif
202172fcea8cSEd Schouten 
202272fcea8cSEd Schouten void
wmove(window,row,column)202372fcea8cSEd Schouten wmove(window, row, column)	/* move cursor to indicated position in window */
202472fcea8cSEd Schouten WINDOW *window;
202572fcea8cSEd Schouten int row, column;
202672fcea8cSEd Schouten {
202772fcea8cSEd Schouten 	if ((row < window->Num_lines) && (column < window->Num_cols))
202872fcea8cSEd Schouten 	{
202972fcea8cSEd Schouten 		window->LX = column;
203072fcea8cSEd Schouten 		window->LY = row;
203172fcea8cSEd Schouten 	}
203272fcea8cSEd Schouten }
203372fcea8cSEd Schouten 
203472fcea8cSEd Schouten void
clear_line(line,column,cols)203572fcea8cSEd Schouten clear_line(line, column, cols)
203672fcea8cSEd Schouten struct _line *line;
203772fcea8cSEd Schouten int column;
203872fcea8cSEd Schouten int cols;
203972fcea8cSEd Schouten {
204072fcea8cSEd Schouten 	int j;
204172fcea8cSEd Schouten 
204272fcea8cSEd Schouten 	if (column > line->last_char)
204372fcea8cSEd Schouten 	{
204472fcea8cSEd Schouten 		for (j = line->last_char; j < column; j++)
204572fcea8cSEd Schouten 		{
204672fcea8cSEd Schouten 			line->row[j] = ' ';
204796b676e9SEd Schouten 			line->attributes[j] = '\0';
204872fcea8cSEd Schouten 		}
204972fcea8cSEd Schouten 	}
205072fcea8cSEd Schouten 	line->last_char = column;
205196b676e9SEd Schouten 	line->row[column] = '\0';
205296b676e9SEd Schouten 	line->attributes[column] = '\0';
205372fcea8cSEd Schouten 	line->changed = TRUE;
205472fcea8cSEd Schouten }
205572fcea8cSEd Schouten 
205672fcea8cSEd Schouten void
werase(window)205772fcea8cSEd Schouten werase(window)			/* clear the specified window		*/
205872fcea8cSEd Schouten WINDOW *window;
205972fcea8cSEd Schouten {
206072fcea8cSEd Schouten 	int i;
206172fcea8cSEd Schouten 	struct _line *tmp;
206272fcea8cSEd Schouten 
206372fcea8cSEd Schouten 	window->SCROLL_CLEAR = CLEAR;
206472fcea8cSEd Schouten 	window->scroll_up = window->scroll_down = 0;
206572fcea8cSEd Schouten 	for (i = 0, tmp = window->first_line; i < window->Num_lines; i++, tmp = tmp->next_screen)
206672fcea8cSEd Schouten 		clear_line(tmp, 0, window->Num_cols);
206772fcea8cSEd Schouten }
206872fcea8cSEd Schouten 
206972fcea8cSEd Schouten void
wclrtoeol(window)207072fcea8cSEd Schouten wclrtoeol(window)	/* erase from current cursor position to end of line */
207172fcea8cSEd Schouten WINDOW *window;
207272fcea8cSEd Schouten {
207372fcea8cSEd Schouten 	int column, row;
207472fcea8cSEd Schouten 	struct _line *tmp;
207572fcea8cSEd Schouten 
207672fcea8cSEd Schouten 	window->SCROLL_CLEAR = CHANGE;
207772fcea8cSEd Schouten 	column = window->LX;
207872fcea8cSEd Schouten 	row = window->LY;
207972fcea8cSEd Schouten 	for (row = 0, tmp = window->first_line; row < window->LY; row++)
208072fcea8cSEd Schouten 		tmp = tmp->next_screen;
208172fcea8cSEd Schouten 	clear_line(tmp, column, window->Num_cols);
208272fcea8cSEd Schouten }
208372fcea8cSEd Schouten 
208472fcea8cSEd Schouten void
wrefresh(window)208572fcea8cSEd Schouten wrefresh(window)		/* flush all previous output		*/
208672fcea8cSEd Schouten WINDOW *window;
208772fcea8cSEd Schouten {
208872fcea8cSEd Schouten 	wnoutrefresh(window);
208972fcea8cSEd Schouten #ifdef DIAG
209072fcea8cSEd Schouten {
209172fcea8cSEd Schouten 	struct _line *temp;
209272fcea8cSEd Schouten 	int value;
209372fcea8cSEd Schouten 	fprintf(stderr, "columns=%d, lines=%d, SC=%d, SR=%d\n",window->Num_cols, window->Num_lines, window->SC, window->SR);
209472fcea8cSEd Schouten 	for (value = 0, temp = window->first_line; value < window->Num_lines; value++, temp = temp->next_screen)
209572fcea8cSEd Schouten 	{
209672fcea8cSEd Schouten 		if (temp->number == -1)
209772fcea8cSEd Schouten 			fprintf(stderr, "line moved ");
209872fcea8cSEd Schouten 		if (temp->scroll)
209972fcea8cSEd Schouten 			fprintf(stderr, "scroll_x is set:  ");
210072fcea8cSEd Schouten 		fprintf(stderr, "lc%d=%s|\n", temp->last_char, temp->row);
210172fcea8cSEd Schouten 	}
210272fcea8cSEd Schouten 	fprintf(stderr, "+-------------------- virtual screen ----------------------------------------+\n");
210372fcea8cSEd Schouten 	fprintf(stderr, "columns=%d, lines=%d \n",virtual_scr->Num_cols, virtual_scr->Num_lines);
210472fcea8cSEd Schouten 	for (value = 0, temp = virtual_scr->first_line; value < virtual_scr->Num_lines; value++, temp = temp->next_screen)
210572fcea8cSEd Schouten 	{
210672fcea8cSEd Schouten 		if (temp->number == -1)
210772fcea8cSEd Schouten 			fprintf(stderr, "line moved ");
210872fcea8cSEd Schouten 		if (temp->scroll)
210972fcea8cSEd Schouten 			fprintf(stderr, "scroll_x is set:  ");
211072fcea8cSEd Schouten 		fprintf(stderr, "lc%d=%s|\n", temp->last_char, temp->row);
211172fcea8cSEd Schouten 	}
211272fcea8cSEd Schouten 	fprintf(stderr, "columns=%d, lines=%d \n",curscr->Num_cols, curscr->Num_lines);
211372fcea8cSEd Schouten 	for (value = 0, temp = curscr->first_line; value < curscr->Num_lines; value++, temp = temp->next_screen)
211472fcea8cSEd Schouten 		fprintf(stderr, "line=%s|\n", temp->row);
211572fcea8cSEd Schouten }
211672fcea8cSEd Schouten #endif
211772fcea8cSEd Schouten 	doupdate();
211872fcea8cSEd Schouten 	virtual_scr->SCROLL_CLEAR = FALSE;
211972fcea8cSEd Schouten 	virtual_scr->scroll_down = virtual_scr->scroll_up = 0;
212072fcea8cSEd Schouten 	fflush(stdout);
212172fcea8cSEd Schouten }
212272fcea8cSEd Schouten 
212372fcea8cSEd Schouten void
touchwin(window)212472fcea8cSEd Schouten touchwin(window)
212572fcea8cSEd Schouten WINDOW *window;
212672fcea8cSEd Schouten {
212772fcea8cSEd Schouten 	struct _line *user_line;
212872fcea8cSEd Schouten 	int line_counter = 0;
212972fcea8cSEd Schouten 
213072fcea8cSEd Schouten 	for (line_counter = 0, user_line = window->first_line;
213172fcea8cSEd Schouten 		line_counter < window->Num_lines; line_counter++)
213272fcea8cSEd Schouten 	{
213372fcea8cSEd Schouten 		user_line->changed = TRUE;
213472fcea8cSEd Schouten 	}
213572fcea8cSEd Schouten 	window->SCROLL_CLEAR = TRUE;
213672fcea8cSEd Schouten }
213772fcea8cSEd Schouten 
213872fcea8cSEd Schouten void
wnoutrefresh(window)213972fcea8cSEd Schouten wnoutrefresh(window)
214072fcea8cSEd Schouten WINDOW *window;
214172fcea8cSEd Schouten {
214272fcea8cSEd Schouten 	struct _line *user_line;
214372fcea8cSEd Schouten 	struct _line *virtual_line;
214472fcea8cSEd Schouten 	int line_counter = 0;
214572fcea8cSEd Schouten 	int user_col = 0;
214672fcea8cSEd Schouten 	int virt_col = 0;
214772fcea8cSEd Schouten 
214872fcea8cSEd Schouten 	if (window->SR >= virtual_scr->Num_lines)
214972fcea8cSEd Schouten 		return;
215072fcea8cSEd Schouten 	user_line = window->first_line;
215172fcea8cSEd Schouten 	virtual_line = virtual_scr->first_line;
215272fcea8cSEd Schouten 	virtual_scr->SCROLL_CLEAR = window->SCROLL_CLEAR;
215372fcea8cSEd Schouten 	virtual_scr->LX = window->LX + window->SC;
215472fcea8cSEd Schouten 	virtual_scr->LY = window->LY + window->SR;
215572fcea8cSEd Schouten 	virtual_scr->scroll_up = window->scroll_up;
215672fcea8cSEd Schouten 	virtual_scr->scroll_down = window->scroll_down;
215772fcea8cSEd Schouten 	if ((last_window_refreshed == window) && (!window->SCROLL_CLEAR))
215872fcea8cSEd Schouten 		return;
215972fcea8cSEd Schouten 	for (line_counter = 0; line_counter < window->SR; line_counter++)
216072fcea8cSEd Schouten 	{
216172fcea8cSEd Schouten 		virtual_line = virtual_line->next_screen;
216272fcea8cSEd Schouten 	}
216372fcea8cSEd Schouten 	for (line_counter = 0; (line_counter < window->Num_lines)
216472fcea8cSEd Schouten 		&& ((line_counter + window->SR) < virtual_scr->Num_lines);
216572fcea8cSEd Schouten 			line_counter++)
216672fcea8cSEd Schouten 	{
216772fcea8cSEd Schouten 		if ((last_window_refreshed != window) || (user_line->changed) || ((SCROLL | CLEAR) & window->SCROLL_CLEAR))
216872fcea8cSEd Schouten 		{
216972fcea8cSEd Schouten 			for (user_col = 0, virt_col = window->SC;
217072fcea8cSEd Schouten 				(virt_col < virtual_scr->Num_cols)
217172fcea8cSEd Schouten 				  && (user_col < user_line->last_char);
217272fcea8cSEd Schouten 				  	virt_col++, user_col++)
217372fcea8cSEd Schouten 			{
217472fcea8cSEd Schouten 				virtual_line->row[virt_col] = user_line->row[user_col];
217572fcea8cSEd Schouten 				virtual_line->attributes[virt_col] = user_line->attributes[user_col];
217672fcea8cSEd Schouten 			}
217772fcea8cSEd Schouten 			for (user_col = user_line->last_char,
217872fcea8cSEd Schouten 			     virt_col = window->SC + user_line->last_char;
217972fcea8cSEd Schouten 				(virt_col < virtual_scr->Num_cols)
218072fcea8cSEd Schouten 				  && (user_col < window->Num_cols);
218172fcea8cSEd Schouten 				  	virt_col++, user_col++)
218272fcea8cSEd Schouten 			{
218372fcea8cSEd Schouten 				virtual_line->row[virt_col] = ' ';
218496b676e9SEd Schouten 				virtual_line->attributes[virt_col] = '\0';
218572fcea8cSEd Schouten 			}
218672fcea8cSEd Schouten 		}
218772fcea8cSEd Schouten 		if (virtual_scr->Num_cols != window->Num_cols)
218872fcea8cSEd Schouten 		{
218972fcea8cSEd Schouten 			if (virtual_line->last_char < (user_line->last_char + window->SC))
219072fcea8cSEd Schouten 			{
219196b676e9SEd Schouten 				if (virtual_line->row[virtual_line->last_char] == '\0')
219272fcea8cSEd Schouten 					virtual_line->row[virtual_line->last_char] = ' ';
219372fcea8cSEd Schouten 				virtual_line->last_char =
219472fcea8cSEd Schouten 					min(virtual_scr->Num_cols,
219572fcea8cSEd Schouten 					  (user_line->last_char + window->SC));
219672fcea8cSEd Schouten 			}
219772fcea8cSEd Schouten 		}
219872fcea8cSEd Schouten 		else
219972fcea8cSEd Schouten 			virtual_line->last_char = user_line->last_char;
220096b676e9SEd Schouten 		virtual_line->row[virtual_line->last_char] = '\0';
220172fcea8cSEd Schouten 		virtual_line->changed = user_line->changed;
220272fcea8cSEd Schouten 		virtual_line = virtual_line->next_screen;
220372fcea8cSEd Schouten 		user_line = user_line->next_screen;
220472fcea8cSEd Schouten 	}
220572fcea8cSEd Schouten 	window->SCROLL_CLEAR = FALSE;
220672fcea8cSEd Schouten 	window->scroll_up = window->scroll_down = 0;
220772fcea8cSEd Schouten 	last_window_refreshed = window;
220872fcea8cSEd Schouten }
220972fcea8cSEd Schouten 
221072fcea8cSEd Schouten void
flushinp()221172fcea8cSEd Schouten flushinp()			/* flush input				*/
221272fcea8cSEd Schouten {
221372fcea8cSEd Schouten }
221472fcea8cSEd Schouten 
221572fcea8cSEd Schouten void
ungetch(c)221672fcea8cSEd Schouten ungetch(c)			/* push a character back on input	*/
221772fcea8cSEd Schouten int c;
221872fcea8cSEd Schouten {
221972fcea8cSEd Schouten 	if (bufp < 100)
222072fcea8cSEd Schouten 		in_buff[bufp++] = c;
222172fcea8cSEd Schouten }
222272fcea8cSEd Schouten 
222372fcea8cSEd Schouten #ifdef BSD_SELECT
222472fcea8cSEd Schouten int
timed_getchar()222572fcea8cSEd Schouten timed_getchar()
222672fcea8cSEd Schouten {
222772fcea8cSEd Schouten 	struct timeval tv;
222872fcea8cSEd Schouten 	fd_set fds;
222972fcea8cSEd Schouten 	int ret_val;
223072fcea8cSEd Schouten 	int nfds = 1;
223172fcea8cSEd Schouten 	char temp;
223272fcea8cSEd Schouten 
223372fcea8cSEd Schouten 	FD_ZERO(&fds);
223472fcea8cSEd Schouten 	tv.tv_sec = 0;
223572fcea8cSEd Schouten 	tv.tv_usec = 500000;  /* half a second */
223672fcea8cSEd Schouten 	FD_SET(0, &fds);
223772fcea8cSEd Schouten 	Time_Out = FALSE; /* just in case */
223872fcea8cSEd Schouten 
223972fcea8cSEd Schouten 	ret_val = select(nfds, &fds, 0, 0, &tv);
224072fcea8cSEd Schouten 
224172fcea8cSEd Schouten 	/*
224272fcea8cSEd Schouten 	 |	if ret_val is less than zero, there was no input
224372fcea8cSEd Schouten 	 |	otherwise, get a character and return it
224472fcea8cSEd Schouten 	 */
224572fcea8cSEd Schouten 
224672fcea8cSEd Schouten 	if (ret_val <= 0)
224772fcea8cSEd Schouten 	{
224872fcea8cSEd Schouten 		Time_Out = TRUE;
224972fcea8cSEd Schouten 		return(-1);
225072fcea8cSEd Schouten 	}
225172fcea8cSEd Schouten 
225272fcea8cSEd Schouten 	return(read(0, &temp, 1)? temp : -1);
225372fcea8cSEd Schouten }
225472fcea8cSEd Schouten #endif
225572fcea8cSEd Schouten 
225672fcea8cSEd Schouten int
wgetch(window)225772fcea8cSEd Schouten wgetch(window)			/* get character from specified window	*/
225872fcea8cSEd Schouten WINDOW *window;
225972fcea8cSEd Schouten {
226072fcea8cSEd Schouten 	int in_value;
226172fcea8cSEd Schouten 	char temp;
226272fcea8cSEd Schouten #ifndef SYS5
226372fcea8cSEd Schouten 	int old_arg;
226472fcea8cSEd Schouten #endif /* SYS5 */
226572fcea8cSEd Schouten 
226672fcea8cSEd Schouten #ifdef BSD_SELECT
226772fcea8cSEd Schouten 	if (Noblock)
226872fcea8cSEd Schouten 		in_value = ((bufp > 0) ? in_buff[--bufp] : timed_getchar());
226972fcea8cSEd Schouten 	else
227072fcea8cSEd Schouten 		in_value = ((bufp > 0) ? in_buff[--bufp] : read(0, &temp, 1)? temp : -1);
227172fcea8cSEd Schouten #else /* BSD_SELECT */
227272fcea8cSEd Schouten #ifdef SYS5
227372fcea8cSEd Schouten 	in_value = ((bufp > 0) ? in_buff[--bufp] :
227472fcea8cSEd Schouten 					(read(0, &temp, 1)> 0) ? temp : -1);
227572fcea8cSEd Schouten #else /* SYS5 */
227672fcea8cSEd Schouten 	if (Noblock)
227772fcea8cSEd Schouten 	{
227872fcea8cSEd Schouten 		Time_Out = FALSE;
227972fcea8cSEd Schouten 		old_arg = fcntl(0, F_GETFL, 0);
228072fcea8cSEd Schouten 		in_value = fcntl(0, F_SETFL, old_arg | FNDELAY);
228172fcea8cSEd Schouten 	}
228272fcea8cSEd Schouten 	in_value = ((bufp > 0) ? in_buff[--bufp] : read(0, &temp, 1)? temp : -1);
228372fcea8cSEd Schouten 	if (Noblock)
228472fcea8cSEd Schouten 	{
228572fcea8cSEd Schouten 		fcntl(0, F_SETFL, old_arg);
228672fcea8cSEd Schouten 		if (Time_Out)
228772fcea8cSEd Schouten 			in_value = -1;
228872fcea8cSEd Schouten 	}
228972fcea8cSEd Schouten #endif /* SYS5 */
229072fcea8cSEd Schouten #endif /* BSD_SELECT */
229172fcea8cSEd Schouten 
229272fcea8cSEd Schouten 	if (in_value != -1)
229372fcea8cSEd Schouten 	{
229472fcea8cSEd Schouten 		in_value &= 0xff;
229572fcea8cSEd Schouten 		if ((Parity) && (Num_bits < 8))
229672fcea8cSEd Schouten 				/* strip eighth bit if parity in use */
229772fcea8cSEd Schouten 		in_value &= 0177;
229872fcea8cSEd Schouten 	}
229972fcea8cSEd Schouten 	else if (interrupt_flag)
230072fcea8cSEd Schouten 	{
230172fcea8cSEd Schouten 		interrupt_flag = FALSE;
230272fcea8cSEd Schouten 		in_value = wgetch(window);
230372fcea8cSEd Schouten 	}
230472fcea8cSEd Schouten 
230572fcea8cSEd Schouten 	if ((in_value == '\033') || (in_value == '\037'))/* escape character */
230672fcea8cSEd Schouten 		in_value = Get_key(in_value);
230772fcea8cSEd Schouten 	return(in_value);
230872fcea8cSEd Schouten }
230972fcea8cSEd Schouten 
231072fcea8cSEd Schouten #ifndef BSD_SELECT
231172fcea8cSEd Schouten void
Clear(arg)231272fcea8cSEd Schouten Clear(arg)		/* notify that time out has occurred	*/
231372fcea8cSEd Schouten int arg;
231472fcea8cSEd Schouten {
231572fcea8cSEd Schouten 	Time_Out = TRUE;
231672fcea8cSEd Schouten #ifdef DEBUG
231772fcea8cSEd Schouten fprintf(stderr, "inside Clear()\n");
231872fcea8cSEd Schouten fflush(stderr);
231972fcea8cSEd Schouten #endif /* DEBUG */
232072fcea8cSEd Schouten }
232172fcea8cSEd Schouten #endif /* BSD_SELECT */
232272fcea8cSEd Schouten 
232372fcea8cSEd Schouten int
Get_key(first_char)232472fcea8cSEd Schouten Get_key(first_char)			/* try to decode key sequence	*/
232572fcea8cSEd Schouten int first_char;				/* first character of sequence	*/
232672fcea8cSEd Schouten {
232772fcea8cSEd Schouten 	int in_char;
232872fcea8cSEd Schouten 	int Count;
232972fcea8cSEd Schouten 	char string[128];
233072fcea8cSEd Schouten 	char *Gtemp;
233172fcea8cSEd Schouten 	int Found;
233272fcea8cSEd Schouten #ifdef SYS5
233372fcea8cSEd Schouten 	struct termio Gterminal;
233472fcea8cSEd Schouten #else
233572fcea8cSEd Schouten 	struct sgttyb Gterminal;
233672fcea8cSEd Schouten #endif
233772fcea8cSEd Schouten 	struct KEY_STACK *St_point;
233872fcea8cSEd Schouten #if (!defined( BSD_SELECT)) || (!defined(SYS5))
233972fcea8cSEd Schouten 	int value;
234072fcea8cSEd Schouten #endif /* BSD_SELECT */
234172fcea8cSEd Schouten 
234272fcea8cSEd Schouten 	Count = 0;
234372fcea8cSEd Schouten 	Gtemp = string;
234472fcea8cSEd Schouten 	string[Count++] = first_char;
234596b676e9SEd Schouten 	string[Count] = '\0';
234672fcea8cSEd Schouten 	Time_Out = FALSE;
234772fcea8cSEd Schouten #ifndef BSD_SELECT
234872fcea8cSEd Schouten 	signal(SIGALRM, Clear);
234972fcea8cSEd Schouten 	value = alarm(1);
235072fcea8cSEd Schouten #endif /* BSD_SELECT */
235172fcea8cSEd Schouten 	Noblock = TRUE;
235272fcea8cSEd Schouten #ifdef SYS5
235372fcea8cSEd Schouten 	Gterminal.c_cc[VTIME] = 0;		/* timeout value	*/
235472fcea8cSEd Schouten 	Gterminal.c_lflag &= ~ICANON;	/* disable canonical operation	*/
235572fcea8cSEd Schouten 	Gterminal.c_lflag &= ~ECHO;		/* disable echo		*/
235672fcea8cSEd Schouten #endif
235772fcea8cSEd Schouten 	Count = 1;
235872fcea8cSEd Schouten 	Found = FALSE;
235972fcea8cSEd Schouten 	while ((Count < Max_Key_len) && (!Time_Out) && (!Found))
236072fcea8cSEd Schouten 	{
236172fcea8cSEd Schouten 		in_char = wgetch(stdscr);
236272fcea8cSEd Schouten #ifdef DEBUG
236372fcea8cSEd Schouten fprintf(stderr, "back in GetKey()\n");
236472fcea8cSEd Schouten fflush(stderr);
236572fcea8cSEd Schouten #endif /* DEBUG */
236672fcea8cSEd Schouten 		if (in_char != -1)
236772fcea8cSEd Schouten 		{
236872fcea8cSEd Schouten 			string[Count++] = in_char;
236996b676e9SEd Schouten 			string[Count] = '\0';
237072fcea8cSEd Schouten 			St_point = KEY_TOS;
237172fcea8cSEd Schouten 			while ((St_point != NULL) && (!Found))
237272fcea8cSEd Schouten 			{
237372fcea8cSEd Schouten 				if (!strcmp(string, St_point->element->string))
237472fcea8cSEd Schouten 					Found = TRUE;
237572fcea8cSEd Schouten 				else
237672fcea8cSEd Schouten 					St_point = St_point->next;
237772fcea8cSEd Schouten 			}
237872fcea8cSEd Schouten 		}
237972fcea8cSEd Schouten 	}
238072fcea8cSEd Schouten #ifndef BSD_SELECT
238172fcea8cSEd Schouten 	if (!Time_Out)
238272fcea8cSEd Schouten 		value = alarm(0);
238372fcea8cSEd Schouten #endif /* BSD_SELECT */
238472fcea8cSEd Schouten #ifdef SYS5
238572fcea8cSEd Schouten /*	value = ioctl(0, TCSETA, &Terminal);*/
238672fcea8cSEd Schouten #else
238772fcea8cSEd Schouten 	value = ioctl(0, TIOCSETP, &Terminal);
238872fcea8cSEd Schouten /*	value = fcntl(0, F_SETFL, old_arg);*/
238972fcea8cSEd Schouten #endif
239072fcea8cSEd Schouten 	Noblock = FALSE;
239172fcea8cSEd Schouten 	if (Found)
239272fcea8cSEd Schouten 	{
239372fcea8cSEd Schouten 		return(St_point->element->value);
239472fcea8cSEd Schouten 	}
239572fcea8cSEd Schouten 	else
239672fcea8cSEd Schouten 	{
239772fcea8cSEd Schouten 		while (Count > 1)
239872fcea8cSEd Schouten 		{
239972fcea8cSEd Schouten 			if ((string[--Count] != -1) &&
240072fcea8cSEd Schouten 					((unsigned char) (string[Count]) != 255))
240172fcea8cSEd Schouten 			{
240272fcea8cSEd Schouten #ifdef DIAG
240372fcea8cSEd Schouten fprintf(stderr, "ungetting character %d\n", string[Count]);fflush(stdout);
240472fcea8cSEd Schouten #endif
240572fcea8cSEd Schouten 				ungetch(string[Count]);
240672fcea8cSEd Schouten 			}
240772fcea8cSEd Schouten 		}
240872fcea8cSEd Schouten 		return(first_char);
240972fcea8cSEd Schouten 	}
241072fcea8cSEd Schouten }
241172fcea8cSEd Schouten 
241272fcea8cSEd Schouten void
waddch(window,c)241372fcea8cSEd Schouten waddch(window, c)	/* output the character in the specified window	*/
241472fcea8cSEd Schouten WINDOW *window;
241572fcea8cSEd Schouten int c;
241672fcea8cSEd Schouten {
241772fcea8cSEd Schouten 	int column, j;
241872fcea8cSEd Schouten 	int shift;	/* number of spaces to shift if a tab		*/
241972fcea8cSEd Schouten 	struct _line *tmpline;
242072fcea8cSEd Schouten 
242172fcea8cSEd Schouten #ifdef DIAG
242272fcea8cSEd Schouten /*printf("starting waddch \n");fflush(stdout);*/
242372fcea8cSEd Schouten #endif
242472fcea8cSEd Schouten 	column = window->LX;
242572fcea8cSEd Schouten 	if (c == '\t')
242672fcea8cSEd Schouten 	{
242772fcea8cSEd Schouten 		shift = (column + 1) % 8;
242872fcea8cSEd Schouten 		if (shift == 0)
242972fcea8cSEd Schouten 			shift++;
243072fcea8cSEd Schouten 		else
243172fcea8cSEd Schouten 			shift = 9 - shift;
243272fcea8cSEd Schouten 		while (shift > 0)
243372fcea8cSEd Schouten 		{
243472fcea8cSEd Schouten 			shift--;
243572fcea8cSEd Schouten 			waddch(window, ' ');
243672fcea8cSEd Schouten 		}
243772fcea8cSEd Schouten 	}
243872fcea8cSEd Schouten 	else if ((column < window->Num_cols) && (window->LY < window->Num_lines))
243972fcea8cSEd Schouten 	{
244072fcea8cSEd Schouten 		if ((c == '~') && (Booleans[hz__]))
244172fcea8cSEd Schouten 			c = '@';
244272fcea8cSEd Schouten 
244372fcea8cSEd Schouten 		if (( c != '\b') && (c != '\n') && (c != '\r'))
244472fcea8cSEd Schouten 		{
244572fcea8cSEd Schouten 			tmpline = window->line_array[window->LY];
244672fcea8cSEd Schouten 			tmpline->row[column] = c;
244772fcea8cSEd Schouten 			tmpline->attributes[column] = window->Attrib;
244872fcea8cSEd Schouten 			tmpline->changed = TRUE;
244972fcea8cSEd Schouten 			if (column >= tmpline->last_char)
245072fcea8cSEd Schouten 			{
245172fcea8cSEd Schouten 				if (column > tmpline->last_char)
245272fcea8cSEd Schouten 					for (j = tmpline->last_char; j < column; j++)
245372fcea8cSEd Schouten 					{
245472fcea8cSEd Schouten 						tmpline->row[j] = ' ';
245596b676e9SEd Schouten 						tmpline->attributes[j] = '\0';
245672fcea8cSEd Schouten 					}
245796b676e9SEd Schouten 				tmpline->row[column + 1] = '\0';
245896b676e9SEd Schouten 				tmpline->attributes[column + 1] = '\0';
245972fcea8cSEd Schouten 				tmpline->last_char = column + 1;
246072fcea8cSEd Schouten 			}
246172fcea8cSEd Schouten 		}
246272fcea8cSEd Schouten 		if (c == '\n')
246372fcea8cSEd Schouten 		{
246472fcea8cSEd Schouten 			wclrtoeol(window);
246572fcea8cSEd Schouten 			window->LX = window->Num_cols;
246672fcea8cSEd Schouten 		}
246772fcea8cSEd Schouten 		else if (c == '\r')
246872fcea8cSEd Schouten 			window->LX = 0;
246972fcea8cSEd Schouten 		else if (c == '\b')
247072fcea8cSEd Schouten 			window->LX--;
247172fcea8cSEd Schouten 		else
247272fcea8cSEd Schouten 			window->LX++;
247372fcea8cSEd Schouten 	}
247472fcea8cSEd Schouten 	if (window->LX >= window->Num_cols)
247572fcea8cSEd Schouten 	{
247672fcea8cSEd Schouten 		window->LX = 0;
247772fcea8cSEd Schouten 		window->LY++;
247872fcea8cSEd Schouten 		if (window->LY >= window->Num_lines)
247972fcea8cSEd Schouten 		{
248072fcea8cSEd Schouten 			window->LY = window->Num_lines - 1;
248172fcea8cSEd Schouten /*			window->LY = row;
248272fcea8cSEd Schouten 			wmove(window, 0, 0);
248372fcea8cSEd Schouten 			wdeleteln(window);
248472fcea8cSEd Schouten 			wmove(window, row, 0);*/
248572fcea8cSEd Schouten 		}
248672fcea8cSEd Schouten 	}
248772fcea8cSEd Schouten 	window->SCROLL_CLEAR = CHANGE;
248872fcea8cSEd Schouten }
248972fcea8cSEd Schouten 
249072fcea8cSEd Schouten void
winsertln(window)249172fcea8cSEd Schouten winsertln(window)	/* insert a blank line into the specified window */
249272fcea8cSEd Schouten WINDOW *window;
249372fcea8cSEd Schouten {
249472fcea8cSEd Schouten 	int row, column;
249572fcea8cSEd Schouten 	struct _line *tmp;
249672fcea8cSEd Schouten 	struct _line *tmp1;
249772fcea8cSEd Schouten 
249872fcea8cSEd Schouten 	window->scroll_down += 1;
249972fcea8cSEd Schouten 	window->SCROLL_CLEAR = SCROLL;
250072fcea8cSEd Schouten 	column = window->LX;
250172fcea8cSEd Schouten 	row = window->LY;
250272fcea8cSEd Schouten 	for (row = 0, tmp = window->first_line; (row < window->Num_lines) && (tmp->next_screen != NULL); row++)
250372fcea8cSEd Schouten 		tmp = tmp->next_screen;
250472fcea8cSEd Schouten 	if (tmp->prev_screen != NULL)
250572fcea8cSEd Schouten 		tmp->prev_screen->next_screen = NULL;
250672fcea8cSEd Schouten 	tmp1 = tmp;
250772fcea8cSEd Schouten 	clear_line(tmp1, 0, window->Num_cols);
250872fcea8cSEd Schouten 	tmp1->number = -1;
250972fcea8cSEd Schouten 	for (row = 0, tmp = window->first_line; (row < window->LY) && (tmp->next_screen != NULL); row++)
251072fcea8cSEd Schouten 		tmp = tmp->next_screen;
251172fcea8cSEd Schouten 	if ((window->LY == (window->Num_lines - 1)) && (window->Num_lines > 1))
251272fcea8cSEd Schouten 	{
251372fcea8cSEd Schouten 		tmp1->next_screen = tmp->next_screen;
251472fcea8cSEd Schouten 		tmp->next_screen = tmp1;
251572fcea8cSEd Schouten 		tmp->changed = TRUE;
251672fcea8cSEd Schouten 		tmp->next_screen->prev_screen = tmp;
251772fcea8cSEd Schouten 	}
251872fcea8cSEd Schouten 	else if (window->Num_lines > 1)
251972fcea8cSEd Schouten 	{
252072fcea8cSEd Schouten 		if (tmp->prev_screen != NULL)
252172fcea8cSEd Schouten 			tmp->prev_screen->next_screen = tmp1;
252272fcea8cSEd Schouten 		tmp1->prev_screen = tmp->prev_screen;
252372fcea8cSEd Schouten 		tmp->prev_screen = tmp1;
252472fcea8cSEd Schouten 		tmp1->next_screen = tmp;
252572fcea8cSEd Schouten 		tmp->changed = TRUE;
252672fcea8cSEd Schouten 		tmp->scroll = DOWN;
252772fcea8cSEd Schouten 	}
252872fcea8cSEd Schouten 	if (window->LY == 0)
252972fcea8cSEd Schouten 		window->first_line = tmp1;
253072fcea8cSEd Schouten 
253172fcea8cSEd Schouten 	for (row = 0, tmp1 = window->first_line;
253272fcea8cSEd Schouten 		row < window->Num_lines; row++)
253372fcea8cSEd Schouten 	{
253472fcea8cSEd Schouten 		window->line_array[row] = tmp1;
253572fcea8cSEd Schouten 		tmp1 = tmp1->next_screen;
253672fcea8cSEd Schouten 	}
253772fcea8cSEd Schouten }
253872fcea8cSEd Schouten 
253972fcea8cSEd Schouten void
wdeleteln(window)254072fcea8cSEd Schouten wdeleteln(window)	/* delete a line in the specified window */
254172fcea8cSEd Schouten WINDOW *window;
254272fcea8cSEd Schouten {
254372fcea8cSEd Schouten 	int row, column;
254472fcea8cSEd Schouten 	struct _line *tmp;
254572fcea8cSEd Schouten 	struct _line  *tmpline;
254672fcea8cSEd Schouten 
254772fcea8cSEd Schouten 	if (window->Num_lines > 1)
254872fcea8cSEd Schouten 	{
254972fcea8cSEd Schouten 		window->scroll_up += 1;
255072fcea8cSEd Schouten 		window->SCROLL_CLEAR = SCROLL;
255172fcea8cSEd Schouten 		column = window->LX;
255272fcea8cSEd Schouten 		row = window->LY;
255372fcea8cSEd Schouten 		for (row = 0, tmp = window->first_line; row < window->LY; row++)
255472fcea8cSEd Schouten 			tmp = tmp->next_screen;
255572fcea8cSEd Schouten 		if (window->LY == 0)
255672fcea8cSEd Schouten 			window->first_line = tmp->next_screen;
255772fcea8cSEd Schouten 		if (tmp->prev_screen != NULL)
255872fcea8cSEd Schouten 			tmp->prev_screen->next_screen = tmp->next_screen;
255972fcea8cSEd Schouten 		if (tmp->next_screen != NULL)
256072fcea8cSEd Schouten 		{
256172fcea8cSEd Schouten 			tmp->next_screen->changed = TRUE;
256272fcea8cSEd Schouten 			tmp->next_screen->scroll = UP;
256372fcea8cSEd Schouten 			tmp->next_screen->prev_screen = tmp->prev_screen;
256472fcea8cSEd Schouten 		}
256572fcea8cSEd Schouten 		tmpline = tmp;
256672fcea8cSEd Schouten 		clear_line(tmpline, 0, window->Num_cols);
256772fcea8cSEd Schouten 		tmpline->number = -1;
256872fcea8cSEd Schouten 		for (row = 0, tmp = window->first_line; tmp->next_screen != NULL; row++)
256972fcea8cSEd Schouten 			tmp = tmp->next_screen;
257072fcea8cSEd Schouten 		if (tmp != NULL)
257172fcea8cSEd Schouten 		{
257272fcea8cSEd Schouten 			tmp->next_screen = tmpline;
257372fcea8cSEd Schouten 			tmp->next_screen->prev_screen = tmp;
257472fcea8cSEd Schouten 			tmp->changed = TRUE;
257572fcea8cSEd Schouten 			tmp = tmp->next_screen;
257672fcea8cSEd Schouten 		}
257772fcea8cSEd Schouten 		else
257872fcea8cSEd Schouten 			tmp = tmpline;
257972fcea8cSEd Schouten 		tmp->next_screen = NULL;
258072fcea8cSEd Schouten 
258172fcea8cSEd Schouten 		for (row = 0, tmp = window->first_line; row < window->Num_lines; row++)
258272fcea8cSEd Schouten 		{
258372fcea8cSEd Schouten 			window->line_array[row] = tmp;
258472fcea8cSEd Schouten 			tmp = tmp->next_screen;
258572fcea8cSEd Schouten 		}
258672fcea8cSEd Schouten 	}
258772fcea8cSEd Schouten 	else
258872fcea8cSEd Schouten 	{
258972fcea8cSEd Schouten 		clear_line(window->first_line, 0, window->Num_cols);
259072fcea8cSEd Schouten 	}
259172fcea8cSEd Schouten }
259272fcea8cSEd Schouten 
259372fcea8cSEd Schouten void
wclrtobot(window)259472fcea8cSEd Schouten wclrtobot(window)	/* delete from current position to end of the window */
259572fcea8cSEd Schouten WINDOW *window;
259672fcea8cSEd Schouten {
259772fcea8cSEd Schouten 	int row, column;
259872fcea8cSEd Schouten 	struct _line *tmp;
259972fcea8cSEd Schouten 
260072fcea8cSEd Schouten 	window->SCROLL_CLEAR |= CLEAR;
260172fcea8cSEd Schouten 	column = window->LX;
260272fcea8cSEd Schouten 	row = window->LY;
260372fcea8cSEd Schouten 	for (row = 0, tmp = window->first_line; row < window->LY; row++)
260472fcea8cSEd Schouten 		tmp = tmp->next_screen;
260572fcea8cSEd Schouten 	clear_line(tmp, column, window->Num_cols);
260672fcea8cSEd Schouten 	for (row = (window->LY + 1); row < window->Num_lines; row++)
260772fcea8cSEd Schouten 	{
260872fcea8cSEd Schouten 		tmp = tmp->next_screen;
260972fcea8cSEd Schouten 		clear_line(tmp, 0, window->Num_cols);
261072fcea8cSEd Schouten 	}
261172fcea8cSEd Schouten 	wmove(window, row, column);
261272fcea8cSEd Schouten }
261372fcea8cSEd Schouten 
261472fcea8cSEd Schouten void
wstandout(window)261572fcea8cSEd Schouten wstandout(window)	/* begin standout mode in window	*/
261672fcea8cSEd Schouten WINDOW *window;
261772fcea8cSEd Schouten {
261872fcea8cSEd Schouten 	if (Numbers[sg__] < 1)	/* if not magic cookie glitch	*/
261972fcea8cSEd Schouten 		window->Attrib |= A_STANDOUT;
262072fcea8cSEd Schouten }
262172fcea8cSEd Schouten 
262272fcea8cSEd Schouten void
wstandend(window)262372fcea8cSEd Schouten wstandend(window)	/* end standout mode in window	*/
262472fcea8cSEd Schouten WINDOW *window;
262572fcea8cSEd Schouten {
262672fcea8cSEd Schouten 	window->Attrib &= ~A_STANDOUT;
262772fcea8cSEd Schouten }
262872fcea8cSEd Schouten 
262972fcea8cSEd Schouten void
waddstr(window,string)263072fcea8cSEd Schouten waddstr(window, string)	/* write 'string' in window	*/
263172fcea8cSEd Schouten WINDOW *window;
263272fcea8cSEd Schouten char *string;
263372fcea8cSEd Schouten {
263472fcea8cSEd Schouten 	char *wstring;
263572fcea8cSEd Schouten 
263696b676e9SEd Schouten 	for (wstring = string; *wstring != '\0'; wstring++)
263772fcea8cSEd Schouten 		waddch(window, *wstring);
263872fcea8cSEd Schouten }
263972fcea8cSEd Schouten 
264072fcea8cSEd Schouten void
clearok(window,flag)264172fcea8cSEd Schouten clearok(window, flag)	/* erase screen and redraw at next refresh	*/
264272fcea8cSEd Schouten WINDOW *window;
264372fcea8cSEd Schouten int flag;
264472fcea8cSEd Schouten {
264572fcea8cSEd Schouten 	Repaint_screen = TRUE;
264672fcea8cSEd Schouten }
264772fcea8cSEd Schouten 
264872fcea8cSEd Schouten 
264972fcea8cSEd Schouten void
echo()265072fcea8cSEd Schouten echo()			/* turn on echoing				*/
265172fcea8cSEd Schouten {
265272fcea8cSEd Schouten 	int value;
265372fcea8cSEd Schouten 
265472fcea8cSEd Schouten #ifdef SYS5
265572fcea8cSEd Schouten 	Terminal.c_lflag |= ECHO;		/* enable echo		*/
265672fcea8cSEd Schouten 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
265772fcea8cSEd Schouten #else
265872fcea8cSEd Schouten 	Terminal.sg_flags |= ECHO;		/* enable echo		*/
265972fcea8cSEd Schouten 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
266072fcea8cSEd Schouten #endif
266172fcea8cSEd Schouten }
266272fcea8cSEd Schouten 
266372fcea8cSEd Schouten void
noecho()266472fcea8cSEd Schouten noecho()		/* turn off echoing				*/
266572fcea8cSEd Schouten {
266672fcea8cSEd Schouten 	int value;
266772fcea8cSEd Schouten 
266872fcea8cSEd Schouten #ifdef SYS5
266972fcea8cSEd Schouten 	Terminal.c_lflag &= ~ECHO;		/* disable echo		*/
267072fcea8cSEd Schouten 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
267172fcea8cSEd Schouten #else
267272fcea8cSEd Schouten 	Terminal.sg_flags &= ~ECHO;		/* disable echo		*/
267372fcea8cSEd Schouten 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
267472fcea8cSEd Schouten #endif
267572fcea8cSEd Schouten }
267672fcea8cSEd Schouten 
267772fcea8cSEd Schouten void
raw()267872fcea8cSEd Schouten raw()			/* set to read characters immediately		*/
267972fcea8cSEd Schouten {
268072fcea8cSEd Schouten 	int value;
268172fcea8cSEd Schouten 
268272fcea8cSEd Schouten #ifdef SYS5
268372fcea8cSEd Schouten 	Intr = Terminal.c_cc[VINTR];	/* get the interrupt character	*/
268472fcea8cSEd Schouten 	Terminal.c_lflag &= ~ICANON;	/* disable canonical operation	*/
268572fcea8cSEd Schouten 	Terminal.c_lflag &= ~ISIG;	/* disable signal checking	*/
268672fcea8cSEd Schouten #ifdef FLUSHO
268772fcea8cSEd Schouten 	Terminal.c_lflag &= ~FLUSHO;
268872fcea8cSEd Schouten #endif
268972fcea8cSEd Schouten #ifdef PENDIN
269072fcea8cSEd Schouten 	Terminal.c_lflag &= ~PENDIN;
269172fcea8cSEd Schouten #endif
269272fcea8cSEd Schouten #ifdef IEXTEN
269372fcea8cSEd Schouten 	Terminal.c_lflag &= ~IEXTEN;
269472fcea8cSEd Schouten #endif
269572fcea8cSEd Schouten 	Terminal.c_cc[VMIN] = 1;		/* minimum of one character */
269672fcea8cSEd Schouten 	Terminal.c_cc[VTIME] = 0;		/* timeout value	*/
269772fcea8cSEd Schouten 	Terminal.c_cc[VINTR] = 0;		/* eliminate interrupt	*/
269872fcea8cSEd Schouten 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
269972fcea8cSEd Schouten #else
270072fcea8cSEd Schouten 	Terminal.sg_flags |= RAW;	/* enable raw mode		*/
270172fcea8cSEd Schouten 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
270272fcea8cSEd Schouten #endif
270372fcea8cSEd Schouten }
270472fcea8cSEd Schouten 
270572fcea8cSEd Schouten void
noraw()270672fcea8cSEd Schouten noraw()			/* set to normal character read mode		*/
270772fcea8cSEd Schouten {
270872fcea8cSEd Schouten 	int value;
270972fcea8cSEd Schouten 
271072fcea8cSEd Schouten #ifdef SYS5
271172fcea8cSEd Schouten 	Terminal.c_lflag |= ICANON;	/* enable canonical operation	*/
271272fcea8cSEd Schouten 	Terminal.c_lflag |= ISIG;	/* enable signal checking	*/
271372fcea8cSEd Schouten 	Terminal.c_cc[VEOF] = 4;		/* EOF character = 4	*/
271496b676e9SEd Schouten 	Terminal.c_cc[VEOL] = '\0';	/* EOL = 0		*/
271572fcea8cSEd Schouten 	Terminal.c_cc[VINTR] = Intr;		/* reset interrupt char	*/
271672fcea8cSEd Schouten 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
271772fcea8cSEd Schouten #else
271872fcea8cSEd Schouten 	Terminal.sg_flags &= ~RAW;	/* disable raw mode		*/
271972fcea8cSEd Schouten 	value = ioctl(0, TIOCSETP, &Terminal);	/* set characteristics	*/
272072fcea8cSEd Schouten /*	old_arg = fcntl(0, F_GETFL, 0);
272172fcea8cSEd Schouten 	value = fcntl(0, F_SETFL, old_arg & ~FNDELAY);*/
272272fcea8cSEd Schouten #endif
272372fcea8cSEd Schouten }
272472fcea8cSEd Schouten 
272572fcea8cSEd Schouten void
nl()272672fcea8cSEd Schouten nl()
272772fcea8cSEd Schouten {
272872fcea8cSEd Schouten 	int value;
272972fcea8cSEd Schouten 
273072fcea8cSEd Schouten #ifdef SYS5
273172fcea8cSEd Schouten 	Terminal.c_iflag |= ICRNL;	/* enable carriage-return to line-feed mapping	*/
273272fcea8cSEd Schouten 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
273372fcea8cSEd Schouten #endif
273472fcea8cSEd Schouten }
273572fcea8cSEd Schouten 
273672fcea8cSEd Schouten void
nonl()273772fcea8cSEd Schouten nonl()
273872fcea8cSEd Schouten {
273972fcea8cSEd Schouten 	int value;
274072fcea8cSEd Schouten 
274172fcea8cSEd Schouten #ifdef SYS5
274272fcea8cSEd Schouten 	Terminal.c_iflag &= ~ICRNL;	/* disable carriage-return to line-feed mapping	*/
274372fcea8cSEd Schouten 	Terminal.c_iflag &= ~IGNCR;	/* do not ignore carriage-return	*/
274472fcea8cSEd Schouten 	value = ioctl(0, TCSETA, &Terminal);	/* set characteristics	*/
274572fcea8cSEd Schouten #endif
274672fcea8cSEd Schouten }
274772fcea8cSEd Schouten 
274872fcea8cSEd Schouten void
saveterm()274972fcea8cSEd Schouten saveterm()
275072fcea8cSEd Schouten {
275172fcea8cSEd Schouten }
275272fcea8cSEd Schouten 
275372fcea8cSEd Schouten void
fixterm()275472fcea8cSEd Schouten fixterm()
275572fcea8cSEd Schouten {
275672fcea8cSEd Schouten }
275772fcea8cSEd Schouten 
275872fcea8cSEd Schouten void
resetterm()275972fcea8cSEd Schouten resetterm()
276072fcea8cSEd Schouten {
276172fcea8cSEd Schouten }
276272fcea8cSEd Schouten 
276372fcea8cSEd Schouten void
nodelay(window,flag)276472fcea8cSEd Schouten nodelay(window, flag)
276572fcea8cSEd Schouten WINDOW *window;
276672fcea8cSEd Schouten int flag;
276772fcea8cSEd Schouten {
276872fcea8cSEd Schouten }
276972fcea8cSEd Schouten 
277072fcea8cSEd Schouten void
idlok(window,flag)277172fcea8cSEd Schouten idlok(window, flag)
277272fcea8cSEd Schouten WINDOW *window;
277372fcea8cSEd Schouten int flag;
277472fcea8cSEd Schouten {
277572fcea8cSEd Schouten }
277672fcea8cSEd Schouten 
277772fcea8cSEd Schouten void
keypad(window,flag)277872fcea8cSEd Schouten keypad(window, flag)
277972fcea8cSEd Schouten WINDOW *window;
278072fcea8cSEd Schouten int flag;
278172fcea8cSEd Schouten {
278272fcea8cSEd Schouten 	if (flag)
278372fcea8cSEd Schouten 		String_Out(String_table[ks__], NULL, 0);
278472fcea8cSEd Schouten 	else
278572fcea8cSEd Schouten 		String_Out(String_table[ke__], NULL, 0);
278672fcea8cSEd Schouten }
278772fcea8cSEd Schouten 
278872fcea8cSEd Schouten void
savetty()278972fcea8cSEd Schouten savetty()		/* save current tty stats			*/
279072fcea8cSEd Schouten {
279172fcea8cSEd Schouten 	int value;
279272fcea8cSEd Schouten 
279372fcea8cSEd Schouten #ifdef SYS5
279472fcea8cSEd Schouten 	value = ioctl(0, TCGETA, &Saved_tty);	/* set characteristics	*/
279572fcea8cSEd Schouten #else
279672fcea8cSEd Schouten 	value = ioctl(0, TIOCGETP, &Saved_tty);	/* set characteristics	*/
279772fcea8cSEd Schouten #endif
279872fcea8cSEd Schouten }
279972fcea8cSEd Schouten 
280072fcea8cSEd Schouten void
resetty()280172fcea8cSEd Schouten resetty()		/* restore previous tty stats			*/
280272fcea8cSEd Schouten {
280372fcea8cSEd Schouten 	int value;
280472fcea8cSEd Schouten 
280572fcea8cSEd Schouten #ifdef SYS5
280672fcea8cSEd Schouten 	value = ioctl(0, TCSETA, &Saved_tty);	/* set characteristics	*/
280772fcea8cSEd Schouten #else
280872fcea8cSEd Schouten 	value = ioctl(0, TIOCSETP, &Saved_tty);	/* set characteristics	*/
280972fcea8cSEd Schouten #endif
281072fcea8cSEd Schouten }
281172fcea8cSEd Schouten 
281272fcea8cSEd Schouten void
endwin()281372fcea8cSEd Schouten endwin()		/* end windows					*/
281472fcea8cSEd Schouten {
281572fcea8cSEd Schouten 	keypad(stdscr, FALSE);
281672fcea8cSEd Schouten 	initialized = FALSE;
281772fcea8cSEd Schouten 	delwin(curscr);
281872fcea8cSEd Schouten 	delwin(virtual_scr);
281972fcea8cSEd Schouten 	delwin(stdscr);
282072fcea8cSEd Schouten #ifndef SYS5
282172fcea8cSEd Schouten {
282272fcea8cSEd Schouten 	int old_arg, value;
282372fcea8cSEd Schouten /*	old_arg = fcntl(0, F_GETFL, 0);
282472fcea8cSEd Schouten 	value = fcntl(0, F_SETFL, old_arg & ~FNDELAY);*/
282572fcea8cSEd Schouten }
282672fcea8cSEd Schouten #endif
282772fcea8cSEd Schouten }
282872fcea8cSEd Schouten 
282972fcea8cSEd Schouten void
delwin(window)283072fcea8cSEd Schouten delwin(window)		/* delete the window structure			*/
283172fcea8cSEd Schouten WINDOW *window;
283272fcea8cSEd Schouten {
283372fcea8cSEd Schouten 	int i;
283472fcea8cSEd Schouten 
283572fcea8cSEd Schouten 	for (i = 1; (i < window->Num_lines) && (window->first_line->next_screen != NULL); i++)
283672fcea8cSEd Schouten 	{
283772fcea8cSEd Schouten 		window->first_line = window->first_line->next_screen;
283872fcea8cSEd Schouten 		free(window->first_line->prev_screen->row);
283972fcea8cSEd Schouten 		free(window->first_line->prev_screen->attributes);
284072fcea8cSEd Schouten 		free(window->first_line->prev_screen);
284172fcea8cSEd Schouten 	}
284272fcea8cSEd Schouten 	if (window == last_window_refreshed)
284372fcea8cSEd Schouten 		last_window_refreshed = 0;
284472fcea8cSEd Schouten 	if (window->first_line != NULL)
284572fcea8cSEd Schouten 	{
284672fcea8cSEd Schouten 		free(window->first_line->row);
284772fcea8cSEd Schouten 		free(window->first_line->attributes);
284872fcea8cSEd Schouten 		free(window->first_line);
284972fcea8cSEd Schouten 		free(window);
285072fcea8cSEd Schouten 	}
285172fcea8cSEd Schouten }
285272fcea8cSEd Schouten 
285372fcea8cSEd Schouten #ifndef __STDC__
285472fcea8cSEd Schouten void
wprintw(va_alist)285572fcea8cSEd Schouten wprintw(va_alist)
285672fcea8cSEd Schouten va_dcl
285772fcea8cSEd Schouten #else /* __STDC__ */
285872fcea8cSEd Schouten void
285972fcea8cSEd Schouten wprintw(WINDOW *window, const char *format, ...)
286072fcea8cSEd Schouten #endif /* __STDC__ */
286172fcea8cSEd Schouten {
286272fcea8cSEd Schouten #ifndef __STDC__
286372fcea8cSEd Schouten 	WINDOW *window;
286472fcea8cSEd Schouten 	char *format;
286572fcea8cSEd Schouten 	va_list ap;
286672fcea8cSEd Schouten #else
286772fcea8cSEd Schouten 	va_list ap;
286872fcea8cSEd Schouten #endif
286972fcea8cSEd Schouten 	int value;
287072fcea8cSEd Schouten 	char *fpoint;
287172fcea8cSEd Schouten 	char *wtemp;
287272fcea8cSEd Schouten 
287372fcea8cSEd Schouten #ifndef __STDC__
287472fcea8cSEd Schouten 	va_start(ap);
287572fcea8cSEd Schouten 	window = va_arg(ap, WINDOW *);
287672fcea8cSEd Schouten 	format = va_arg(ap, char *);
287772fcea8cSEd Schouten #else /* __STDC__ */
287872fcea8cSEd Schouten 	va_start(ap, format);
287972fcea8cSEd Schouten #endif /* __STDC__ */
288072fcea8cSEd Schouten 
288172fcea8cSEd Schouten 	fpoint = (char *) format;
288296b676e9SEd Schouten 	while (*fpoint != '\0')
288372fcea8cSEd Schouten 	{
288472fcea8cSEd Schouten 		if (*fpoint == '%')
288572fcea8cSEd Schouten 		{
288672fcea8cSEd Schouten 			fpoint++;
288772fcea8cSEd Schouten 			if (*fpoint == 'd')
288872fcea8cSEd Schouten 			{
288972fcea8cSEd Schouten 				value = va_arg(ap, int);
289072fcea8cSEd Schouten 				iout(window, value);
289172fcea8cSEd Schouten 			}
289272fcea8cSEd Schouten 			else if (*fpoint == 'c')
289372fcea8cSEd Schouten 			{
289472fcea8cSEd Schouten 				value = va_arg(ap, int);
289572fcea8cSEd Schouten 				waddch(window, value);
289672fcea8cSEd Schouten 			}
289772fcea8cSEd Schouten 			else if (*fpoint == 's')
289872fcea8cSEd Schouten 			{
289972fcea8cSEd Schouten 				wtemp = va_arg(ap, char *);
290072fcea8cSEd Schouten 					waddstr(window, wtemp);
290172fcea8cSEd Schouten 			}
290272fcea8cSEd Schouten 			fpoint++;
290372fcea8cSEd Schouten 		}
290472fcea8cSEd Schouten 		else if (*fpoint == '\\')
290572fcea8cSEd Schouten 		{
290672fcea8cSEd Schouten 			fpoint++;
290772fcea8cSEd Schouten 			if (*fpoint == 'n')
290872fcea8cSEd Schouten 				waddch(window, '\n');
290972fcea8cSEd Schouten 			else if ((*fpoint >= '0') && (*fpoint <= '9'))
291072fcea8cSEd Schouten 			{
291172fcea8cSEd Schouten 				value = 0;
291272fcea8cSEd Schouten 				while ((*fpoint >= '0') && (*fpoint <= '9'))
291372fcea8cSEd Schouten 				{
291472fcea8cSEd Schouten 					value = (value * 8) + (*fpoint - '0');
291572fcea8cSEd Schouten 					fpoint++;
291672fcea8cSEd Schouten 				}
291772fcea8cSEd Schouten 				waddch(window, value);
291872fcea8cSEd Schouten 			}
291972fcea8cSEd Schouten 			fpoint++;
292072fcea8cSEd Schouten 		}
292172fcea8cSEd Schouten 		else
292272fcea8cSEd Schouten 			waddch(window, *fpoint++);
292372fcea8cSEd Schouten 	}
292472fcea8cSEd Schouten #ifdef __STDC__
292572fcea8cSEd Schouten 	va_end(ap);
292672fcea8cSEd Schouten #endif /* __STDC__ */
292772fcea8cSEd Schouten }
292872fcea8cSEd Schouten 
292972fcea8cSEd Schouten void
iout(window,value)293072fcea8cSEd Schouten iout(window, value)	/* output characters		*/
293172fcea8cSEd Schouten WINDOW *window;
293272fcea8cSEd Schouten int value;
293372fcea8cSEd Schouten {
293472fcea8cSEd Schouten 	int i;
293572fcea8cSEd Schouten 
293672fcea8cSEd Schouten 	if ((i = value / 10) != 0)
293772fcea8cSEd Schouten 		iout(window, i);
293872fcea8cSEd Schouten 	waddch(window, ((value % 10) + '0'));
293972fcea8cSEd Schouten }
294072fcea8cSEd Schouten 
294172fcea8cSEd Schouten int
Comp_line(line1,line2)294272fcea8cSEd Schouten Comp_line(line1, line2)		/* compare lines	*/
294372fcea8cSEd Schouten struct _line *line1;
294472fcea8cSEd Schouten struct _line *line2;
294572fcea8cSEd Schouten {
294672fcea8cSEd Schouten 	int count1;
294772fcea8cSEd Schouten 	int i;
294872fcea8cSEd Schouten 	char *att1, *att2;
294972fcea8cSEd Schouten 	char *c1, *c2;
295072fcea8cSEd Schouten 
295172fcea8cSEd Schouten 	if (line1->last_char != line2->last_char)
295272fcea8cSEd Schouten 		return(2);
295372fcea8cSEd Schouten 
295472fcea8cSEd Schouten 	c1 = line1->row;
295572fcea8cSEd Schouten 	c2 = line2->row;
295672fcea8cSEd Schouten 	att1 = line1->attributes;
295772fcea8cSEd Schouten 	att2 = line2->attributes;
295872fcea8cSEd Schouten 	i = 0;
295996b676e9SEd Schouten 	while ((c1[i] != '\0') && (c2[i] != '\0') && (c1[i] == c2[i]) && (att1[i] == att2[i]))
296072fcea8cSEd Schouten 		i++;
296172fcea8cSEd Schouten 	count1 = i + 1;
296296b676e9SEd Schouten 	if ((count1 == 1) && (c1[i] == '\0') && (c2[i] == '\0'))
296372fcea8cSEd Schouten 		count1 = 0;			/* both lines blank	*/
296496b676e9SEd Schouten 	else if ((c1[i] == '\0') && (c2[i] == '\0'))
296572fcea8cSEd Schouten 		count1 = -1;			/* equal		*/
296672fcea8cSEd Schouten 	else
296772fcea8cSEd Schouten 		count1 = 1;			/* lines unequal	*/
296872fcea8cSEd Schouten 	return(count1);
296972fcea8cSEd Schouten }
297072fcea8cSEd Schouten 
297172fcea8cSEd Schouten struct _line *
Insert_line(row,end_row,window)297272fcea8cSEd Schouten Insert_line(row, end_row, window)	/* insert line into screen */
297372fcea8cSEd Schouten int row;
297472fcea8cSEd Schouten int end_row;
297572fcea8cSEd Schouten WINDOW *window;
297672fcea8cSEd Schouten {
297772fcea8cSEd Schouten 	int i;
297872fcea8cSEd Schouten 	struct _line *tmp;
297972fcea8cSEd Schouten 	struct _line *tmp1;
298072fcea8cSEd Schouten 
298172fcea8cSEd Schouten 	for (i = 0, tmp = curscr->first_line; i < window->SR; i++)
298272fcea8cSEd Schouten 		tmp = tmp->next_screen;
298372fcea8cSEd Schouten 	if ((end_row + window->SR) == 0)
298472fcea8cSEd Schouten 		curscr->first_line = curscr->first_line->next_screen;
298572fcea8cSEd Schouten 	top_of_win = tmp;
298672fcea8cSEd Schouten 	/*
298772fcea8cSEd Schouten 	 |	find bottom line to delete
298872fcea8cSEd Schouten 	 */
298972fcea8cSEd Schouten 	for (i = 0, tmp = top_of_win; (tmp->next_screen != NULL) && (i < end_row); i++)
299072fcea8cSEd Schouten 		tmp = tmp->next_screen;
299172fcea8cSEd Schouten 	if (tmp->prev_screen != NULL)
299272fcea8cSEd Schouten 		tmp->prev_screen->next_screen = tmp->next_screen;
299372fcea8cSEd Schouten 	if (tmp->next_screen != NULL)
299472fcea8cSEd Schouten 		tmp->next_screen->prev_screen = tmp->prev_screen;
299572fcea8cSEd Schouten 	tmp1 = tmp;
299672fcea8cSEd Schouten 	/*
299772fcea8cSEd Schouten 	 |	clear deleted line
299872fcea8cSEd Schouten 	 */
299972fcea8cSEd Schouten 	clear_line(tmp, 0, window->Num_cols);
300072fcea8cSEd Schouten 	tmp1->number = -1;
300172fcea8cSEd Schouten 	for (i = 0, tmp = curscr->first_line; (tmp->next_screen != NULL) && (i < window->SR); i++)
300272fcea8cSEd Schouten 		tmp = tmp->next_screen;
300372fcea8cSEd Schouten 	top_of_win = tmp;
300472fcea8cSEd Schouten 	for (i = 0, tmp = top_of_win; i < row; i++)
300572fcea8cSEd Schouten 		tmp = tmp->next_screen;
300672fcea8cSEd Schouten 	if ((tmp->prev_screen != NULL) && (window->Num_lines > 0))
300772fcea8cSEd Schouten 		tmp->prev_screen->next_screen = tmp1;
300872fcea8cSEd Schouten 	tmp1->prev_screen = tmp->prev_screen;
300972fcea8cSEd Schouten 	tmp->prev_screen = tmp1;
301072fcea8cSEd Schouten 	tmp1->next_screen = tmp;
301172fcea8cSEd Schouten 	if ((row + window->SR) == 0)
301272fcea8cSEd Schouten 		curscr->first_line = tmp1;
301372fcea8cSEd Schouten 	if (tmp1->next_screen != NULL)
301472fcea8cSEd Schouten 		tmp1 = tmp1->next_screen;
301572fcea8cSEd Schouten 
301672fcea8cSEd Schouten 	if ((!String_table[cs__]) && (end_row < window->Num_lines))
301772fcea8cSEd Schouten 	{
301872fcea8cSEd Schouten 		Position(window, (window->SR + end_row), 0);
301972fcea8cSEd Schouten 		String_Out(String_table[dl__], NULL, 0);
302072fcea8cSEd Schouten 	}
302172fcea8cSEd Schouten 	Position(window, (window->SR + row), 0);
302272fcea8cSEd Schouten 	if (String_table[al__] != NULL)
302372fcea8cSEd Schouten 		String_Out(String_table[al__], NULL, 0);
302472fcea8cSEd Schouten 	else
302572fcea8cSEd Schouten 		String_Out(String_table[sr__], NULL, 0);
302672fcea8cSEd Schouten 
302772fcea8cSEd Schouten 	for (i = 0, top_of_win = curscr->first_line; (top_of_win->next_screen != NULL) && (i < window->SR); i++)
302872fcea8cSEd Schouten 		top_of_win = top_of_win->next_screen;
302972fcea8cSEd Schouten 	return(tmp1);
303072fcea8cSEd Schouten }
303172fcea8cSEd Schouten 
303272fcea8cSEd Schouten 
303372fcea8cSEd Schouten struct _line *
Delete_line(row,end_row,window)303472fcea8cSEd Schouten Delete_line(row, end_row, window)	/* delete a line on screen */
303572fcea8cSEd Schouten int row;
303672fcea8cSEd Schouten int end_row;
303772fcea8cSEd Schouten WINDOW *window;
303872fcea8cSEd Schouten {
303972fcea8cSEd Schouten 	int i;
304072fcea8cSEd Schouten 	struct _line *tmp;
304172fcea8cSEd Schouten 	struct _line *tmp1;
304272fcea8cSEd Schouten 	struct _line *tmp2;
304372fcea8cSEd Schouten 
304472fcea8cSEd Schouten 	i = 0;
304572fcea8cSEd Schouten 	tmp = curscr->first_line;
304672fcea8cSEd Schouten 	while (i < window->SR)
304772fcea8cSEd Schouten 	{
304872fcea8cSEd Schouten 		i++;
304972fcea8cSEd Schouten 		tmp = tmp->next_screen;
305072fcea8cSEd Schouten 	}
305172fcea8cSEd Schouten 	/*
305272fcea8cSEd Schouten 	 |	find line to delete
305372fcea8cSEd Schouten 	 */
305472fcea8cSEd Schouten 	top_of_win = tmp;
305572fcea8cSEd Schouten 	if ((row + window->SR) == 0)
305672fcea8cSEd Schouten 		curscr->first_line = top_of_win->next_screen;
305772fcea8cSEd Schouten 	for (i = 0, tmp = top_of_win; i < row; i++)
305872fcea8cSEd Schouten 		tmp = tmp->next_screen;
305972fcea8cSEd Schouten 	if (tmp->prev_screen != NULL)
306072fcea8cSEd Schouten 		tmp->prev_screen->next_screen = tmp->next_screen;
306172fcea8cSEd Schouten 	if (tmp->next_screen != NULL)
306272fcea8cSEd Schouten 		tmp->next_screen->prev_screen = tmp->prev_screen;
306372fcea8cSEd Schouten 	tmp2 = tmp->next_screen;
306472fcea8cSEd Schouten 	tmp1 = tmp;
306572fcea8cSEd Schouten 	/*
306672fcea8cSEd Schouten 	 |	clear deleted line
306772fcea8cSEd Schouten 	 */
306872fcea8cSEd Schouten 	clear_line(tmp1, 0, window->Num_cols);
306972fcea8cSEd Schouten 	tmp1->number = -1;
307072fcea8cSEd Schouten 	/*
307172fcea8cSEd Schouten 	 |	find location to insert deleted line
307272fcea8cSEd Schouten 	 */
307372fcea8cSEd Schouten 	for (i = 0, tmp = curscr->first_line; (tmp->next_screen != NULL) && (i < window->SR); i++)
307472fcea8cSEd Schouten 		tmp = tmp->next_screen;
307572fcea8cSEd Schouten 	top_of_win = tmp;
307672fcea8cSEd Schouten 	for (i = 0, tmp = top_of_win; (i < end_row) && (tmp->next_screen != NULL); i++)
307772fcea8cSEd Schouten 		tmp = tmp->next_screen;
307872fcea8cSEd Schouten 	tmp1->next_screen = tmp;
307972fcea8cSEd Schouten 	tmp1->prev_screen = tmp->prev_screen;
308072fcea8cSEd Schouten 	if (tmp1->prev_screen != NULL)
308172fcea8cSEd Schouten 		tmp1->prev_screen->next_screen = tmp1;
308272fcea8cSEd Schouten 	tmp->prev_screen = tmp1;
308372fcea8cSEd Schouten 
308472fcea8cSEd Schouten 	Position(window, (window->SR + row), 0);
308572fcea8cSEd Schouten 	String_Out(String_table[dl__], NULL, 0);
308672fcea8cSEd Schouten 	if ((!String_table[cs__]) && (end_row < window->Num_lines))
308772fcea8cSEd Schouten 	{
308872fcea8cSEd Schouten 		Position(window, (window->SR + end_row), 0);
308972fcea8cSEd Schouten 		String_Out(String_table[al__], NULL, 0);
309072fcea8cSEd Schouten 	}
309172fcea8cSEd Schouten 	else if ((String_table[cs__] != NULL) && (String_table[dl__] == NULL))
309272fcea8cSEd Schouten 	{
309372fcea8cSEd Schouten 		Position(window, (window->SR + end_row), 0);
309472fcea8cSEd Schouten 		putchar('\n');
309572fcea8cSEd Schouten 	}
309672fcea8cSEd Schouten 
309772fcea8cSEd Schouten 	if (row == (window->Num_lines-1))
309872fcea8cSEd Schouten 		tmp2 = tmp1;
309972fcea8cSEd Schouten 	if ((row + window->SR) == 0)
310072fcea8cSEd Schouten 		curscr->first_line = top_of_win = tmp2;
310172fcea8cSEd Schouten 	return(tmp2);
310272fcea8cSEd Schouten }
310372fcea8cSEd Schouten 
310472fcea8cSEd Schouten void
CLEAR_TO_EOL(window,row,column)310572fcea8cSEd Schouten CLEAR_TO_EOL(window, row, column)
310672fcea8cSEd Schouten WINDOW *window;
310772fcea8cSEd Schouten int row, column;
310872fcea8cSEd Schouten {
310972fcea8cSEd Schouten 	int x, y;
311072fcea8cSEd Schouten 	struct _line *tmp1;
311172fcea8cSEd Schouten 
311272fcea8cSEd Schouten 	for (y = 0, tmp1 = curscr->first_line; (y < (window->SR+row)) && (tmp1->next_screen != NULL); y++)
311372fcea8cSEd Schouten 		tmp1 = tmp1->next_screen;
311472fcea8cSEd Schouten 	for (x = column; x<window->Num_cols; x++)
311572fcea8cSEd Schouten 	{
311672fcea8cSEd Schouten 		tmp1->row[x] = ' ';
311796b676e9SEd Schouten 		tmp1->attributes[x] = '\0';
311872fcea8cSEd Schouten 	}
311996b676e9SEd Schouten 	tmp1->row[column] = '\0';
312072fcea8cSEd Schouten 	tmp1->last_char = column;
312172fcea8cSEd Schouten 	if (column < COLS)
312272fcea8cSEd Schouten 	{
312372fcea8cSEd Schouten 		if (STAND)
312472fcea8cSEd Schouten 		{
312572fcea8cSEd Schouten 			STAND = FALSE;
312672fcea8cSEd Schouten 			Position(window, row, column);
312772fcea8cSEd Schouten 			attribute_off();
312872fcea8cSEd Schouten 		}
312972fcea8cSEd Schouten 		if (String_table[ce__] != NULL)
313072fcea8cSEd Schouten 			String_Out(String_table[ce__], NULL, 0);
313172fcea8cSEd Schouten 		else
313272fcea8cSEd Schouten 		{
313372fcea8cSEd Schouten 			for (x = column; x < window->Num_cols; x++)
313472fcea8cSEd Schouten 				putchar(' ');
313572fcea8cSEd Schouten 			Curr_x = x;
313672fcea8cSEd Schouten 		}
313772fcea8cSEd Schouten 	}
313872fcea8cSEd Schouten }
313972fcea8cSEd Schouten 
314072fcea8cSEd Schouten int
check_delete(window,line,offset,pointer_new,pointer_old)314172fcea8cSEd Schouten check_delete(window, line, offset, pointer_new, pointer_old)
314272fcea8cSEd Schouten WINDOW *window;
314372fcea8cSEd Schouten int line, offset;
314472fcea8cSEd Schouten struct _line *pointer_new, *pointer_old;
314572fcea8cSEd Schouten {
314672fcea8cSEd Schouten 	int end_old;
314772fcea8cSEd Schouten 	int end_new;
314872fcea8cSEd Schouten 	int k;
314972fcea8cSEd Schouten 	int changed;
315072fcea8cSEd Schouten 	char *old_lin;
315172fcea8cSEd Schouten 	char *new_lin;
315272fcea8cSEd Schouten 	char *old_att;
315372fcea8cSEd Schouten 	char *new_att;
315472fcea8cSEd Schouten 
315572fcea8cSEd Schouten 	changed = FALSE;
315672fcea8cSEd Schouten 	new_lin = pointer_new->row;
315772fcea8cSEd Schouten 	new_att = pointer_new->attributes;
315872fcea8cSEd Schouten 	old_lin = pointer_old->row;
315972fcea8cSEd Schouten 	old_att = pointer_old->attributes;
316072fcea8cSEd Schouten 	end_old = end_new = offset;
316196b676e9SEd Schouten 	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'))
316272fcea8cSEd Schouten 		end_old++;
316396b676e9SEd Schouten 	if (old_lin[end_old] != '\0')
316472fcea8cSEd Schouten 	{
316572fcea8cSEd Schouten 		k = 0;
316696b676e9SEd Schouten 		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))
316772fcea8cSEd Schouten 			k++;
316896b676e9SEd Schouten 		if ((k > 8) || ((new_lin[end_new+k] == '\0') && (k != 0)))
316972fcea8cSEd Schouten 		{
317096b676e9SEd Schouten 			if (new_lin[end_new+k] == '\0')
317172fcea8cSEd Schouten 			{
317272fcea8cSEd Schouten 				Position(window, line, (end_new+k));
317372fcea8cSEd Schouten 				CLEAR_TO_EOL(window, line, (end_new+k));
317472fcea8cSEd Schouten 			}
317572fcea8cSEd Schouten 			Position(window, line, offset);
317672fcea8cSEd Schouten 			for (k = offset; k < end_old; k++)
317772fcea8cSEd Schouten 				Char_del(old_lin, old_att, offset, window->Num_cols);
317896b676e9SEd Schouten 			while ((old_lin[offset] != '\0') && (offset < COLS))
317972fcea8cSEd Schouten 				offset++;
318072fcea8cSEd Schouten 			pointer_old->last_char = offset;
318172fcea8cSEd Schouten 			changed = TRUE;
318272fcea8cSEd Schouten 		}
318372fcea8cSEd Schouten 	}
318472fcea8cSEd Schouten 	return(changed);
318572fcea8cSEd Schouten }
318672fcea8cSEd Schouten 
318772fcea8cSEd Schouten /*
318872fcea8cSEd Schouten  |	Check if characters were inserted in the middle of a line, and if
318972fcea8cSEd Schouten  |	so, insert them.
319072fcea8cSEd Schouten  */
319172fcea8cSEd Schouten 
319272fcea8cSEd Schouten int
check_insert(window,line,offset,pointer_new,pointer_old)319372fcea8cSEd Schouten check_insert(window, line, offset, pointer_new, pointer_old)
319472fcea8cSEd Schouten WINDOW *window;
319572fcea8cSEd Schouten int line, offset;
319672fcea8cSEd Schouten struct _line *pointer_new, *pointer_old;
319772fcea8cSEd Schouten {
319872fcea8cSEd Schouten 	int changed;
319972fcea8cSEd Schouten 	int end_old, end_new;
320072fcea8cSEd Schouten 	int k;
320172fcea8cSEd Schouten 	int same = FALSE;
320272fcea8cSEd Schouten 	int old_off;
320372fcea8cSEd Schouten 	int insert;
320472fcea8cSEd Schouten 	char *old_lin;
320572fcea8cSEd Schouten 	char *new_lin;
320672fcea8cSEd Schouten 	char *old_att;
320772fcea8cSEd Schouten 	char *new_att;
320872fcea8cSEd Schouten 
320972fcea8cSEd Schouten 	changed = FALSE;
321072fcea8cSEd Schouten 	new_lin = pointer_new->row;
321172fcea8cSEd Schouten 	new_att = pointer_new->attributes;
321272fcea8cSEd Schouten 	old_lin = pointer_old->row;
321372fcea8cSEd Schouten 	old_att = pointer_old->attributes;
321472fcea8cSEd Schouten 	end_old = end_new = offset;
321596b676e9SEd Schouten 	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'))
321672fcea8cSEd Schouten 		end_new++;
321796b676e9SEd Schouten 	if (new_lin[end_new] != '\0')
321872fcea8cSEd Schouten 	{
321972fcea8cSEd Schouten 		k = 0;
322096b676e9SEd Schouten 		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))
322172fcea8cSEd Schouten 			k++;
322272fcea8cSEd Schouten 		/*
322372fcea8cSEd Schouten 		 |  check for commonality between rest of lines (are the old
322472fcea8cSEd Schouten 		 |  and new lines the same, except for a chunk in the middle?)
322572fcea8cSEd Schouten 		 |  if the rest of the lines are common, do not insert text
322672fcea8cSEd Schouten 		 */
322772fcea8cSEd Schouten 		old_off = end_new;
322896b676e9SEd Schouten 		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]))
322972fcea8cSEd Schouten 			old_off++;
323072fcea8cSEd Schouten 		if ((old_lin[old_off] == new_lin[old_off]) && (old_att[old_off] == new_att[old_off]))
323172fcea8cSEd Schouten 			same = TRUE;
323296b676e9SEd Schouten 		if ((!same) && ((k > 8) || ((new_lin[end_new+k] == '\0') && (k != 0))))
323372fcea8cSEd Schouten 		{
323472fcea8cSEd Schouten 			Position(window, line, offset);
323572fcea8cSEd Schouten 			insert = FALSE;
323672fcea8cSEd Schouten 			if (String_table[ic__] == NULL)
323772fcea8cSEd Schouten 			{
323872fcea8cSEd Schouten 				String_Out(String_table[im__], NULL, 0);
323972fcea8cSEd Schouten 				insert = TRUE;
324072fcea8cSEd Schouten 			}
324172fcea8cSEd Schouten 			for (k = offset; k < end_new; k++)
324272fcea8cSEd Schouten 			{
324372fcea8cSEd Schouten 				if (!insert)
324472fcea8cSEd Schouten 					String_Out(String_table[ic__], NULL, 0);
324572fcea8cSEd Schouten 				Char_ins(old_lin, old_att, new_lin[k], new_att[k], k, window->Num_cols);
324672fcea8cSEd Schouten 			}
324772fcea8cSEd Schouten 			if (insert)
324872fcea8cSEd Schouten 				String_Out(String_table[ei__], NULL, 0);
324996b676e9SEd Schouten 			while ((old_lin[offset] != '\0') && (offset < COLS))
325072fcea8cSEd Schouten 				offset++;
325172fcea8cSEd Schouten 			pointer_old->last_char = offset;
325272fcea8cSEd Schouten 			changed = TRUE;
325372fcea8cSEd Schouten 		}
325472fcea8cSEd Schouten 	}
325572fcea8cSEd Schouten 	return(changed);
325672fcea8cSEd Schouten }
325772fcea8cSEd Schouten 
325872fcea8cSEd Schouten void
doupdate()325972fcea8cSEd Schouten doupdate()
326072fcea8cSEd Schouten {
326172fcea8cSEd Schouten 	WINDOW *window;
326272fcea8cSEd Schouten 	int similar;
326372fcea8cSEd Schouten 	int diff;
326472fcea8cSEd Schouten 	int begin_old, begin_new;
326572fcea8cSEd Schouten 	int end_old, end_new;
326672fcea8cSEd Schouten 	int count1, j;
326772fcea8cSEd Schouten 	int from_top, tmp_ft, offset;
326872fcea8cSEd Schouten 	int changed;
326972fcea8cSEd Schouten 	int first_time;
327072fcea8cSEd Schouten 	int first_same;
327172fcea8cSEd Schouten 	int last_same;
327272fcea8cSEd Schouten 	int list[10];
327372fcea8cSEd Schouten 	int bottom;
327472fcea8cSEd Schouten 
327572fcea8cSEd Schouten 	struct _line *curr;
327672fcea8cSEd Schouten 	struct _line *virt;
327772fcea8cSEd Schouten 	struct _line *old;
327872fcea8cSEd Schouten 
327972fcea8cSEd Schouten 	struct _line *new;
328072fcea8cSEd Schouten 
328172fcea8cSEd Schouten 	struct _line *old1, *new1;
328272fcea8cSEd Schouten 
328372fcea8cSEd Schouten 	char *cur_lin;
328472fcea8cSEd Schouten 	char *vrt_lin;
328572fcea8cSEd Schouten 	char *cur_att;
328672fcea8cSEd Schouten 	char *vrt_att;
328772fcea8cSEd Schouten 	char *att1, *att2;
328872fcea8cSEd Schouten 	char *c1, *c2;
328972fcea8cSEd Schouten 
329072fcea8cSEd Schouten 	char NC_chinese = FALSE;	/* flag to indicate handling Chinese */
329172fcea8cSEd Schouten 
329272fcea8cSEd Schouten 	window = virtual_scr;
329372fcea8cSEd Schouten 
329472fcea8cSEd Schouten 	if ((nc_attributes & A_NC_BIG5) != 0)
329572fcea8cSEd Schouten 		NC_chinese = TRUE;
329672fcea8cSEd Schouten 
329772fcea8cSEd Schouten 	if (Repaint_screen)
329872fcea8cSEd Schouten 	{
329972fcea8cSEd Schouten 		if (String_table[cl__])
330072fcea8cSEd Schouten 			String_Out(String_table[cl__], NULL, 0);
330172fcea8cSEd Schouten 		else
330272fcea8cSEd Schouten 		{
330372fcea8cSEd Schouten 			from_top = 0;
330472fcea8cSEd Schouten 			while (from_top < LINES)
330572fcea8cSEd Schouten 			{
330672fcea8cSEd Schouten 				Position(curscr, from_top, 0);
330772fcea8cSEd Schouten 				if (String_table[ce__] != NULL)
330872fcea8cSEd Schouten 					String_Out(String_table[ce__], NULL, 0);
330972fcea8cSEd Schouten 				else
331072fcea8cSEd Schouten 				{
331172fcea8cSEd Schouten 					for (j = 0; j < window->Num_cols; j++)
331272fcea8cSEd Schouten 						putchar(' ');
331372fcea8cSEd Schouten 				}
331472fcea8cSEd Schouten 				from_top++;
331572fcea8cSEd Schouten 			}
331672fcea8cSEd Schouten 		}
331772fcea8cSEd Schouten 		for (from_top = 0, curr = curscr->first_line; from_top < curscr->Num_lines; from_top++, curr = curr->next_screen)
331872fcea8cSEd Schouten 		{
331972fcea8cSEd Schouten 			Position(curscr, from_top, 0);
332096b676e9SEd Schouten 			for (j = 0; (curr->row[j] != '\0') && (j < curscr->Num_cols); j++)
332172fcea8cSEd Schouten 			{
332272fcea8cSEd Schouten 				Char_out(curr->row[j], curr->attributes[j], curr->row, curr->attributes, j);
332372fcea8cSEd Schouten 			}
332472fcea8cSEd Schouten 			if (STAND)
332572fcea8cSEd Schouten 			{
332672fcea8cSEd Schouten 				STAND = FALSE;
332772fcea8cSEd Schouten 				Position(curscr, from_top, j);
332872fcea8cSEd Schouten 				attribute_off();
332972fcea8cSEd Schouten 			}
333072fcea8cSEd Schouten 		}
333172fcea8cSEd Schouten 		Repaint_screen = FALSE;
333272fcea8cSEd Schouten 	}
333372fcea8cSEd Schouten 
333472fcea8cSEd Schouten 	similar = 0;
333572fcea8cSEd Schouten 	diff = FALSE;
333672fcea8cSEd Schouten 	top_of_win = curscr->first_line;
333772fcea8cSEd Schouten 
333872fcea8cSEd Schouten 	for (from_top = 0, curr = top_of_win, virt = window->first_line;
333972fcea8cSEd Schouten 			from_top < window->Num_lines; from_top++)
334072fcea8cSEd Schouten 	{
334172fcea8cSEd Schouten 		virtual_lines[from_top] = TRUE;
334272fcea8cSEd Schouten 		if ((similar = Comp_line(curr, virt)) > 0)
334372fcea8cSEd Schouten 		{
334472fcea8cSEd Schouten 			virtual_lines[from_top] = FALSE;
334572fcea8cSEd Schouten 			diff = TRUE;
334672fcea8cSEd Schouten 		}
334772fcea8cSEd Schouten 		curr = curr->next_screen;
334872fcea8cSEd Schouten 		virt = virt->next_screen;
334972fcea8cSEd Schouten 	}
335072fcea8cSEd Schouten 
335172fcea8cSEd Schouten 	from_top = 0;
335272fcea8cSEd Schouten 	virt = window->first_line;
335372fcea8cSEd Schouten 	curr = top_of_win;
335472fcea8cSEd Schouten 	similar = 0;
335572fcea8cSEd Schouten 	/*
335672fcea8cSEd Schouten 	 |  if the window has lines that are different, check for scrolling
335772fcea8cSEd Schouten 	 */
335872fcea8cSEd Schouten 	if (diff)
335972fcea8cSEd Schouten 	{
336072fcea8cSEd Schouten 		last_same = -1;
336172fcea8cSEd Schouten 		changed = FALSE;
336272fcea8cSEd Schouten 		for (first_same = window->Num_lines;
336372fcea8cSEd Schouten 		    (first_same > from_top) && (virtual_lines[first_same - 1]);
336472fcea8cSEd Schouten 		     first_same--)
336572fcea8cSEd Schouten 			;
336672fcea8cSEd Schouten 		for (last_same = 0;
336772fcea8cSEd Schouten 		    (last_same < window->Num_lines) && (virtual_lines[last_same]== FALSE);
336872fcea8cSEd Schouten 		     last_same++)
336972fcea8cSEd Schouten 			;
337072fcea8cSEd Schouten 		while ((from_top < first_same) && nc_scrolling_ability)
337172fcea8cSEd Schouten 					/* check entire lines for diffs	*/
337272fcea8cSEd Schouten 		{
337372fcea8cSEd Schouten 
337472fcea8cSEd Schouten 			if (from_top >= last_same)
337572fcea8cSEd Schouten 			{
337672fcea8cSEd Schouten 				for (last_same = from_top;
337772fcea8cSEd Schouten 				     (last_same < window->Num_lines) &&
337872fcea8cSEd Schouten 				     (virtual_lines[last_same] == FALSE);
337972fcea8cSEd Schouten 				      last_same++)
338072fcea8cSEd Schouten 					;
338172fcea8cSEd Schouten 			}
338272fcea8cSEd Schouten 			if (!virtual_lines[from_top])
338372fcea8cSEd Schouten 			{
338472fcea8cSEd Schouten 				diff = TRUE;
338572fcea8cSEd Schouten 				/*
338672fcea8cSEd Schouten 				 |	check for lines deleted (scroll up)
338772fcea8cSEd Schouten 				 */
338872fcea8cSEd Schouten 				for (tmp_ft = from_top+1, old = curr->next_screen;
338972fcea8cSEd Schouten 					((window->scroll_up) && (diff) &&
339072fcea8cSEd Schouten 					(tmp_ft < last_same) &&
339172fcea8cSEd Schouten 					(!virtual_lines[tmp_ft]));
339272fcea8cSEd Schouten 						tmp_ft++)
339372fcea8cSEd Schouten 				{
339472fcea8cSEd Schouten 					if ((Comp_line(old, virt) == -1) && (!virtual_lines[from_top]))
339572fcea8cSEd Schouten 					{
339672fcea8cSEd Schouten 						/*
339772fcea8cSEd Schouten 						 |	Find the bottom of the
339872fcea8cSEd Schouten 						 |	area that should be
339972fcea8cSEd Schouten 						 |	scrolled.
340072fcea8cSEd Schouten 						 */
340172fcea8cSEd Schouten 						for (bottom = tmp_ft, old1 = old,
340272fcea8cSEd Schouten 						     new1 = virt, count1 = 0;
340372fcea8cSEd Schouten 							(bottom < window->Num_lines) &&
340472fcea8cSEd Schouten 								(Comp_line(old1, new1) <= 0);
340572fcea8cSEd Schouten 								bottom++, old1 = old1->next_screen,
340672fcea8cSEd Schouten 								new1 = new1->next_screen,
340772fcea8cSEd Schouten 								count1++)
340872fcea8cSEd Schouten 							;
340972fcea8cSEd Schouten 						if (count1 > 3)
341072fcea8cSEd Schouten 						{
341172fcea8cSEd Schouten 							if (String_table[cs__]) /* scrolling region */
341272fcea8cSEd Schouten 							{
341372fcea8cSEd Schouten 								list[1] = from_top;
341472fcea8cSEd Schouten 								list[0] = min((bottom - 1), (window->Num_lines - 1));
341572fcea8cSEd Schouten 								String_Out(String_table[cs__], list, 2);
341672fcea8cSEd Schouten 								Curr_y = Curr_x = -1;
341772fcea8cSEd Schouten 							}
341872fcea8cSEd Schouten 
341972fcea8cSEd Schouten 							for (offset = (tmp_ft - from_top); (offset > 0); offset--)
342072fcea8cSEd Schouten 							{
342172fcea8cSEd Schouten 								old = Delete_line(from_top, min((bottom - 1), (window->Num_lines - 1)), window);
342272fcea8cSEd Schouten 								diff = FALSE;
342372fcea8cSEd Schouten 							}
342472fcea8cSEd Schouten 
342572fcea8cSEd Schouten 							if (String_table[cs__]) /* scrolling region */
342672fcea8cSEd Schouten 							{
342772fcea8cSEd Schouten 								list[1] = 0;
342872fcea8cSEd Schouten 								list[0] = LINES - 1;
342972fcea8cSEd Schouten 								String_Out(String_table[cs__], list, 2);
343072fcea8cSEd Schouten 								Curr_y = Curr_x = -1;
343172fcea8cSEd Schouten 							}
343272fcea8cSEd Schouten 
343372fcea8cSEd Schouten 							top_of_win = curscr->first_line;
343472fcea8cSEd Schouten 							curr = top_of_win;
343572fcea8cSEd Schouten 							for (offset = 0; offset < from_top; offset++)
343672fcea8cSEd Schouten 								curr = curr->next_screen;
343772fcea8cSEd Schouten 							for (offset = from_top, old=curr, new=virt;
343872fcea8cSEd Schouten 							   offset < window->Num_lines;
343972fcea8cSEd Schouten 							   old=old->next_screen, new=new->next_screen,
344072fcea8cSEd Schouten 							   offset++)
344172fcea8cSEd Schouten 							{
344272fcea8cSEd Schouten 								similar = Comp_line(old, new);
344372fcea8cSEd Schouten 								virtual_lines[offset] = (similar > 0 ? FALSE : TRUE);
344472fcea8cSEd Schouten 							}
344572fcea8cSEd Schouten 						}
344672fcea8cSEd Schouten 					}
344772fcea8cSEd Schouten 					else
344872fcea8cSEd Schouten 						old = old->next_screen;
344972fcea8cSEd Schouten 				}
345072fcea8cSEd Schouten 				/*
345172fcea8cSEd Schouten 				 |	check for lines inserted (scroll down)
345272fcea8cSEd Schouten 				 */
345372fcea8cSEd Schouten 				for (tmp_ft = from_top-1, old = curr->prev_screen;
345472fcea8cSEd Schouten 					((window->scroll_down) && (tmp_ft >= 0) &&
345572fcea8cSEd Schouten 					(diff) &&
345672fcea8cSEd Schouten 					(!virtual_lines[tmp_ft]));
345772fcea8cSEd Schouten 					  tmp_ft--)
345872fcea8cSEd Schouten 				{
345972fcea8cSEd Schouten 					if (Comp_line(old, virt) == -1)
346072fcea8cSEd Schouten 					{
346172fcea8cSEd Schouten 						/*
346272fcea8cSEd Schouten 						 |	Find the bottom of the
346372fcea8cSEd Schouten 						 |	area that should be
346472fcea8cSEd Schouten 						 |	scrolled.
346572fcea8cSEd Schouten 						 */
346672fcea8cSEd Schouten 						for (bottom = from_top, old1 = old,
346772fcea8cSEd Schouten 						     new1 = virt, count1 = 0;
346872fcea8cSEd Schouten 							(bottom < window->Num_lines) &&
346972fcea8cSEd Schouten 								(Comp_line(old1, new1) <= 0);
347072fcea8cSEd Schouten 								bottom++, old1 = old1->next_screen,
347172fcea8cSEd Schouten 								new1 = new1->next_screen,
347272fcea8cSEd Schouten 								count1++)
347372fcea8cSEd Schouten 							;
347472fcea8cSEd Schouten 						if (count1 > 3)
347572fcea8cSEd Schouten 						{
347672fcea8cSEd Schouten 							if (String_table[cs__]) /* scrolling region */
347772fcea8cSEd Schouten 							{
347872fcea8cSEd Schouten 								list[1] = tmp_ft;
347972fcea8cSEd Schouten 								list[0] = min((bottom - 1), (window->Num_lines - 1));
348072fcea8cSEd Schouten 								String_Out(String_table[cs__], list, 2);
348172fcea8cSEd Schouten 								Curr_y = Curr_x = -1;
348272fcea8cSEd Schouten 							}
348372fcea8cSEd Schouten 
348472fcea8cSEd Schouten 							for (offset = (from_top - tmp_ft); (offset > 0); offset--)
348572fcea8cSEd Schouten 							{
348672fcea8cSEd Schouten 								old = Insert_line(tmp_ft, min((bottom - 1), (window->Num_lines -1)), window);
348772fcea8cSEd Schouten 								diff = FALSE;
348872fcea8cSEd Schouten 							}
348972fcea8cSEd Schouten 
349072fcea8cSEd Schouten 							if (String_table[cs__]) /* scrolling region */
349172fcea8cSEd Schouten 							{
349272fcea8cSEd Schouten 								list[1] = 0;
349372fcea8cSEd Schouten 								list[0] = LINES - 1;
349472fcea8cSEd Schouten 								String_Out(String_table[cs__], list, 2);
349572fcea8cSEd Schouten 								Curr_y = Curr_x = -1;
349672fcea8cSEd Schouten 							}
349772fcea8cSEd Schouten 
349872fcea8cSEd Schouten 							top_of_win = curscr->first_line;
349972fcea8cSEd Schouten 							curr = top_of_win;
350072fcea8cSEd Schouten 							for (offset = 0; offset < from_top; offset++)
350172fcea8cSEd Schouten 								curr = curr->next_screen;
350272fcea8cSEd Schouten 							for (offset = from_top, old=curr, new=virt;
350372fcea8cSEd Schouten 							   offset < window->Num_lines;
350472fcea8cSEd Schouten 							   old=old->next_screen, new=new->next_screen,
350572fcea8cSEd Schouten 							   offset++)
350672fcea8cSEd Schouten 							{
350772fcea8cSEd Schouten 								similar = Comp_line(old, new);
350872fcea8cSEd Schouten 								virtual_lines[offset] = (similar > 0 ? FALSE : TRUE);
350972fcea8cSEd Schouten 							}
351072fcea8cSEd Schouten 						}
351172fcea8cSEd Schouten 					}
351272fcea8cSEd Schouten 					else
351372fcea8cSEd Schouten 						old = old->prev_screen;
351472fcea8cSEd Schouten 				}
351572fcea8cSEd Schouten 			}
351672fcea8cSEd Schouten 			from_top++;
351772fcea8cSEd Schouten 			curr = curr->next_screen;
351872fcea8cSEd Schouten 			virt = virt->next_screen;
351972fcea8cSEd Schouten 		}
352072fcea8cSEd Schouten 	}
352172fcea8cSEd Schouten 
352272fcea8cSEd Schouten 
352372fcea8cSEd Schouten 	/*
352472fcea8cSEd Schouten 	 |	Scrolling done, now need to insert, delete, or modify text
352572fcea8cSEd Schouten 	 |	within lines.
352672fcea8cSEd Schouten 	 */
352772fcea8cSEd Schouten 
352872fcea8cSEd Schouten 	for (from_top = 0, curr = curscr->first_line; from_top < window->SR; from_top++)
352972fcea8cSEd Schouten 		curr = curr->next_screen;
353072fcea8cSEd Schouten 	top_of_win = curr;
353172fcea8cSEd Schouten 	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)
353272fcea8cSEd Schouten 	{
353372fcea8cSEd Schouten 
353472fcea8cSEd Schouten 		/*
353572fcea8cSEd Schouten 		 |	If either 'insert mode' or 'insert char' are
353672fcea8cSEd Schouten 		 |	available, enter the following 'if' statement,
353772fcea8cSEd Schouten 		 |	else, need to simply rewrite the contents of the line
353872fcea8cSEd Schouten 		 |	at the point where the contents of the line change.
353972fcea8cSEd Schouten 		 */
354072fcea8cSEd Schouten 
354172fcea8cSEd Schouten 		if (((String_table[ic__]) || (String_table[im__])) &&
354296b676e9SEd Schouten 		    (String_table[dc__]) && (curr->row[0] != '\0') &&
354372fcea8cSEd Schouten 		    (!NC_chinese))
354472fcea8cSEd Schouten 		{
354572fcea8cSEd Schouten 			j = 0;
354672fcea8cSEd Schouten 			first_time = TRUE;
354772fcea8cSEd Schouten 			vrt_lin = virt->row;
354872fcea8cSEd Schouten 			vrt_att = virt->attributes;
354972fcea8cSEd Schouten 			cur_lin = curr->row;
355072fcea8cSEd Schouten 			cur_att = curr->attributes;
355196b676e9SEd Schouten 			while ((vrt_lin[j] != '\0') && (j < window->Num_cols))
355272fcea8cSEd Schouten 			{
355372fcea8cSEd Schouten 				if ((STAND) && (Booleans[xs__]))
355472fcea8cSEd Schouten 				{
355596b676e9SEd Schouten 					while ((vrt_lin[j] == cur_lin[j]) && (vrt_att[j] == cur_att[j]) && (vrt_lin[j] != '\0') && (vrt_att[j]))
355672fcea8cSEd Schouten 						j++;
355772fcea8cSEd Schouten 					if ((STAND) && (!vrt_att[j]))
355872fcea8cSEd Schouten 					{
355972fcea8cSEd Schouten 						STAND = FALSE;
356072fcea8cSEd Schouten 						Position(window, from_top, j);
356172fcea8cSEd Schouten 						attribute_off();
356272fcea8cSEd Schouten 						attribute_off();
356372fcea8cSEd Schouten 					}
356472fcea8cSEd Schouten 				}
356572fcea8cSEd Schouten 				else
356672fcea8cSEd Schouten 				{
356796b676e9SEd Schouten 					while ((vrt_lin[j] == cur_lin[j]) && (vrt_att[j] == cur_att[j]) && (vrt_lin[j] != '\0'))
356872fcea8cSEd Schouten 						j++;
356972fcea8cSEd Schouten 				}
357072fcea8cSEd Schouten 				if ((vrt_att[j] != cur_att[j]) && (cur_att[j]) && (Booleans[xs__]))
357172fcea8cSEd Schouten 				{
357272fcea8cSEd Schouten 					Position(window, from_top, j);
357372fcea8cSEd Schouten /*					CLEAR_TO_EOL(window, from_top, j);*/
357472fcea8cSEd Schouten 					attribute_off();
357572fcea8cSEd Schouten 					attribute_off();
357672fcea8cSEd Schouten 				}
357796b676e9SEd Schouten 				if (vrt_lin[j] != '\0')
357872fcea8cSEd Schouten 				{
357972fcea8cSEd Schouten 					begin_new = j;
358072fcea8cSEd Schouten 					begin_old = j;
358172fcea8cSEd Schouten 					end_old = j;
358272fcea8cSEd Schouten 					end_new = j;
358372fcea8cSEd Schouten 					if ((first_time) && (virt->changed))
358472fcea8cSEd Schouten 					{
358572fcea8cSEd Schouten 						if (curr->last_char <= virt->last_char)
358672fcea8cSEd Schouten 							changed = check_insert(window, from_top, j, virt, curr);
358772fcea8cSEd Schouten 					}
358872fcea8cSEd Schouten 					changed = check_delete(window, from_top, j, virt, curr);
358972fcea8cSEd Schouten 					first_time = FALSE;
359072fcea8cSEd Schouten 					virt->changed = FALSE;
359172fcea8cSEd Schouten 					if (!changed)
359272fcea8cSEd Schouten 						changed = check_insert(window, from_top, j, virt, curr);
359372fcea8cSEd Schouten 					if (((!changed) || (cur_lin[j] != vrt_lin[j]) || (cur_att[j] != vrt_att[j])) && (j < window->Num_cols))
359472fcea8cSEd Schouten 					{
359596b676e9SEd Schouten 						if ((vrt_lin[j] == ' ') && (cur_lin[j] == '\0') && (vrt_att[j] == cur_att[j]))
359672fcea8cSEd Schouten 							cur_lin[j] = ' ';
359772fcea8cSEd Schouten 						else
359872fcea8cSEd Schouten 						{
359972fcea8cSEd Schouten 							Position(window, from_top, j);
360072fcea8cSEd Schouten 							Char_out(vrt_lin[j], vrt_att[j], cur_lin, cur_att, j);
360172fcea8cSEd Schouten 						}
360272fcea8cSEd Schouten 					}
360396b676e9SEd Schouten 					if ((vrt_lin[j] != '\0'))
360472fcea8cSEd Schouten 						j++;
360572fcea8cSEd Schouten 				}
360672fcea8cSEd Schouten 				if ((STAND) && (!vrt_att[j]))
360772fcea8cSEd Schouten 				{
360872fcea8cSEd Schouten 					STAND = FALSE;
360972fcea8cSEd Schouten 					Position(window, from_top, j);
361072fcea8cSEd Schouten 					attribute_off();
361172fcea8cSEd Schouten 				}
361272fcea8cSEd Schouten 			}
361396b676e9SEd Schouten 			if ((vrt_lin[j] == '\0') && (cur_lin[j] != '\0'))
361472fcea8cSEd Schouten 			{
361572fcea8cSEd Schouten 				Position(window, from_top, j);
361672fcea8cSEd Schouten 				CLEAR_TO_EOL(window, from_top, j);
361772fcea8cSEd Schouten 			}
361872fcea8cSEd Schouten 		}
361972fcea8cSEd Schouten 		else /*if ((similar != -1) && (similar != 0))*/
362072fcea8cSEd Schouten 		{
362172fcea8cSEd Schouten 			j = 0;
362272fcea8cSEd Schouten 			c1 = curr->row;
362372fcea8cSEd Schouten 			att1 = curr->attributes;
362472fcea8cSEd Schouten 			c2 = virt->row;
362572fcea8cSEd Schouten 			att2 = virt->attributes;
362696b676e9SEd Schouten 			while ((j < window->Num_cols) && (c2[j] != '\0'))
362772fcea8cSEd Schouten 			{
362896b676e9SEd Schouten 				while ((c1[j] == c2[j]) && (att1[j] == att2[j]) && (j < window->Num_cols) && (c2[j] != '\0'))
362972fcea8cSEd Schouten 					j++;
363072fcea8cSEd Schouten 
363172fcea8cSEd Schouten 				/*
363272fcea8cSEd Schouten 				 |	if previous character is an eight bit
363372fcea8cSEd Schouten 				 |	char, start redraw from that character
363472fcea8cSEd Schouten 				 */
363572fcea8cSEd Schouten 
363672fcea8cSEd Schouten 				if ((NC_chinese) && (highbitset(c1[j - 1])))
363772fcea8cSEd Schouten 					j--;
363872fcea8cSEd Schouten 				begin_old = j;
363972fcea8cSEd Schouten 				begin_new = j;
364096b676e9SEd Schouten 				if ((j < window->Num_cols) && (c2[j] != '\0'))
364172fcea8cSEd Schouten 				{
364272fcea8cSEd Schouten 					Position(window, from_top, begin_old);
364372fcea8cSEd Schouten 					CLEAR_TO_EOL(window, from_top, j);
364472fcea8cSEd Schouten 					Position(window, from_top, begin_old);
364596b676e9SEd Schouten 					for (j = begin_old; (c2[j] != '\0') && (j < window->Num_cols); j++)
364672fcea8cSEd Schouten 						Char_out(c2[j], att2[j], c1, att1, j);
364772fcea8cSEd Schouten 				}
364872fcea8cSEd Schouten 			}
364996b676e9SEd Schouten 			if ((c2[j] == '\0') && (c1[j] != '\0'))
365072fcea8cSEd Schouten 			{
365172fcea8cSEd Schouten 				Position(window, from_top, j);
365272fcea8cSEd Schouten 				CLEAR_TO_EOL(window, from_top, j);
365372fcea8cSEd Schouten 			}
365472fcea8cSEd Schouten 		}
365572fcea8cSEd Schouten 		if (STAND)
365672fcea8cSEd Schouten 		{
365772fcea8cSEd Schouten 			STAND = FALSE;
365872fcea8cSEd Schouten 			Position(window, from_top, j);
365972fcea8cSEd Schouten 			attribute_off();
366072fcea8cSEd Schouten 		}
366172fcea8cSEd Schouten 		virt->number = from_top;
366272fcea8cSEd Schouten 	}
366372fcea8cSEd Schouten 	Position(window, window->LY, window->LX);
366472fcea8cSEd Schouten }
366572fcea8cSEd Schouten 
366672fcea8cSEd Schouten void
Position(window,row,col)366772fcea8cSEd Schouten Position(window, row, col)	/* position the cursor for output on the screen	*/
366872fcea8cSEd Schouten WINDOW *window;
366972fcea8cSEd Schouten int row;
367072fcea8cSEd Schouten int col;
367172fcea8cSEd Schouten {
367272fcea8cSEd Schouten 	int list[10];
367372fcea8cSEd Schouten 	int place;
367472fcea8cSEd Schouten 
367572fcea8cSEd Schouten 	int pos_row;
367672fcea8cSEd Schouten 	int pos_column;
367772fcea8cSEd Schouten 
367872fcea8cSEd Schouten 	pos_row = row + window->SR;
367972fcea8cSEd Schouten 	pos_column = col + window->SC;
368072fcea8cSEd Schouten 	if ((pos_row != Curr_y) || (pos_column != Curr_x))
368172fcea8cSEd Schouten 	{
368272fcea8cSEd Schouten 		if (String_table[cm__] != NULL) /* && (row < window->Num_lines) && (column < window->Num_cols))*/
368372fcea8cSEd Schouten 		{
368472fcea8cSEd Schouten 			place = 0;
368572fcea8cSEd Schouten 			list[place++] = pos_column;
368672fcea8cSEd Schouten 			list[place++] = pos_row;
368772fcea8cSEd Schouten 			String_Out(String_table[cm__], list, place);
368872fcea8cSEd Schouten 			if ((STAND) && (!Booleans[ms__]))
368972fcea8cSEd Schouten 				attribute_on();
369072fcea8cSEd Schouten 		}
369172fcea8cSEd Schouten 		Curr_x = pos_column;
369272fcea8cSEd Schouten 		Curr_y = pos_row;
369372fcea8cSEd Schouten 	}
369472fcea8cSEd Schouten }
369572fcea8cSEd Schouten 
369672fcea8cSEd Schouten void
Char_del(line,attrib,offset,maxlen)369772fcea8cSEd Schouten Char_del(line, attrib, offset, maxlen)	/* delete chars from line	*/
369872fcea8cSEd Schouten char *line;
369972fcea8cSEd Schouten char *attrib;
370072fcea8cSEd Schouten int offset;
370172fcea8cSEd Schouten int maxlen;
370272fcea8cSEd Schouten {
370372fcea8cSEd Schouten 	int one, two;
370472fcea8cSEd Schouten 
370596b676e9SEd Schouten 	for (one = offset, two = offset+1; (line[one] != '\0') && (one < maxlen); one++, two++)
370672fcea8cSEd Schouten 	{
370772fcea8cSEd Schouten 		line[one] = line[two];
370872fcea8cSEd Schouten 		attrib[one] = attrib[two];
370972fcea8cSEd Schouten 	}
371072fcea8cSEd Schouten 	String_Out(String_table[dc__], NULL, 0);
371172fcea8cSEd Schouten }
371272fcea8cSEd Schouten 
371372fcea8cSEd Schouten void
Char_ins(line,attrib,newc,newatt,offset,maxlen)371472fcea8cSEd Schouten Char_ins(line, attrib, newc, newatt, offset, maxlen)	/* insert chars in line	*/
371572fcea8cSEd Schouten char *line;
371672fcea8cSEd Schouten char *attrib;
371772fcea8cSEd Schouten char newc;
371872fcea8cSEd Schouten char newatt;
371972fcea8cSEd Schouten int offset;
372072fcea8cSEd Schouten int maxlen;
372172fcea8cSEd Schouten {
372272fcea8cSEd Schouten 	int one, two;
372372fcea8cSEd Schouten 
372472fcea8cSEd Schouten 	one = 0;
372596b676e9SEd Schouten 	while ((line[one] != '\0') && (one < (maxlen - 2)))
372672fcea8cSEd Schouten 		one++;
372772fcea8cSEd Schouten 	for (two = one + 1; (two > offset); one--, two--)
372872fcea8cSEd Schouten 	{
372972fcea8cSEd Schouten 		line[two] = line[one];
373072fcea8cSEd Schouten 		attrib[two] = attrib[one];
373172fcea8cSEd Schouten 	}
373272fcea8cSEd Schouten 	line[offset] = newc;
373372fcea8cSEd Schouten 	attrib[offset] = newatt;
373472fcea8cSEd Schouten 	Char_out(newc, newatt, line, attrib, offset);
373572fcea8cSEd Schouten }
373672fcea8cSEd Schouten 
373772fcea8cSEd Schouten void
attribute_on()373872fcea8cSEd Schouten attribute_on()
373972fcea8cSEd Schouten {
374072fcea8cSEd Schouten 	if (String_table[sa__])
374172fcea8cSEd Schouten 	{
374272fcea8cSEd Schouten 		attributes_set[0] = 1;
374372fcea8cSEd Schouten 		String_Out(String_table[sa__], attributes_set, 1);
374472fcea8cSEd Schouten 	}
374572fcea8cSEd Schouten 	else if (String_table[so__])
374672fcea8cSEd Schouten 		String_Out(String_table[so__], NULL, 0);
374772fcea8cSEd Schouten }
374872fcea8cSEd Schouten 
374972fcea8cSEd Schouten void
attribute_off()375072fcea8cSEd Schouten attribute_off()
375172fcea8cSEd Schouten {
375272fcea8cSEd Schouten 	if (String_table[me__])
375372fcea8cSEd Schouten 		String_Out(String_table[me__], NULL, 0);
375472fcea8cSEd Schouten 	else if (String_table[sa__])
375572fcea8cSEd Schouten 	{
375672fcea8cSEd Schouten 		attributes_set[0] = 0;
375772fcea8cSEd Schouten 		String_Out(String_table[sa__], attributes_set, 1);
375872fcea8cSEd Schouten 	}
375972fcea8cSEd Schouten 	else if (String_table[se__])
376072fcea8cSEd Schouten 		String_Out(String_table[se__], NULL, 0);
376172fcea8cSEd Schouten }
376272fcea8cSEd Schouten 
376372fcea8cSEd Schouten void
Char_out(newc,newatt,line,attrib,offset)376472fcea8cSEd Schouten Char_out(newc, newatt, line, attrib, offset)	/* output character with proper attribute	*/
376572fcea8cSEd Schouten char newc;
376672fcea8cSEd Schouten char newatt;
376772fcea8cSEd Schouten char *line;
376872fcea8cSEd Schouten char *attrib;
376972fcea8cSEd Schouten int offset;
377072fcea8cSEd Schouten {
377172fcea8cSEd Schouten 
377272fcea8cSEd Schouten 
377372fcea8cSEd Schouten 	if ((newatt) && (!STAND))
377472fcea8cSEd Schouten 	{
377572fcea8cSEd Schouten 		STAND = TRUE;
377672fcea8cSEd Schouten 		attribute_on();
377772fcea8cSEd Schouten 	}
377872fcea8cSEd Schouten 	else if ((STAND) && (!newatt))
377972fcea8cSEd Schouten 	{
378072fcea8cSEd Schouten 		STAND = FALSE;
378172fcea8cSEd Schouten 		attribute_off();
378272fcea8cSEd Schouten 	}
378372fcea8cSEd Schouten 
378472fcea8cSEd Schouten 	if ((newatt) && (STAND) && (Booleans[xs__]))
378572fcea8cSEd Schouten 	{
378672fcea8cSEd Schouten 		attribute_on();
378772fcea8cSEd Schouten 	}
378872fcea8cSEd Schouten 
378972fcea8cSEd Schouten 	if (!((Curr_y >= (LINES - 1)) && (Curr_x >= (COLS - 1))))
379072fcea8cSEd Schouten 	{
379172fcea8cSEd Schouten 		putchar(newc);
379272fcea8cSEd Schouten 		line[offset] = newc;
379372fcea8cSEd Schouten 		attrib[offset] = newatt;
379472fcea8cSEd Schouten 	}
379572fcea8cSEd Schouten 	Curr_x++;
379672fcea8cSEd Schouten }
379772fcea8cSEd Schouten 
379872fcea8cSEd Schouten /*
379972fcea8cSEd Schouten  |
380072fcea8cSEd Schouten  |	The two routines that follow, nc_setattrib(), nc_clearattrib(), are
380172fcea8cSEd Schouten  |	hacks that notify new_curse to handle characters that have the high
380272fcea8cSEd Schouten  |	bit set as the first of two bytes of a multi-byte string.
380372fcea8cSEd Schouten  |
380472fcea8cSEd Schouten  */
380572fcea8cSEd Schouten 
380672fcea8cSEd Schouten void
nc_setattrib(flag)380772fcea8cSEd Schouten nc_setattrib(flag)
380872fcea8cSEd Schouten int flag;
380972fcea8cSEd Schouten {
381072fcea8cSEd Schouten 	nc_attributes |= flag;
381172fcea8cSEd Schouten }
381272fcea8cSEd Schouten 
381372fcea8cSEd Schouten void
nc_clearattrib(flag)381472fcea8cSEd Schouten nc_clearattrib(flag)
381572fcea8cSEd Schouten int flag;
381672fcea8cSEd Schouten {
381772fcea8cSEd Schouten 	nc_attributes &= ~flag;
381872fcea8cSEd Schouten }
381972fcea8cSEd Schouten 
3820