Index: scheme.base.scm =================================================================== --- scheme.base.scm (revision 30632) +++ scheme.base.scm (working copy) @@ -23,6 +23,8 @@ (make-u8vector make-bytevector) (write-u8vector write-bytevector))) +(import (only ports make-input-port make-output-port)) + (%include "scheme.base-interface.scm") ;; For syntax definition helpers. @@ -784,4 +786,27 @@ ((bv port start end) (read-u8vector!/eof (fx- end start) bv port start))))) +(define (open-input-bytevector bv) + (let ((index 0) + (bv-len (bytevector-length bv))) + (make-input-port + (lambda () ; read-char + (cond ((= index bv-len) (eof-object)) + (else + (let ((c (bytevector-u8-ref bv index))) + (set! index (+ index 1)) + (integer->char c))))) + (lambda () ; char-ready? + (not (= index bv-len))) + (lambda () #t) ; close + (lambda () ; peek-char + (if (= index bv-len) + (eof-object) + (bytevector-u8-ref bv index)))))) + +(define (open-output-bytevector) (open-output-string)) + +(define (get-output-bytevector p) + (string->utf8 (get-output-string p))) + ) Index: tests/run.scm =================================================================== --- tests/run.scm (revision 30632) +++ tests/run.scm (working copy) @@ -973,6 +973,21 @@ (import (scheme base)) (begin (eq? numbers#+ +))))) + +(test-group "open-input-bytevector" + (test (bytevector 0 1 2 10 13 40 41 42 128 140 240 255) + (let ((bv (bytevector 0 1 2 10 13 40 41 42 128 140 240 255))) + (read-bytevector 12 (open-input-bytevector bv))))) + +(test-group "open-output-bytevector" + (test (bytevector 0 1 2 10 13 40 41 42 128 140 240 255) + (let ((p (open-output-bytevector))) + (write-bytevector (bytevector 0 1 2 10 13) p) + (write-bytevector (bytevector 40 41 42 128) p) + (write-bytevector (bytevector 140 240 255) p) + (close-output-port p) + (get-output-bytevector p)))) + (test-end "r7rs tests") (test-exit) Index: scheme.base-interface.scm =================================================================== --- scheme.base-interface.scm (revision 30632) +++ scheme.base-interface.scm (working copy) @@ -58,9 +58,7 @@ flush-output-port for-each gcd lcm - #| get-output-bytevector - |# get-output-string guard if @@ -96,9 +94,7 @@ null? number->string string->number number? - #| open-input-bytevector open-output-bytevector - |# open-input-string open-output-string or pair?