Author: hhubner Date: 2006-10-24 05:56:56 -0400 (Tue, 24 Oct 2006) New Revision: 2039
Modified: branches/xml-class-rework/thirdparty/iconv/iconv.lisp Log: Do not try to convert empty strings
Modified: branches/xml-class-rework/thirdparty/iconv/iconv.lisp =================================================================== --- branches/xml-class-rework/thirdparty/iconv/iconv.lisp 2006-10-23 11:45:32 UTC (rev 2038) +++ branches/xml-class-rework/thirdparty/iconv/iconv.lisp 2006-10-24 09:56:56 UTC (rev 2039) @@ -58,41 +58,43 @@
(defun iconv (from-code to-code from-string &optional error-p (error-value #.(char-code #?))) - (with-iconv-cd (cd from-code to-code) - (let* ((from-len (length from-string)) - (to-len (* from-len 2)) - (inbuffer (cffi-uffi-compat:convert-to-foreign-string from-string)) - (outbuffer (cffi-uffi-compat:allocate-foreign-string to-len :unsigned t)) - (in-ptr (cffi-uffi-compat:allocate-foreign-object 'uchar-ptr)) - (out-ptr (cffi-uffi-compat:allocate-foreign-object 'uchar-ptr)) - (inbytesleft (cffi-uffi-compat:allocate-foreign-object :unsigned-int)) - (outbytesleft (cffi-uffi-compat:allocate-foreign-object :unsigned-int))) - (unwind-protect - (progn - (setf (cffi-uffi-compat:deref-pointer in-ptr 'uchar-ptr) inbuffer - (cffi-uffi-compat:deref-pointer out-ptr 'uchar-ptr) outbuffer - (cffi-uffi-compat:deref-pointer inbytesleft :unsigned-int) from-len - (cffi-uffi-compat:deref-pointer outbytesleft :unsigned-int) to-len) - (labels - ((current () - (- from-len (cffi-uffi-compat:deref-pointer inbytesleft :unsigned-int))) - (self () - (when (= (%iconv cd - in-ptr inbytesleft - out-ptr outbytesleft) - #xffffffff) - (if (find (get-errno) (list EILSEQ EINVAL) :test #'eql) - (if error-p - (error "invalid multibyte character (0x~X)." (cffi:mem-aref inbuffer :unsigned-char (current))) - (progn - (setf (cffi:mem-aref inbuffer :unsigned-char (current)) error-value) - (self))) - (error "unexpected iconv error ~A" (get-errno)))))) - (self)) - (cffi-uffi-compat:convert-from-foreign-string outbuffer :length (- to-len (cffi-uffi-compat:deref-pointer outbytesleft :unsigned-int)))) - (cffi-uffi-compat:free-foreign-object outbytesleft) - (cffi-uffi-compat:free-foreign-object inbytesleft) - (cffi-uffi-compat:free-foreign-object out-ptr) - (cffi-uffi-compat:free-foreign-object in-ptr) - (cffi-uffi-compat:free-foreign-object outbuffer) - (cffi-uffi-compat:free-foreign-object inbuffer))))) + (if (equal from-string "") + "" + (with-iconv-cd (cd from-code to-code) + (let* ((from-len (length from-string)) + (to-len (* from-len 2)) + (inbuffer (cffi-uffi-compat:convert-to-foreign-string from-string)) + (outbuffer (cffi-uffi-compat:allocate-foreign-string to-len :unsigned t)) + (in-ptr (cffi-uffi-compat:allocate-foreign-object 'uchar-ptr)) + (out-ptr (cffi-uffi-compat:allocate-foreign-object 'uchar-ptr)) + (inbytesleft (cffi-uffi-compat:allocate-foreign-object :unsigned-int)) + (outbytesleft (cffi-uffi-compat:allocate-foreign-object :unsigned-int))) + (unwind-protect + (progn + (setf (cffi-uffi-compat:deref-pointer in-ptr 'uchar-ptr) inbuffer + (cffi-uffi-compat:deref-pointer out-ptr 'uchar-ptr) outbuffer + (cffi-uffi-compat:deref-pointer inbytesleft :unsigned-int) from-len + (cffi-uffi-compat:deref-pointer outbytesleft :unsigned-int) to-len) + (labels + ((current () + (- from-len (cffi-uffi-compat:deref-pointer inbytesleft :unsigned-int))) + (self () + (when (= (%iconv cd + in-ptr inbytesleft + out-ptr outbytesleft) + #xffffffff) + (if (find (get-errno) (list EILSEQ EINVAL) :test #'eql) + (if error-p + (error "invalid multibyte character (0x~X)." (cffi:mem-aref inbuffer :unsigned-char (current))) + (progn + (setf (cffi:mem-aref inbuffer :unsigned-char (current)) error-value) + (self))) + (error "unexpected iconv error ~A" (get-errno)))))) + (self)) + (cffi-uffi-compat:convert-from-foreign-string outbuffer :length (- to-len (cffi-uffi-compat:deref-pointer outbytesleft :unsigned-int)))) + (cffi-uffi-compat:free-foreign-object outbytesleft) + (cffi-uffi-compat:free-foreign-object inbytesleft) + (cffi-uffi-compat:free-foreign-object out-ptr) + (cffi-uffi-compat:free-foreign-object in-ptr) + (cffi-uffi-compat:free-foreign-object outbuffer) + (cffi-uffi-compat:free-foreign-object inbuffer))))))