! Copyright (C) 2004, 2005 Slava Pestov. ! See http://factor.sf.net/license.txt for BSD license. IN: stdio DEFER: stdio IN: streams USING: io-internals errors hashtables kernel stdio strings namespaces generic ; TUPLE: fd-stream in out ; M: fd-stream fwrite-attr ( str style stream -- ) nip fd-stream-out blocking-write ; M: fd-stream freadln ( stream -- str ) fd-stream-in dup [ blocking-read-line ] when ; M: fd-stream fread# ( count stream -- str ) fd-stream-in dup [ blocking-read# ] [ nip ] ifte ; M: fd-stream fflush ( stream -- ) fd-stream-out [ blocking-flush ] when* ; M: fd-stream fauto-flush ( stream -- ) drop ; M: fd-stream fclose ( stream -- ) dup fd-stream-out [ dup blocking-flush close-port ] when* fd-stream-in [ close-port ] when* ; C: fd-stream ( in out -- stream ) [ set-fd-stream-out ] keep [ set-fd-stream-in ] keep ; : ( path -- stream ) t f open-file ; : ( path -- stream ) f t open-file ; : init-stdio ( -- ) stdin stdout stdio set ; : (fcopy) ( from to -- ) #! Copy the contents of the fd-stream 'from' to the #! fd-stream 'to'. Use fcopy; this word does not close #! streams. fd-stream-out >r fd-stream-in r> blocking-copy ; : fcopy ( from to -- ) #! Copy the contents of the fd-stream 'from' to the #! fd-stream 'to'. [ 2dup (fcopy) ] [ -rot fclose fclose rethrow ] catch ; : resource-path ( -- path ) "resource-path" get [ "." ] unless* ; : ( path -- stream ) resource-path swap cat2 ;