[plt-scheme] copy-port and custom-port
Hi -
I've created custom input port to wrap another input port - and when passing
the port to `copy-port`, besides copying the data inside the wrapped input
port, `copy-port` also appears to copy a bunch of random binary data after
the eof position.
When reading from the port via functions like `read` - it returns eof
properly, but copy-port blows right pass the position and keeps on copying
some random data. Obviously this is a bug in my simplistic implementation,
but I'm not sure how to find/tackle the problem.
Has anyone seen such an issue before? Any pointer is appreciated.
My implementation below...
yc
;; afile.ss ;; (load "afile.ss")
;; provide read closure over the wrapped port
(define (read-in port)
(lambda (bytes)
(let* ((len (bytes-length bytes))
(bytes-in (read-bytes len
port)))
(cond ((eof-object? bytes-in) eof)
(else
(bytes-copy! bytes 0
bytes-in)
len)))))
;; provide peek closure over the wrapped port
(define (peek-in port)
(lambda (bytes skip progress-evt)
(let* ((len (bytes-length bytes))
(peeked (peek-bytes len
skip port)))
(cond ((eof-object? peeked) eof)
(else (bytes-copy! bytes 0
peeked)
len)))))
;; provide the close closure over the wrapped port
(define (close-in port)
(lambda ()
(close-input-port port)))
;; the function that returns an input port to wrap another input port
(define (open-input-afile path)
(let ((port (open-input-file path)))
(make-input-port path
(read-in port)
(peek-in port)
(close-in port))))
;; test
(require scheme/port)
(define path "test-out.txt")
(define out (open-output-file path #:exists 'replace))
(display "test data\ntest data\ntest data\ntest data\n" out)
(close-output-port out)
(define in (open-input-afile path))
(define out (open-output-bytes))
(copy-port in out)
(close-input-port in)
(get-output-bytes out) ;; a bunch of random data will be appended...
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20080723/851a32c8/attachment.html>