X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-char.lisp;h=7f963b870ece52d75750243e30a98d3f8a6be7f7;hb=dcb73f3edef1e31078fbe585e2fafbd26743efd7;hp=92d529bcdf6f1c713d34c2cdac207dc6d6f71083;hpb=acc978383105b5a2bfd970f8a34214fd5774bb2a;p=sbcl.git diff --git a/src/code/target-char.lisp b/src/code/target-char.lisp index 92d529b..7f963b8 100644 --- a/src/code/target-char.lisp +++ b/src/code/target-char.lisp @@ -67,8 +67,10 @@ for char-name = (string-upcase (read stream nil nil)) while code-point do (setf (gethash code-point names) char-name)) - (let ((tree (make-huffman-tree - (let (list) + (let ((tree + #!+sb-unicode + (make-huffman-tree + (let (list) (maphash (lambda (code name) (declare (ignore code)) (push name list)) @@ -248,8 +250,13 @@ (let ((h-code (cdr (binary-search char-code (car *unicode-character-name-database*) :key #'car)))) - (when h-code - (huffman-decode h-code *unicode-character-name-huffman-tree*)))))) + (cond + (h-code + (huffman-decode h-code *unicode-character-name-huffman-tree*)) + ((< char-code #x10000) + (format nil "U~4,'0X" char-code)) + (t + (format nil "U~8,'0X" char-code))))))) (defun name-char (name) #!+sb-doc @@ -264,12 +271,23 @@ (let ((encoding (huffman-encode (string-upcase name) *unicode-character-name-huffman-tree*))) (when encoding - (let ((char-code - (car (binary-search encoding - (cdr *unicode-character-name-database*) - :key #'cdr)))) - (when char-code - (code-char char-code))))))) + (let* ((char-code + (car (binary-search encoding + (cdr *unicode-character-name-database*) + :key #'cdr))) + (name-string (string name)) + (name-length (length name-string))) + (cond + (char-code + (code-char char-code)) + ((and (or (= name-length 9) + (= name-length 5)) + (char-equal (char name-string 0) #\U) + (loop for i from 1 below name-length + always (digit-char-p (char name-string i) 16))) + (code-char (parse-integer name-string :start 1 :radix 16))) + (t + nil))))))) ;;;; predicates