Read whole buffers at once, rather than a character at a time

This commit is contained in:
Tony Garnock-Jones 2011-11-04 13:22:51 -04:00
parent 6b967002c5
commit f70354c683
1 changed files with 18 additions and 14 deletions

View File

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