aboutsummaryrefslogtreecommitdiff
path: root/pkg/utilities/nttools/tedit/display/forms/linefn.x
blob: c122795ab222ce36b7d8439b9910761a7b19bd91 (plain) (blame)
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