,@body))))
(do-external-formats (xf)
- (with-open-file (s "/dev/null" :direction :input :external-format xf)
+ (with-open-file (s #-win32 "/dev/null" #+win32 "nul" :direction :input :external-format xf)
(assert (eq (read-char s nil s) s))))
;;; Test standard character read-write equivalency over all external formats.
(dotimes (i 80)
(assert (equal (read-line s nil s)
"1234567890123456789012345678901234567890123456789")))))))
+
(with-test (:name (:character-decode-large :force-end-of-file)
:fails-on :sbcl)
+ (error "We can't reliably test this due to WITH-TIMEOUT race condition")
+ ;; This test will currently fail. But sometimes it will fail in
+ ;; ungracefully due to the WITH-TIMEOUT race mentioned above. This
+ ;; rightfully confuses some people, so we'll skip running the code
+ ;; for now. -- JES, 2006-01-27
+ #+nil
(with-open-file (s "external-format-test.txt" :direction :input
:external-format :utf-8)
(handler-bind
(let ((char (read-char s)))
(assert (= (char-code (eval char)) #xB0))))
(delete-file "external-format-test.txt")
+
+(let* ((koi8-r-codes (coerce '(240 210 201 215 197 212 33) '(vector (unsigned-byte 8))))
+ (uni-codes #(1055 1088 1080 1074 1077 1090 33))
+
+ (string (octets-to-string koi8-r-codes :external-format :koi8-r))
+ (uni-decoded (map 'vector #'char-code string)))
+ (assert (equalp (map 'vector #'char-code (octets-to-string koi8-r-codes :external-format :koi8-r))
+ uni-codes))
+ (assert (equalp (string-to-octets (map 'string #'code-char uni-codes) :external-format :koi8-r)
+ koi8-r-codes)))
\f
;;; tests of FILE-STRING-LENGTH
(let ((standard-characters "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$\"'(),_-./:;?+<=>#%&*@[\\]{|}`^~"))
(write-string string s)
(assert (= (file-position s) (+ position string-length))))))
\f
-;;;; success
\ No newline at end of file
+
+;;; See sbcl-devel "Subject: Bug in FILE-POSITION on UTF-8-encoded files"
+;;; by Lutz Euler on 2006-03-05 for more details.
+(with-test (:name (:file-position :utf-8))
+ (let ((path "external-format-test.txt"))
+ (with-open-file (s path
+ :direction :output
+ :if-exists :supersede
+ :element-type '(unsigned-byte 8))
+ ;; Write #\*, encoded in UTF-8, to the file.
+ (write-byte 42 s)
+ ;; Append #\adiaeresis, encoded in UTF-8, to the file.
+ (write-sequence '(195 164) s))
+ (with-open-file (s path :external-format :utf-8)
+ (read-char s)
+ (let ((pos (file-position s))
+ (char (read-char s)))
+ (format t "read character with code ~a successfully from file position ~a~%"
+ (char-code char) pos)
+ (file-position s pos)
+ (format t "set file position back to ~a, trying to read-char again~%" pos)
+ (let ((new-char (read-char s)))
+ (assert (char= char new-char)))))
+ (values)))
+
+;;;; success