,@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.
(with-open-file (s "external-format-test.txt" :direction :input
:external-format xf)
(loop for character across standard-characters
- do (assert (eql (read-char s) character))))))
+ do (let ((got (read-char s)))
+ (unless (eql character got)
+ (error "wanted ~S, got ~S" character got)))))))
(delete-file "external-format-test.txt")
#-sb-unicode
:if-exists :supersede :external-format :utf-8)
(dotimes (n offset)
(write-char #\a s))
- (dotimes (n 4097)
+ (dotimes (n (+ 4 sb-impl::+bytes-per-buffer+))
(write-char character s)))
(with-open-file (s "external-format-test.txt" :direction :input
:external-format :utf-8)
(dotimes (n offset)
(assert (eql (read-char s) #\a)))
- (dotimes (n 4097)
- (assert (eql (read-char s) character)))
+ (dotimes (n (+ 4 sb-impl::+bytes-per-buffer+))
+ (let ((got (read-char s)))
+ (unless (eql got character)
+ (error "wanted ~S, got ~S (~S)" character got n))))
(assert (eql (read-char s nil s) s))))))
;;; Test character decode restarts.
;;; 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)
- :fails-on :sbcl)
+(with-test (:name (:file-position :utf-8))
(let ((path "external-format-test.txt"))
(with-open-file (s path
:direction :output
(assert (char= char new-char)))))
(values)))
+;;; External format support in SB-ALIEN
+
+(with-test (:name (:sb-alien :vanilla))
+ (define-alien-routine strdup c-string (str c-string))
+ (assert (equal "foo" (strdup "foo"))))
+
+(with-test (:name (:sb-alien :utf-8 :utf-8))
+ (define-alien-routine strdup (c-string :external-format :utf-8)
+ (str (c-string :external-format :utf-8)))
+ (assert (equal "foo" (strdup "foo"))))
+
+(with-test (:name (:sb-alien :latin-1 :utf-8))
+ (define-alien-routine strdup (c-string :external-format :latin-1)
+ (str (c-string :external-format :utf-8)))
+ (assert (= (length (strdup (string (code-char 246))))
+ 2)))
+
+(with-test (:name (:sb-alien :utf-8 :latin-1))
+ (define-alien-routine strdup (c-string :external-format :utf-8)
+ (str (c-string :external-format :latin-1)))
+ (assert (equal (string (code-char 228))
+ (strdup (concatenate 'string
+ (list (code-char 195))
+ (list (code-char 164)))))))
+
+(with-test (:name (:sb-alien :ebcdic :ebcdic))
+ (define-alien-routine strdup (c-string :external-format :ebcdic-us)
+ (str (c-string :external-format :ebcdic-us)))
+ (assert (equal "foo" (strdup "foo"))))
+
+(with-test (:name (:sb-alien :latin-1 :ebcdic))
+ (define-alien-routine strdup (c-string :external-format :latin-1)
+ (str (c-string :external-format :ebcdic-us)))
+ (assert (not (equal "foo" (strdup "foo")))))
+
+(with-test (:name (:sb-alien :simple-base-string))
+ (define-alien-routine strdup (c-string :external-format :ebcdic-us
+ :element-type base-char)
+ (str (c-string :external-format :ebcdic-us)))
+ (assert (typep (strdup "foo") 'simple-base-string)))
+
;;;; success