[Git][cmucl/cmucl][issue-140-stream-element-type-two-way-stream] Allow broadcast-stream and two-way-stream for stream-external-format

Raymond Toy (@rtoy) gitlab at common-lisp.net
Wed Oct 19 00:07:18 UTC 2022



Raymond Toy pushed to branch issue-140-stream-element-type-two-way-stream at cmucl / cmucl


Commits:
145aa085 by Raymond Toy at 2022-10-18T17:06:58-07:00
Allow broadcast-stream and two-way-stream for stream-external-format

`stream-external-format` for a `broadcast-stream` is `:default`,
according to the CLHS.

For a `two-way-stream`, the CLHS doesn't say, so we'll return the
common external format if there is one, or `:default` if they're
different.

For a `synonym-stream`, the CLHS also doesn't say, so we'll just
return the format of the value of the synonym stream symbol.

Add tests for test different types of streams, except for
`broadcast-stream`.  The ansi-tests have tests for this.

- - - - -


2 changed files:

- src/code/stream.lisp
- tests/issues.lisp


Changes:

=====================================
src/code/stream.lisp
=====================================
@@ -295,8 +295,22 @@
     (etypecase stream
       #+unicode
       (fd-stream (fd-stream-external-format stream))
-      (synonym-stream (stream-external-format
-		       (symbol-value (synonym-stream-symbol stream)))))
+      (broadcast-stream
+       ;; See http://www.lispworks.com/documentation/HyperSpec/Body/t_broadc.htm
+       :default)
+      (synonym-stream
+       ;; What should happen if (synonym-stream-symbol stream) is unbound?
+       (stream-external-format
+	(symbol-value (synonym-stream-symbol stream))))
+      (two-way-stream
+       ;; Not defined by CLHS, but useful to return the common format
+       ;; of the input and output streams when they're the same;
+       ;; otherwise return :default.
+       (let ((in-format (stream-external-format (two-way-stream-input-stream stream)))
+	     (out-format (stream-external-format (two-way-stream-output-stream stream))))
+	 (if (eql in-format out-format)
+	     in-format
+	     :default))))
     ;; fundamental-stream
     :default))
 


=====================================
tests/issues.lisp
=====================================
@@ -670,9 +670,42 @@
 		 (err (relerr value answer)))
 	    (assert-true (<= err eps) base err eps)))))))
 
-(define-test issue.140
+;;; Test stream-external-format for various types of streams.
+
+;; Test two-way-stream where both streams have the same external
+;; format.
+(define-test issue.140.1
+    (:tag :issues)
+  (with-open-file (in (merge-pathnames "issues.lisp" cmucl-test-runner::*load-path*)
+		      :direction :input
+		      :external-format :utf-8)
+    (with-open-file (out "/tmp/output.tst"
+			 :direction :output
+			 :external-format :utf-8
+			 :if-exists :supersede)
+      (let ((two-way-stream (make-two-way-stream in out)))
+	(assert-equal :utf-8 (stream-external-format two-way-stream))))))
+
+;; Test two-way-stream where the two streams have the different
+;; external formats.
+(define-test issue.140.2
     (:tag :issues)
-  (with-output-to-string (out)
-    (with-input-from-string (in "abc")
+  (with-open-file (in (merge-pathnames "issues.lisp" cmucl-test-runner::*load-path*)
+		      :direction :input
+		      :external-format :iso8859-1)
+    (with-open-file (out "/tmp/output.tst"
+			 :direction :output
+			 :external-format :utf-8
+			 :if-exists :supersede)
       (let ((two-way-stream (make-two-way-stream in out)))
-	(assert-error 'type-error (stream-external-format two-way-stream))))))
+	(assert-equal :default (stream-external-format two-way-stream))))))
+
+;; Test synonym-stream returns the format of the underlying stream.
+(define-test issue.140.3
+    (:tag :issues)
+  (with-open-file (s (merge-pathnames "issues.lisp" cmucl-test-runner::*load-path*)
+		     :direction :input
+		     :external-format :iso8859-1)
+    (let ((syn (make-synonym-stream '*syn-stream*)))
+      (setf syn s)
+      (assert-equal :iso8859-1 (stream-external-format syn)))))



View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/145aa085a805aa7f20ea45582fa603536865bb30

-- 
View it on GitLab: https://gitlab.common-lisp.net/cmucl/cmucl/-/commit/145aa085a805aa7f20ea45582fa603536865bb30
You're receiving this email because of your account on gitlab.common-lisp.net.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.common-lisp.net/pipermail/cmucl-cvs/attachments/20221019/18eb8d55/attachment-0001.html>


More information about the cmucl-cvs mailing list