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