diff --git a/scsh/rdelim.scm b/scsh/rdelim.scm index 3fddd6d..af5751d 100644 --- a/scsh/rdelim.scm +++ b/scsh/rdelim.scm @@ -155,13 +155,16 @@ (define (port-buffer-read-delimited delims buf gobble? port start end) + (obtain-port-lock port) (let ((the-port-limit (port-limit port))) (let lp ((i start) (lp-port-index (port-index port))) (cond ((port-pending-eof? port) (set-port-index! port lp-port-index) - (values (eof-object) i)) + (release-port-lock port) + (values (eof-object) (- i start))) ((>= i end) (set-port-index! port lp-port-index) + (release-port-lock port) (values #f (- i start))) ((< lp-port-index the-port-limit) (let ((the-read-char @@ -172,13 +175,15 @@ (if gobble? (set-port-index! port (+ lp-port-index 1)) (set-port-index! port lp-port-index)) + (release-port-lock port) (values the-read-char (- i start))) (begin (string-set! buf i the-read-char) (lp (+ i 1) (+ lp-port-index 1)))))) (else (set-port-index! port 0) (set-port-limit! port 0) - (values 'port-buffer-exhausted i)))))) + (release-port-lock port) + (values 'port-buffer-exhausted (- i start))))))) @@ -195,44 +200,15 @@ (let* ((delims (->char-set delims)) (sdelims (char-set:s delims))) - + (let lp ((start start) (total 0)) (receive (terminator num-read) (port-buffer-read-delimited delims buf gobble? port start end) (if (not (eq? terminator 'port-buffer-exhausted)) - (values terminator num-read) - (begin (set! start (+ start num-read)) - (if (fdport? port) - ;; Direct C support for Unix file ports -- zippy quick. - (let lp ((start start) (total num-read)) - (let ((fd (fdport-data:fd (fdport-data port)))) - (receive (terminator num-read) - (%read-delimited-fd!/errno sdelims buf - fd start end) - (let ((total (+ num-read total))) - (cond ((char? terminator) - (if (not gobble?) (push-back port terminator)) - (values terminator total)) - ((not (integer? terminator)) (values terminator total)) - ((= terminator errno/intr) - (lp (+ start num-read) total)) - (else (errno-error terminator %read-delimited! - num-read total - delims buf gobble? port start end))))))) + (values terminator (+ num-read total)) + (begin (peek-char port) ; kludge to fill the buffer + (lp (+ start num-read) (+ total num-read))))))))) + - ;; This is the code for other kinds of ports. - ;; Mighty slow -- we read each char twice (peek first, then read). - (let lp ((i start)) - (let ((c (peek-char port))) - (cond ((or (eof-object? c) ; Found terminating char or eof - (char-set-contains? delims c)) - (if gobble? (read-char port)) - (values c (- i start))) - - ((>= i end) ; Filled the buffer. - (values #f (- i start))) - - (else (string-set! buf i (read-char port)) - (lp (+ i 1))))))))))))) ; overwrites port-index :-( (define (push-back port char)