bytevector ports for r7rs egg pasted by sethalves on Tue Apr 1 19:15:55 2014
Index: scheme.base.scm =================================================================== --- scheme.base.scm (revision 30632) +++ scheme.base.scm (working copy) @@ -23,6 +23,9 @@ (make-u8vector make-bytevector) (write-u8vector write-bytevector))) +(import (only srfi-1 fold)) +(import (only ports make-input-port make-output-port)) + (%include "scheme.base-interface.scm") ;; For syntax definition helpers. @@ -784,4 +787,60 @@ ((bv port start end) (read-u8vector!/eof (fx- end start) bv port start))))) +(define (open-input-bytevector bv) + (let ((index 0)) + (make-input-port + (lambda () ; read-char + (cond ((= index (bytevector-length bv)) (eof-object)) + (else + (let ((c (bytevector-u8-ref bv index))) + (set! index (+ index 1)) + (integer->char c))))) + (lambda () ; char-ready? + (not (= index (bytevector-length bv)))) + (lambda () #t) ; close + (lambda () ; peek-char + (if (= index (bytevector-length bv)) + (eof-object) + (bytevector-u8-ref bv index)))))) + +(define (open-output-bytevector) + (let* ((segments (list '())) + (p (make-output-port + (lambda (s) ;; write + (let ((bv (make-bytevector (string-length s)))) + (let loop ((i 0)) + (cond ((= i (string-length s)) + (cons bv segments)) + (else + (bytevector-u8-set! + bv i (char->integer (string-ref s i))) + (loop (+ i 1))))) + (set-car! segments (cons bv (car segments))))) + (lambda () ;; close + #t)))) + (##sys#setslot p 3 segments) + p)) + +(define (sum-bytevector-list-sizes bv-lst) + (fold + 0 (map bytevector-length bv-lst))) + +(define (reverse-bytevector-list->bytevector bv-lst) + ;; reverse a list of bytevectors and combine them into + ;; a single bytevector + (let* ((data-size (sum-bytevector-list-sizes bv-lst)) + (result (make-bytevector data-size))) + (let loop ((bv-lst bv-lst) + (result-i data-size)) + (cond ((null? bv-lst) result) + (else + (let* ((bv (car bv-lst)) + (new-result-i (- result-i (bytevector-length bv)))) + (bytevector-copy! result new-result-i bv) + (loop (cdr bv-lst) new-result-i))))))) + +(define (get-output-bytevector p) + (let ((segments (car (##sys#slot p 3)))) + (reverse-bytevector-list->bytevector segments))) + ) 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?
bytevector ports for r7rs egg revised pasted by sethalves on Tue Apr 1 19:29:13 2014
Index: scheme.base.scm =================================================================== --- scheme.base.scm (revision 30632) +++ scheme.base.scm (working copy) @@ -23,6 +23,9 @@ (make-u8vector make-bytevector) (write-u8vector write-bytevector))) +(import (only srfi-1 fold)) +(import (only ports make-input-port make-output-port)) + (%include "scheme.base-interface.scm") ;; For syntax definition helpers. @@ -784,4 +787,26 @@ ((bv port start end) (read-u8vector!/eof (fx- end start) bv port start))))) +(define (open-input-bytevector bv) + (let ((index 0)) + (make-input-port + (lambda () ; read-char + (cond ((= index (bytevector-length bv)) (eof-object)) + (else + (let ((c (bytevector-u8-ref bv index))) + (set! index (+ index 1)) + (integer->char c))))) + (lambda () ; char-ready? + (not (= index (bytevector-length bv)))) + (lambda () #t) ; close + (lambda () ; peek-char + (if (= index (bytevector-length bv)) + (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?
bytevector ports for r7rs egg revised revised pasted by sethalves on Tue Apr 1 19:35:19 2014
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? 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,26 @@ ((bv port start end) (read-u8vector!/eof (fx- end start) bv port start))))) +(define (open-input-bytevector bv) + (let ((index 0)) + (make-input-port + (lambda () ; read-char + (cond ((= index (bytevector-length bv)) (eof-object)) + (else + (let ((c (bytevector-u8-ref bv index))) + (set! index (+ index 1)) + (integer->char c))))) + (lambda () ; char-ready? + (not (= index (bytevector-length bv)))) + (lambda () #t) ; close + (lambda () ; peek-char + (if (= index (bytevector-length bv)) + (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)
bytevector ports for r7rs egg added by sethlves on Tue Apr 1 19:43:02 2014
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?