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)
19 (EDITSTR-XY) @ (E6CURXY) !
20 (EDITSTR-ADDR) @ (EDITSTR-CP) @ TYPE
21 (E6CURXY) @ ;; save cursor position
22 (EDITSTR-CURCH) C@ EMIT
23 (EDITSTR-ADDR) @ (EDITSTR-CP) @ + (EDITSTR-LEN) @ (EDITSTR-CP) @ - TYPE
25 (EDITSTR-WASBS) @ 0BRANCH editstrdraw_0
30 ;; check for possible scroll
31 (E6WASSCROLL) C@ 0BRANCH editstrdraw_1
32 (EDITSTR-XY) C@ (E6WASSCROLL) C@ DUP >R - (EDITSTR-XY) C!
36 ;; set coords for cursor
38 $FORTH_END_WORD (EDITSTR-DRAW)
41 ;; draw editing line w/o cursor
42 $FORTH_WORD (EDITSTR-TYPE)
45 (EDITSTR-XY) @ (E6CURXY) !
46 (EDITSTR-ADDR) @ (EDITSTR-LEN) @ TYPE SPACE ;S
47 $FORTH_END_WORD (EDITSTR-TYPE)
50 ;; TYPE editing line, set 0x00 as the last char
51 $FORTH_WORD (EDITSTR-DOENTER)
54 (EDITSTR-TYPE) 0 (EDITSTR-ADDR) @ (EDITSTR-LEN) @ + C! ;S
55 $FORTH_END_WORD (EDITSTR-DOENTER)
58 ;; position cursor to the start of the line
59 $FORTH_WORD (EDITSTR-DOHOME)
63 $FORTH_END_WORD (EDITSTR-DOHOME)
66 ;; position cursor to the end of the line
67 $FORTH_WORD (EDITSTR-DOEND)
70 (EDITSTR-LEN) @ (EDITSTR-CP) ! ;S
71 $FORTH_END_WORD (EDITSTR-DOEND)
75 $FORTH_WORD (EDITSTR-DOCLEAR)
78 (EDITSTR-XY) @ (E6CURXY) ! (EDITSTR-LEN) @ 1+ SPACES
79 (EDITSTR-LEN) 0! (EDITSTR-CP) 0! ;S
80 $FORTH_END_WORD (EDITSTR-DOCLEAR)
84 $FORTH_WORD (EDITSTR-DOLEFT)
87 (EDITSTR-CP) @ 0BRANCH editstrdoleft_q
91 $FORTH_END_WORD (EDITSTR-DOLEFT)
95 $FORTH_WORD (EDITSTR-DORIGHT)
98 (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoright_q
102 $FORTH_END_WORD (EDITSTR-DORIGHT)
105 ;; delete char before cursor, move cursor left
106 $FORTH_WORD (EDITSTR-DOBS)
108 ;; ( -- success_flag)
109 (EDITSTR-LEN) @ 0BRANCH editstrdobs_f
110 (EDITSTR-CP) @ -DUP 0BRANCH editstrdobs_f
113 DUP (EDITSTR-ADDR) @ + DUP C@ SWAP 1- C!
114 1+ DUP (EDITSTR-LEN) @ >=
115 0BRANCH editstrdobs_0
117 -1 (EDITSTR-LEN) +! -1 (EDITSTR-CP) +!
118 1 BRANCH editstrdobs_q
123 $FORTH_END_WORD (EDITSTR-DOBS)
126 ;; insert char at the currsnt cursor position
127 $FORTH_WORD (EDITSTR-DOINSCHAR)
129 ;; ( ch -- success_flag )
130 (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoinschar_f
131 (EDITSTR-CP) @ (EDITSTR-LEN) @ < 0BRANCH editstrdoinschar_0
132 ;; make room & insert
133 (EDITSTR-ADDR) @ (EDITSTR-LEN) @ +
134 (EDITSTR-LEN) @ (EDITSTR-CP) @ -
136 DUP 0 > 0BRANCH editstrdoinschar_x
137 >R DUP 1- C@ OVER C! 1- R> 1-
138 BRANCH editstrdoinschar_l
143 (EDITSTR-CP) @ (EDITSTR-ADDR) @ + C!
144 1 (EDITSTR-LEN) +! 1 (EDITSTR-CP) +!
145 1 BRANCH editstrdoinschar_q ;; set flag & quit
150 $FORTH_END_WORD (EDITSTR-DOINSCHAR)
153 ;; append char to the end of the line, do not move cursor
154 $FORTH_WORD (EDITSTR-DOADDCHAR)
156 ;; ( ch -- success_flag)
157 (EDITSTR-LEN) @ (EDITSTR-MAXLEN) @ < 0BRANCH editstrdoaddchar_f
159 (EDITSTR-LEN) @ (EDITSTR-ADDR) @ + C!
162 1 BRANCH editstrdoaddchar_q
167 $FORTH_END_WORD (EDITSTR-DOADDCHAR)
170 $FORTH_WORD (EDITSTR)
174 ;; 1- (EDITSTR-MAXLEN) ! (EDITSTR-ADDR) !
175 ;; (EDITSTR-LEN) 0! (EDITSTR-CP) 0!
180 DUP LIT 8 = 0BRANCH xeditstr2
182 DROP (EDITSTR-DOLEFT) BRANCH xeditstr0
184 DUP LIT 9 = 0BRANCH xeditstr3
186 DROP (EDITSTR-DORIGHT) BRANCH xeditstr0
188 DUP LIT 12 = 0BRANCH xeditstr4
190 DROP (EDITSTR-DOBS) DROP BRANCH xeditstr0
192 DUP BL < 0BRANCH xeditstr5
193 ;; control key. just exit
196 (EDITSTR-DOINSCHAR) DROP BRANCH xeditstr0
199 $FORTH_END_WORD (EDITSTR)
206 (E6CURXY) @ (EDITSTR-XY) !
210 DUP CHCR = 0BRANCH exexp1
212 DROP (EDITSTR-DOENTER) BRANCH exexp_q
214 DUP LIT 7 = 0BRANCH exexp2
216 DROP (EDITSTR-DOCLEAR) BRANCH exexp0
218 DUP LIT 11 = 0BRANCH exexp3
220 DROP (EDITSTR-DOHOME) BRANCH exexp0
222 DUP CHLF = 0BRANCH exexp4
223 ;; CS+6 (DOWN -- end)
229 $FORTH_END_WORD XEDITSTR