|
|
1.1 root 1: \ tag: stdin/stdout handling
2: \
3: \ Copyright (C) 2003 Samuel Rydh
4: \
5: \ See the file "COPYING" for further information about
6: \ the copyright and warranty status of this work.
7: \
8:
9: \ 7.4.5 I/O control
10:
11: variable stdout
12: variable stdin
13:
14: : input ( dev-str dev-len -- )
15: 2dup find-dev 0= if
16: ." Input device " type ." not found." cr exit
17: then
18:
19: " read" rot find-method 0= if
20: type ." has no read method." cr exit
21: then
22: drop
23:
24: \ open stdin device
25: 2dup open-dev ?dup 0= if
26: ." Opening " type ." failed." cr exit
27: then
28: -rot 2drop
29:
30: \ call install-abort if present
31: dup " install-abort" rot ['] $call-method catch if 3drop then
32:
33: \ close old stdin
34: stdin @ ?dup if
35: dup " remove-abort" rot ['] $call-method catch if 3drop then
36: close-dev
37: then
38: stdin !
39: ;
40:
41: : output ( dev-str dev-len -- )
42: 2dup find-dev 0= if
43: ." Output device " type ." not found." cr exit
44: then
45:
46: " write" rot find-method 0= if
47: type ." has no write method." cr exit
48: then
49: drop
50:
51: \ open stdin device
52: 2dup open-dev ?dup 0= if
53: ." Opening " type ." failed." cr exit
54: then
55: -rot 2drop
56:
57: \ close old stdout
58: stdout @ ?dup if close-dev then
59: stdout !
60: ;
61:
62: : io ( dev-str dev-len -- )
63: 2dup input output
64: ;
65:
66: \ key?, key and emit implementation
67: variable io-char
68: variable io-out-char
69:
70: : io-key? ( -- available? )
71: io-char @ -1 <> if true exit then
72: io-char 1 " read" stdin @ $call-method
73: 1 =
74: ;
75:
76: : io-key ( -- key )
77: \ poll for key
78: begin io-key? until
79: io-char c@ -1 to io-char
80: ;
81:
82: : io-emit ( char -- )
83: io-out-char c!
84: io-out-char 1 " write" stdout @ $call-method drop
85: ;
86:
87: variable CONSOLE-IN-list
88: variable CONSOLE-OUT-list
89:
90: : CONSOLE-IN-initializer ( xt -- )
91: CONSOLE-IN-list list-add ,
92: ;
93: : CONSOLE-OUT-initializer ( xt -- )
94: CONSOLE-OUT-list list-add ,
95: ;
96:
97: : install-console ( -- )
98:
99: \ create screen alias
100: " /aliases" find-package if
101: >r
102: " screen" find-package if drop else
103: \ bad (or missing) screen alias
104: 0 " display" iterate-device-type ?dup if
105: ( display-ph R: alias-ph )
106: get-package-path encode-string " screen" r@ (property)
107: then
108: then
109: r> drop
110: then
111:
112: output-device output
113: input-device input
114:
115: \ let arch determine a useful output device
116: CONSOLE-OUT-list begin list-get while
117: stdout @ if drop else @ execute then
118: repeat
119:
120: \ let arch determine a useful input device
121: CONSOLE-IN-list begin list-get while
122: stdin @ if drop else @ execute then
123: repeat
124:
125: \ activate console
126: stdout @ if
127: ['] io-emit to emit
128: then
129:
130: stdin @ if
131: -1 to io-char
132: ['] io-key? to key?
133: ['] io-key to key
134: then
135: ;
136:
137: :noname
138: " screen" output
139: ; CONSOLE-OUT-initializer
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.