diff --git a/cook-port.rkt b/cook-port.rkt index a9158f4..d1cda94 100644 --- a/cook-port.rkt +++ b/cook-port.rkt @@ -45,26 +45,30 @@ (define-values (cooked-in cooked-out) (make-pipe)) (thread (lambda () + (define input-buffer (make-bytes 4096)) (let loop ((b (buffer '() #f))) (if (port-closed? cooked-out) ;; our job here is 'done - (let ((s (read-string 1 raw-in))) - (if (eof-object? s) + (let ((count (read-bytes-avail! input-buffer raw-in))) + (if (eof-object? count) (begin (close-output-port cooked-out) (loop b)) - (begin (update-buffer b (string-ref s 0) prompt - (lambda () - (close-output-port cooked-out) - (close-input-port raw-in)) - (lambda (line new-b) - (write-string "\r\n" raw-out) - (write-string line cooked-out) - (newline cooked-out) - (loop new-b)) - (lambda (new-b feedback) - (write-string feedback raw-out) - (loop new-b)))))))))) + (let process-bytes ((i 0) (b b)) + (if (>= i count) + (loop b) + (update-buffer b (integer->char (bytes-ref input-buffer i)) prompt + (lambda () + (close-output-port cooked-out) + (close-input-port raw-in)) + (lambda (line new-b) + (write-string "\r\n" raw-out) + (write-string line cooked-out) + (newline cooked-out) + (process-bytes (+ i 1) new-b)) + (lambda (new-b feedback) + (write-string feedback raw-out) + (process-bytes (+ i 1) new-b))))))))))) (values cooked-in (cook-output raw-out))) (define (cook-output raw-out)