Fix binary-port-position for output ports.
authorTaylor R Campbell <campbell@mumble.net>
Sat, 8 Dec 2018 14:19:46 +0000 (14:19 +0000)
committerChris Hanson <org/chris-hanson/cph>
Sun, 6 Jan 2019 07:30:02 +0000 (23:30 -0800)
Not sure if it'll DTRT for combined i/o ports; need more tests!

src/runtime/binary-port.scm
tests/runtime/test-binary-port.scm

index dfb60f3e77ad0eb8f8428d7ae81bd90017549370..fd24da67526f039dbfd28f643da98c0a101e7880 100644 (file)
@@ -301,11 +301,22 @@ USA.
 
 (define (binary-port-position port)
   (guarantee positionable-binary-port? port 'port-position)
-  (let ((ib (port-input-buffer port)))
-    (if ib
-       (- (channel-file-position (buffer-channel ib))
-          (fix:- (buffer-end ib) (buffer-start ib)))
-       (channel-file-position (buffer-channel (port-output-buffer port))))))
+  (let ((ib (port-input-buffer port))
+       (ob (port-output-buffer port)))
+    (let ((buffered-input?
+          (and ib (fix:< (buffer-start ib) (buffer-end ib))))
+         (buffered-output?
+          (and ob (fix:< (buffer-start ob) (buffer-end ob)))))
+      (define (channel-position buffer)
+       (channel-file-position (buffer-channel buffer)))
+      (define (buffer-position buffer)
+       (fix:- (buffer-end buffer) (buffer-start buffer)))
+      (cond ((and buffered-input? buffered-output?)
+            (error "Input and output buffered simultaneously:" port))
+           (ib (- (channel-position ib) (buffer-position ib)))
+           (ob (+ (channel-position ob) (buffer-position ob)))
+           (else
+            (error "Port has neither input nor output buffer:" port))))))
 
 (define (set-binary-port-position! port position)
   (guarantee positionable-binary-port? port 'set-port-position!)
index f2751f42356373e94624e41fd68dc8a2883c062a..64f33aa199ec6027a5ceb5de02c407659fb9a09b 100644 (file)
@@ -189,13 +189,9 @@ USA.
          (lambda (port)
            (assert-= (binary-port-position port) 0)
            (write-u8 42 port)
-           (expect-failure
-            (lambda ()
-              (assert-= (binary-port-position port) 1)))
+           (assert-= (binary-port-position port) 1)
            (write-bytevector (make-bytevector 1000 0) port)
-           (expect-failure
-            (lambda ()
-              (assert-= (binary-port-position port) 1001)))))
+           (assert-= (binary-port-position port) 1001)))
        (call-with-binary-input-file pathname
          (lambda (port)
            (assert-= (binary-port-position port) 0)