~ chicken-r7rs (master) 8a04d4f5e2d528677272d75da4fb2e06c2ebc80a


commit 8a04d4f5e2d528677272d75da4fb2e06c2ebc80a
Author:     Evan Hanson <evhan@foldling.org>
AuthorDate: Sat Apr 5 21:50:10 2014 +0000
Commit:     Evan Hanson <evhan@foldling.org>
CommitDate: Sat Apr 5 21:50:10 2014 +0000

    Bytevector ports (credit to Seth Alves)

diff --git a/scheme.base-interface.scm b/scheme.base-interface.scm
index 89a95da..9f9cc5a 100644
--- a/scheme.base-interface.scm
+++ b/scheme.base-interface.scm
@@ -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?
diff --git a/scheme.base.scm b/scheme.base.scm
index ad59202..3074371 100644
--- a/scheme.base.scm
+++ b/scheme.base.scm
@@ -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
+       (if (= index bv-len)
+           (eof-object)
+           (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)))
+
 )
diff --git a/tests/run.scm b/tests/run.scm
index 3749247..66e93b4 100644
--- a/tests/run.scm
+++ b/tests/run.scm
@@ -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)
Trap