|
|
1.1 root 1: \ tag: terminal emulation
2: \
3: \ this code implements IEEE 1275-1994 ANNEX B
4: \
5: \ Copyright (C) 2003 Stefan Reinauer
6: \
7: \ See the file "COPYING" for further information about
8: \ the copyright and warranty status of this work.
9: \
10:
11: 0 value (escseq)
12: 10 buffer: (sequence)
13:
14: : (match-number) ( x y [1|2] [1|2] -- x [z] )
15: 2dup = if \ 1 1 | 2 2
16: drop exit
17: then
18: 2dup > if
19: 2drop drop 1 exit
20: then
21: 2drop 0
22: ;
23:
24: : (esc-number) ( maxchar -- ?? ?? num )
25: >r depth >r ( R: depth maxchar )
26: 0 (sequence) 2+ (escseq) 2- ( 0 seq+2 seqlen-2 )
27: \ if numerical, scan until non-numerical
28: 0 ?do
29: ( 0 seq+2 )
30: dup i + c@ a
31: digit if
32: ( 0 ptr n )
33: rot a * + ( ptr val )
34: swap
35: else
36: ( 0 ptr asc )
37: ascii ; = if
38: 0 swap
39: else
40: drop leave
41: then
42: then
43:
44: loop
45: depth r> - r>
46: 0 to (escseq)
47: (match-number)
48: ;
49:
50: : (match-seq)
51: (escseq) 1- (sequence) + c@ \ get last character in sequence
52: \ dup draw-character
53: case
54: ascii A of \ CUU - cursor up
55: 1 (esc-number)
56: 0> if
57: 1 max
58: else
59: 1
60: then
61: negate line# +
62: 0 max to line#
63: endof
64: ascii B of \ CUD - cursor down
65: 1 (esc-number)
66: 0> if
67: 1 max
68: line# +
69: #lines 1- min to line#
70: then
71: endof
72: ascii C of \ CUF - cursor forward
73: 1 (esc-number)
74: 0> if
75: 1 max
76: column# +
77: #columns 1- min to column#
78: then
79: endof
80: ascii D of \ CUB - cursor backward
81: 1 (esc-number)
82: 0> if
83: 1 max
84: negate column# +
85: 0 max to column#
86: then
87: endof
88: ascii E of \ Cursor next line (CNL)
89: \ FIXME - check agains ANSI3.64
90: 1 (esc-number)
91: 0> if
92: 1 max
93: line# +
94: #lines 1- min to line#
95: then
96: 0 to column#
97: endof
98: ascii f of
99: 2 (esc-number)
100: 2 = if
101: #columns 1- min to column#
102: #lines 1- min to line#
103: then
104: endof
105: ascii H of
106: 2 (esc-number)
107: 2 = if
108: #columns 1- min to column#
109: #lines 1- min to line#
110: then
111: endof
112: ascii J of
113: 0 to (escseq)
114: #columns column# - delete-characters
115: #lines line# - delete-lines
116: endof
117: ascii K of
118: 0 to (escseq)
119: #columns column# - delete-characters
120: endof
121: ascii L of
122: 1 (esc-number)
123: 0> if
124: 1 max
125: insert-lines
126: then
127: endof
128: ascii M of
129: 1 (esc-number)
130: 1 = if
131: 1 max
132: delete-lines
133: then
134: endof
135: ascii @ of
136: 1 (esc-number)
137: 1 = if
138: 1 max
139: insert-characters
140: then
141: endof
142: ascii P of
143: 1 (esc-number)
144: 1 = if
145: 1 max
146: delete-characters
147: then
148: endof
149: ascii m of
150: 1 (esc-number)
151: 1 = if
152: 7 = if
153: true to inverse?
154: else
155: false to inverse?
156: then
157: then
158: endof
159: ascii p of \ normal text colors
160: 0 to (escseq)
161: inverse-screen? if
162: false to inverse-screen?
163: inverse? 0= to inverse?
164: invert-screen
165: then
166: endof
167: ascii q of \ inverse text colors
168: 0 to (escseq)
169: inverse-screen? not if
170: true to inverse-screen?
171: inverse? 0= to inverse?
172: invert-screen
173: then
174: endof
175: ascii s of
176: \ Resets the display device associated with the terminal emulator.
177: 0 to (escseq)
178: reset-screen
179: endof
180: endcase
181: ;
182:
183: : (term-emit) ( char -- )
184: toggle-cursor
185:
186: (escseq) 0> if
187: (escseq) 10 = if
188: 0 to (escseq)
189: ." overflow in esc" cr
190: drop
191: then
192: (escseq) 1 = if
193: dup ascii [ = if \ not a [
194: (sequence) 1+ c!
195: 2 to (escseq)
196: else
197: 0 to (escseq) \ break out of ESC sequence
198: ." out of ESC" cr
199: drop \ don't print breakout character
200: then
201: toggle-cursor exit
202: else
203: (sequence) (escseq) + c!
204: (escseq) 1+ to (escseq)
205: (match-seq)
206: toggle-cursor exit
207: then
208: then
209:
210: case
211: 7 of \ BEL
212: blink-screen
213: s" /screen" s" ring-bell"
214: execute-device-method
215: endof
216: 8 of \ BS
217: column# 0<> if
218: column# 1- dup
219: to column#
220: 20 draw-character
221: to column#
222: then
223: endof
224: 9 of \ TAB
225: column# dup #columns = if
226: drop
227: else
228: 8 + -8 and ff and to column#
229: then
230: endof
231: a of \ LF
232: line# 1+ to line# 0 to column#
233: endof
234: b of \ VT
235: line# 0<> if
236: line# 1- to line#
237: then
238: endof
239: c of \ FF
240: 0 to column# 0 to line#
241: erase-screen
242: endof
243: d of \ CR
244: 0 to column#
245: endof
246: 1b of \ ESC
247: 1b (sequence) c!
248: 1 to (escseq)
249: endof
250: dup draw-character
251: endcase
252: toggle-cursor
253: ;
254:
255: ['] (term-emit) to fb-emit
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.