1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
include "../curses.h"
include "linefn.h"
# LINEFN -- Function that processes a line of input in a window
procedure linefn (win, ch, maxch, str, data, done)
int win # i: Window descriptor
int ch # i: Keyboard character
int maxch # i: Maximum line length
char str[ARB] # io: String containing line
pointer data # io: Line data structure
bool done # o: Flag indicating line is done
#--
int ic, jc, nc
int strlen()
begin
done = false
if (LIN_ROW(data) == 0 || LIN_COL(data) == 0)
call getyx (win, LIN_ROW(data), LIN_COL(data))
if (ch < K_BASE) {
LIN_ICHAR(data) = LIN_ICHAR(data) + 1
LIN_COL(data) = LIN_COL(data) + 1
ic = LIN_ICHAR(data)
if (str[ic] == EOS) {
if (ic > maxch) {
done = true
LIN_LAST(data) = EOS
} else {
str[ic] = ch
str[ic+1] = EOS
call waddstr (win, str[ic])
}
} else {
nc = strlen (str)
if (nc >= maxch) {
done = true
LIN_LAST(data) = EOS
} else {
do jc = nc+1, ic, -1
str[jc+1] = str[jc]
str[ic] = ch
call winsch (win, str[ic])
}
}
if (ch == '\r') {
done = true
LIN_LAST(data) = '\n'
}
} else {
ic = LIN_ICHAR(data)
switch (ch) {
case K_RIGHT: # Move right one column
if (str[ic] == EOS) {
done = true
LIN_LAST(data) = EOS
} else {
LIN_ICHAR(data) = LIN_ICHAR(data) + 1
LIN_COL(data) = LIN_COL(data) + 1
call wmove (win, LIN_ROW(data), LIN_COL(data))
}
case K_LEFT: # Move left one column
if (ic == 1) {
done = true
LIN_LAST(data) = EOS
} else {
LIN_ICHAR(data) = LIN_ICHAR(data) - 1
LIN_COL(data) = LIN_COL(data) - 1
call wmove (win, LIN_ROW(data), LIN_COL(data))
}
case K_BOL: # Move to first column in line
if (ic > 1) {
LIN_ICHAR(data) = 1
LIN_COL(data) = LIN_COL(data) - ic + 1
call wmove (win, LIN_ROW(data), LIN_COL(data))
}
case K_EOL: # Move to last column in line
if (str[ic] != EOS) {
LIN_ICHAR(data) = strlen (str) + 1
LIN_COL(data) = LIN_COL(data) + LIN_ICHAR(data) - ic
call wmove (win, LIN_ROW(data), LIN_COL(data))
}
case K_DEL: # Delete character underneath cursor
if (str[ic] != EOS) {
while (str[ic] != EOS) {
str[ic] = str[ic+1]
ic = ic + 1
}
call wdelch (win)
}
case K_BS: # Delete character to left of cursor
if (ic > 1) {
LIN_ICHAR(data) = LIN_ICHAR(data) - 1
LIN_COL(data) = LIN_COL(data) - 1
ic = ic - 1
while (str[ic] != EOS) {
str[ic] = str[ic+1]
ic = ic + 1
}
call wmove (win, LIN_ROW(data), LIN_COL(data))
call wdelch (win)
}
case K_DWORD: # Delete entire line
if (str[1] != EOS) {
LIN_ICHAR(data) = 1
LIN_COL(data) = LIN_COL(data) - ic + 1
for (ic = 1; str[ic] != EOS; ic = ic + 1)
str[ic] = ' '
call addstr (win, str)
str[1] = EOS
}
default:
done = true
LIN_LAST(data) = ch
}
}
end
|