| \ tag: stdin/stdout handling |
| \ |
| \ Copyright (C) 2003 Samuel Rydh |
| \ |
| \ See the file "COPYING" for further information about |
| \ the copyright and warranty status of this work. |
| \ |
| |
| \ 7.4.5 I/O control |
| |
| variable stdout |
| variable stdin |
| |
| : input ( dev-str dev-len -- ) |
| 2dup find-dev 0= if |
| ." Input device " type ." not found." cr exit |
| then |
| |
| " read" rot find-method 0= if |
| type ." has no read method." cr exit |
| then |
| drop |
| |
| \ open stdin device |
| 2dup open-dev ?dup 0= if |
| ." Opening " type ." failed." cr exit |
| then |
| -rot 2drop |
| |
| \ call install-abort if present |
| dup " install-abort" rot ['] $call-method catch if 3drop then |
| |
| \ close old stdin |
| stdin @ ?dup if |
| dup " remove-abort" rot ['] $call-method catch if 3drop then |
| close-dev |
| then |
| stdin ! |
| |
| \ update /chosen |
| " /chosen" find-package if |
| >r stdin @ encode-int " stdin" r> (property) |
| then |
| |
| [IFDEF] CONFIG_SPARC32 |
| \ update stdin-path properties |
| \ (this isn't part of the IEEE1275 spec but needed by older Solaris) |
| " /" find-package if |
| >r stdin @ get-instance-path encode-string " stdin-path" r> (property) |
| then |
| [THEN] |
| ; |
| |
| : output ( dev-str dev-len -- ) |
| 2dup find-dev 0= if |
| ." Output device " type ." not found." cr exit |
| then |
| |
| " write" rot find-method 0= if |
| type ." has no write method." cr exit |
| then |
| drop |
| |
| \ open stdin device |
| 2dup open-dev ?dup 0= if |
| ." Opening " type ." failed." cr exit |
| then |
| -rot 2drop |
| |
| \ close old stdout |
| stdout @ ?dup if close-dev then |
| stdout ! |
| |
| \ update /chosen |
| " /chosen" find-package if |
| >r stdout @ encode-int " stdout" r> (property) |
| then |
| |
| [IFDEF] CONFIG_SPARC32 |
| \ update stdout-path properties |
| \ (this isn't part of the IEEE1275 spec but needed by older Solaris) |
| " /" find-package if |
| >r stdout @ get-instance-path encode-string " stdout-path" r> (property) |
| then |
| [THEN] |
| ; |
| |
| : io ( dev-str dev-len -- ) |
| 2dup input output |
| ; |
| |
| \ key?, key and emit implementation |
| variable io-char |
| variable io-out-char |
| |
| : io-key? ( -- available? ) |
| io-char @ -1 <> if true exit then |
| io-char 1 " read" stdin @ $call-method |
| 1 = |
| ; |
| |
| : io-key ( -- key ) |
| \ poll for key |
| begin io-key? until |
| io-char c@ -1 to io-char |
| ; |
| |
| : io-emit ( char -- ) |
| stdout @ if |
| io-out-char c! |
| io-out-char 1 " write" stdout @ $call-method |
| then |
| drop |
| ; |
| |
| variable CONSOLE-IN-list |
| variable CONSOLE-OUT-list |
| |
| : CONSOLE-IN-initializer ( xt -- ) |
| CONSOLE-IN-list list-add , |
| ; |
| : CONSOLE-OUT-initializer ( xt -- ) |
| CONSOLE-OUT-list list-add , |
| ; |
| |
| : install-console ( -- ) |
| |
| \ create screen alias |
| " /aliases" find-package if |
| >r |
| " screen" find-package if drop else |
| \ bad (or missing) screen alias |
| 0 " display" iterate-device-type ?dup if |
| ( display-ph R: alias-ph ) |
| get-package-path encode-string " screen" r@ (property) |
| then |
| then |
| r> drop |
| then |
| |
| output-device output |
| input-device input |
| |
| \ let arch determine a useful output device |
| CONSOLE-OUT-list begin list-get while |
| stdout @ if drop else @ execute then |
| repeat |
| |
| \ let arch determine a useful input device |
| CONSOLE-IN-list begin list-get while |
| stdin @ if drop else @ execute then |
| repeat |
| |
| \ activate console |
| stdout @ if |
| ['] io-emit to emit |
| then |
| |
| stdin @ if |
| -1 to io-char |
| ['] io-key? to key? |
| ['] io-key to key |
| then |
| ; |
| |
| :noname |
| " screen" output |
| ; CONSOLE-OUT-initializer |