X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcode%2Fexternal-formats%2Fmb-util.lisp;h=5569a9fcac02fb3585296547644475f9d431e083;hb=cd1b14acf6f548b28b8a14e554d779f0473122ec;hp=e8830997455db6c3b57119cb4369875c1826268a;hpb=f2db6743b1fadeea9e72cb583d857851c87efcd4;p=sbcl.git diff --git a/src/code/external-formats/mb-util.lisp b/src/code/external-formats/mb-util.lisp index e883099..5569a9f 100644 --- a/src/code/external-formats/mb-util.lisp +++ b/src/code/external-formats/mb-util.lisp @@ -1,15 +1,12 @@ (in-package "SB!IMPL") -(defun make-multibyte-mapper (list) +(defmacro define-multibyte-mapper (name list) (let ((list (sort (copy-list list) #'< :key #'car)) (hi (loop for x in list maximize (max (car x) (cadr x))))) - (make-array (list (length list) 2) - :element-type (list 'integer 0 hi) - :initial-contents list))) - -(defmacro define-multibyte-mapper (name list) - `(defparameter ,name - (make-multibyte-mapper ,list))) + `(defparameter ,name + (make-array '(,(length list) 2) + :element-type '(integer 0 ,hi) + :initial-contents ',list)))) (defun get-multibyte-mapper (table code) (declare (optimize speed (safety 0)) @@ -153,7 +150,12 @@ (declare (type (or null string) invalid)) (cond ((null invalid) - (vector-push-extend (,simple-get-mb-char array pos bytes) string)) + (let ((thing (,simple-get-mb-char array pos bytes))) + (typecase thing + (character (vector-push-extend thing string)) + (string + (dotimes (i (length thing)) + (vector-push-extend (char thing i) string)))))) (t (dotimes (i (length invalid)) (vector-push-extend (char invalid i) string)))) @@ -246,7 +248,15 @@ ;; for fd-stream.lisp (define-external-format/variable-width ,aliases t - (mb-char-len (or (,ucs-to-mb (char-code byte)) -1)) + ;; KLUDGE: it so happens that at present (2009-10-22) none of + ;; the external formats defined with + ;; define-multibyte-encoding can encode the unicode + ;; replacement character, so we hardcode the preferred + ;; replacement here. + #\? + (block size + (mb-char-len (or (,ucs-to-mb (char-code byte)) + (return-from size 0)))) (let ((mb (,ucs-to-mb bits))) (if (null mb) (external-format-encoding-error stream byte) @@ -257,7 +267,7 @@ (3 (setf (sap-ref-8 sap tail) (ldb (byte 8 16) mb) (sap-ref-8 sap (1+ tail)) (ldb (byte 8 8) mb) (sap-ref-8 sap (+ 2 tail)) (ldb (byte 8 0) mb)))))) - (,mb-len byte) + (1 (,mb-len byte)) (let* ((mb (ecase size (1 byte) (2 (let ((byte2 (sap-ref-8 sap (1+ head))))