diff --git a/scsh/rw.scm b/scsh/rw.scm index d784c9b..667622e 100644 --- a/scsh/rw.scm +++ b/scsh/rw.scm @@ -33,15 +33,17 @@ (cond ((integer? fd/port) (generic-read-string!/partial s start end read-fdes-substring!/errno fd/port)) - ((fdport? fd/port) - (generic-read-string!/partial s start end - read-fdes-substring!/errno - (fdport-data:fd (port-data fd/port)))) - (else ; Hack it for base S48 ports - (generic-read-string!/partial s start end - read-fdes-substring!/errno - (channel-os-index - (port-data fd/port))))))) + (else ; no differnce between fd/ports and s48 ports + (let* ((buffer (make-string (- end start))) + (needed (if (> (byte-vector-length (port-buffer fd/port)) 1) + 'any 'immediate)) ;bufpol/none may return with 0 + (len (read-block buffer 0 needed fd/port))) + (if (eof-object? len) + #f + (begin + (copy-bytes! buffer 0 s start len) + len))))))) + (define (read-string/partial len . maybe-fd/port) (let* ((s (make-string len)) @@ -54,6 +56,8 @@ ;;; Persistent reading ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; +;;; Operation on ports is easy, since we can use read-block (define (generic-read-string! s start end reader source) (if (bogus-substring-spec? s start end) @@ -81,16 +85,11 @@ (generic-read-string! s start end read-fdes-substring!/errno fd/port)) - ((fdport? fd/port) - (generic-read-string! s start end - read-fdes-substring!/errno - (fdport-data:fd (port-data fd/port)))) - - ;; Hack it - (else - (generic-read-string! s start end - read-fdes-substring!/errno - (channel-os-index (port-data fd/port))))))) + (else ; no differnce between fd/port and s48 ports + (let ((nbytes/eof (read-block s start (- end start) fd/port))) + (if (eof-object? nbytes/eof) + #f + nbytes/eof)))))) (define (read-string len . maybe-fd/port) (let* ((s (make-string len)) @@ -125,12 +124,11 @@ (cond ((integer? fd/port) (generic-write-string/partial s start end write-fdes-substring/errno fd/port)) - ((fdport? fd/port) - (generic-write-string/partial s start end - write-fdes-substring/errno - (fdport-data:fd - (port-data fd/port)))) - (else (display (substring s start end) fd/port))))) ; hack + (else + ;; the only way to implement this, would be to use + ;; channel-maybe-write. But this is an VM-instruction which is not + ;; exported. Since we now have threads this shouldn;t matter. + (error "write-string/parital is no longer supported on ports"))))) ;;; Persistent writing @@ -155,9 +153,4 @@ (cond ((integer? fd/port) (generic-write-string s start end write-fdes-substring/errno fd/port)) - ((fdport? fd/port) - (generic-write-string s start end - write-fdes-substring/errno - (fdport-data:fd (port-data fd/port)))) - - (else (display (substring s start end) fd/port))))) ; hack + (else (write-block s start (- end start) fd/port)))))