Changeset 2764

Show
Ignore:
Timestamp:
03/19/08 16:57:27 (10 months ago)
Author:
ksprotte
Message:

fixed %decode-string for utf-8, native version for sbcl + test-case

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/bknr/datastore/src/data/encoding-test.lisp

    r2743 r2764  
    107107               (make-array 10 :initial-element #\f :element-type 'character 
    108108                           :fill-pointer 3)) 
     109 
     110(test:test string.decode-utf-8 
     111  (labels ((decode-string-from-octets (octets) 
     112             (flexi-streams:with-input-from-sequence (in octets) 
     113               (bknr.datastore::%decode-string in))))     
     114    (test:is (string-equal "<=>" (decode-string-from-octets #(1 3 60 61 62)))) 
     115    (test:is (string-equal "<?>" (decode-string-from-octets #(1 3 60 188 62)))) 
     116    (test:for-all ((octets (test:gen-buffer))) 
     117      (test:finishes (decode-string-from-octets (concatenate 'vector (vector 1 (length octets)) octets)))))) 
    109118 
    110119;; #+(or (and sbcl sb-unicode) lispworks clisp acl) 
  • trunk/bknr/datastore/src/data/encoding.lisp

    r2748 r2764  
    334334 
    335335(defun %decode-string (stream) 
    336   #-allegro 
    337   (let* ((n (%decode-integer stream)) 
    338          (s (make-string n))) 
    339     (dotimes (i n) 
    340       (setf (char s i) (%read-char stream))) 
    341     s) 
    342   #+allegro 
    343   (let* ((n (%decode-integer stream)) 
    344          (s (make-array n))) 
    345     (excl::stream-read-sequence stream s) 
    346     #+nil (map 'string #'code-char s) 
    347     #-nil (coerce s 'string))) 
     336  (labels ((octets-to-string-safe (octets) ; and portable 
     337             (let ((flexi-streams:*substitution-char* #\?)) 
     338               (flexi-streams:octets-to-string octets :external-format #.(flexi-streams:make-external-format :utf-8)))) 
     339           (octets-to-string (octets) 
     340             #+sbcl (handler-case 
     341                        #+sbcl(sb-ext:octets-to-string octets :external-format :utf-8) 
     342                        (#+sbcl sb-impl::octet-decoding-error () 
     343                                (octets-to-string-safe octets))) 
     344             #-sbcl (octets-to-string-safe octets))) 
     345    (let* ((n (%decode-integer stream)) 
     346           (buffer (make-array n :element-type '(unsigned-byte 8))))     
     347      (assert (= n (read-sequence buffer stream))) 
     348      (octets-to-string buffer)))) 
    348349 
    349350(defun %decode-symbol (stream)