On Mon 19 Jun 2017 10:15, ludovic.cour...@inria.fr (Ludovic Courtès) writes:

> +(define (buffering-output-port port buffer)
> +  ;; Note: In Guile 2.2.2, custom binary output ports already have their own
> +  ;; 4K internal buffer.
> +  (define size
> +    (bytevector-length buffer))
> +
> +  (define total 0)
> +
> +  (define (flush)
> +    (put-bytevector port buffer 0 total)
> +    (set! total 0))
> +
> +  (define (write bv offset count)
> +    (if (zero? count)                             ;end of file
> +        (flush)
> +        (let loop ((offset offset)
> +                   (count count)
> +                   (written 0))
> +          (cond ((= total size)
> +                 (flush)
> +                 (loop offset count written))
> +                ((zero? count)
> +                 written)
> +                (else
> +                 (let ((to-copy (min count (- size total))))
> +                   (bytevector-copy! bv offset buffer total to-copy)
> +                   (set! total (+ total to-copy))
> +                   (loop (+ offset to-copy) (- count to-copy)
> +                         (+ written to-copy))))))))
> +
> +  (let ((port (make-custom-binary-output-port "buffering-output-port"
> +                                              write #f #f flush)))
> +    (setvbuf port _IONBF)
> +    port))
> +

Why not just set to _IOFBF and let Guile 2.2's buffering handle it?

Andy

Reply via email to