1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;; string editor engine
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
5 $FORTH_VAR (EDITSTR-MAXLEN) 0
6 $FORTH_VAR (EDITSTR-XY) 0
7 $FORTH_VAR (EDITSTR-CP) 0
8 $FORTH_VAR (EDITSTR-ADDR) 0
9 $FORTH_VAR (EDITSTR-LEN) 0
10 $FORTH_VAR (EDITSTR-WASBS) 0
11 $FORTH_VAR (EDITSTR-CURCH) 177
14 ;; draw editing line with cursor
15 $FORTH_WORD (EDITSTR-DRAW)
18 (EDITSTR-XY) @ (E6CURXY) !
19 (EDITSTR-ADDR) @ (EDITSTR-CP) @ TYPE
20 (E6CURXY) @ ;; save cursor position
21 (EDITSTR-CURCH) C@ EMIT
22 (EDITSTR-ADDR) @ (EDITSTR-CP) @ + (EDITSTR-LEN) @ (EDITSTR-CP) @ - TYPE
24 (EDITSTR-WASBS) @ 0BRANCH editstrdraw_0
29 ;; check for possible scroll
30 (E6WASSCROLL) C@ 0BRANCH editstrdraw_1
31 (EDITSTR-XY) C@ (E6WASSCROLL) C@ DUP >R - (EDITSTR-XY) C!
35 ;; set coords for cursor
37 $FORTH_END_WORD (EDITSTR-DRAW)
39 ;; draw editing line w/o cursor
40 $FORTH_WORD (EDITSTR-TYPE)
42 (EDITSTR-XY) @ (E6CURXY) !
43 (EDITSTR-ADDR) @ (EDITSTR-LEN) @ TYPE SPACE ;S
44 $FORTH_END_WORD (EDITSTR-TYPE)
46 ;; TYPE editing line, set 0x00 as the last char
47 $FORTH_WORD (EDITSTR-DOENTER)
49 (EDITSTR-TYPE) 0 (EDITSTR-ADDR) @ (EDITSTR-LEN) @ + C! ;S
50 $FORTH_END_WORD (EDITSTR-DOENTER)
52 ;; position cursor to the start of the line
53 $FORTH_WORD (EDITSTR-DOHOME)
56 $FORTH_END_WORD (EDITSTR-DOHOME)
58 ;; position cursor to the end of the line
59 $FORTH_WORD (EDITSTR-DOEND)
61 (EDITSTR-LEN) @ (EDITSTR-CP) ! ;S
62 $FORTH_END_WORD (EDITSTR-DOEND)
65 $FORTH_WORD (EDITSTR-DOCLEAR)
67 (EDITSTR-XY) @ (E6CURXY) ! (EDITSTR-LEN) @ 1+ SPACES
68 (EDITSTR-LEN) 0! (EDITSTR-CP) 0! ;S
69 $FORTH_END_WORD (EDITSTR-DOCLEAR)
72 $FORTH_WORD (EDITSTR-DOLEFT)
74 (EDITSTR-CP) @ 0BRANCH editstrdoleft_q
75 LIT -1 (EDITSTR-CP) +!
78 $FORTH_END_WORD (EDITSTR-DOLEFT)
81 $FORTH_WORD (EDITSTR-DORIGHT)
83 (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoright_q
87 $FORTH_END_WORD (EDITSTR-DORIGHT)
89 ;; delete char before cursor, move cursor left
90 $FORTH_WORD (EDITSTR-DOBS)
92 (EDITSTR-LEN) @ 0BRANCH editstrdobs_f
93 (EDITSTR-CP) @ -DUP 0BRANCH editstrdobs_f
96 DUP (EDITSTR-ADDR) @ + DUP C@ SWAP 1- C!
97 1+ DUP (EDITSTR-LEN) @ >=
100 LIT -1 (EDITSTR-LEN) +! LIT -1 (EDITSTR-CP) +!
101 1 BRANCH editstrdobs_q
106 $FORTH_END_WORD (EDITSTR-DOBS)
108 ;; insert char at the currsnt cursor position
109 $FORTH_WORD (EDITSTR-DOINSCHAR)
110 ;; ( ch -- success_flag )
111 (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoinschar_f
112 (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoinschar_0
113 ;; make room & insert
114 (EDITSTR-ADDR) @ (EDITSTR-LEN) @ +
115 (EDITSTR-LEN) @ (EDITSTR-CP) @ -
117 DUP 0 > 0BRANCH editstrdoinschar_x
118 >R DUP 1- C@ OVER C! 1- R> 1-
119 BRANCH editstrdoinschar_l
124 (EDITSTR-CP) @ (EDITSTR-ADDR) @ + C!
125 1 (EDITSTR-LEN) +! 1 (EDITSTR-CP) +!
126 1 BRANCH editstrdoinschar_q ;; set flag & quit
131 $FORTH_END_WORD (EDITSTR-DOINSCHAR)
133 ;; append char to the end of the line, do not move cursor
134 $FORTH_WORD (EDITSTR-DOADDCHAR)
135 ;; ( ch -- success_flag)
136 (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoaddchar_f
138 (EDITSTR-LEN) @ (EDITSTR-ADDR) @ + C!
141 1 BRANCH editstrdoaddchar_q
146 $FORTH_END_WORD (EDITSTR-DOADDCHAR)
149 $FORTH_WORD (EDITSTR)
153 ;; 1- (EDITSTR-MAXLEN) ! (EDITSTR-ADDR) !
154 ;; (EDITSTR-LEN) 0! (EDITSTR-CP) 0!
159 DUP LIT 8 = 0BRANCH xeditstr2
161 DROP (EDITSTR-DOLEFT) BRANCH xeditstr0
163 DUP LIT 9 = 0BRANCH xeditstr3
165 DROP (EDITSTR-DORIGHT) BRANCH xeditstr0
167 DUP LIT 12 = 0BRANCH xeditstr4
169 DROP (EDITSTR-DOBS) DROP BRANCH xeditstr0
171 DUP LIT 32 < 0BRANCH xeditstr5
172 ;; control key. just exit
175 (EDITSTR-DOINSCHAR) DROP BRANCH xeditstr0
178 $FORTH_END_WORD (EDITSTR)
184 (E6CURXY) @ (EDITSTR-XY) !
188 DUP LIT 13 = 0BRANCH exexp1
190 DROP (EDITSTR-DOENTER) BRANCH exexp_q
192 DUP LIT 7 = 0BRANCH exexp2
194 DROP (EDITSTR-DOCLEAR) BRANCH exexp0
196 DUP LIT 11 = 0BRANCH exexp3
198 DROP (EDITSTR-DOHOME) BRANCH exexp0
200 DUP LIT 10 = 0BRANCH exexp4
201 ;; CS+6 (DOWN -- end)
207 $FORTH_END_WORD XEDITSTR