scm_i_make_transcoded_port: fix mode for input/output ports
authorRob Browning <rlb@defaultvalue.org>
Sun, 4 Oct 2020 19:05:29 +0000 (14:05 -0500)
committerRob Browning <rlb@defaultvalue.org>
Sun, 17 Jan 2021 19:25:42 +0000 (13:25 -0600)
* libguile/r6rs-ports.c (scm_i_make_transcoded_ports): make sure to
  include SCM_RDNG for input/output ports.

Thanks to Göran Weinholt for reporting the problem.

Closes: 41045
libguile/r6rs-ports.c
test-suite/tests/r6rs-ports.test

index 445ae5464a8169d2f6cd41a3968a0cd4d705ded1..49ca053253f4add3e8b63e63cd7003bdb0a3945c 100644 (file)
@@ -1168,8 +1168,8 @@ SCM_DEFINE (scm_i_make_transcoded_port,
 
   if (scm_is_true (scm_output_port_p (port)))
     mode |= SCM_WRTNG;
-  else if (scm_is_true (scm_input_port_p (port)))
-    mode |=  SCM_RDNG;
+  if (scm_is_true (scm_input_port_p (port)))
+    mode |= SCM_RDNG;
   
   result = make_transcoded_port (port, mode);
 
index 5b46cccd2fc731c1141a30dd8b31efaf3f7e4c70..4d1981df225ea59eb6eb8fc485520f322097ab56 100644 (file)
@@ -919,6 +919,32 @@ not `set-port-position!'"
 \f
 (with-test-prefix "8.2.6  Input and output ports"
 
+  (define (check-transcoded-port-mode make-port pred)
+    (let ((p (make-port "/dev/null" (file-options no-fail))))
+      (dynamic-wind
+        (lambda () #t)
+        (lambda ()
+          (set! p (transcoded-port p (native-transcoder)))
+          (pred p))
+        (lambda () (close-port p)))))
+
+  (pass-if "transcoded-port preserves input mode"
+    (check-transcoded-port-mode open-file-input-port
+                                (lambda (p)
+                                  (and (input-port? p)
+                                       (not (output-port? p))))))
+
+  (pass-if "transcoded-port preserves output mode"
+    (check-transcoded-port-mode open-file-output-port
+                                (lambda (p)
+                                  (and (not (input-port? p))
+                                       (output-port? p)))))
+
+  (pass-if "transcoded-port preserves input/output mode"
+    (check-transcoded-port-mode open-file-input/output-port
+                                (lambda (p)
+                                  (and (input-port? p) (output-port? p)))))
+
   (pass-if "transcoded-port [output]"
     (let ((s "Hello\nÄÖÜ"))
       (bytevector=?