Author: hhubner Date: 2006-10-22 12:40:58 -0400 (Sun, 22 Oct 2006) New Revision: 2024
Modified: branches/xml-class-rework/thirdparty/iconv/iconv.asd branches/xml-class-rework/thirdparty/iconv/iconv.lisp Log: converted to use cffi-uffi-compat
Modified: branches/xml-class-rework/thirdparty/iconv/iconv.asd =================================================================== --- branches/xml-class-rework/thirdparty/iconv/iconv.asd 2006-10-22 15:57:04 UTC (rev 2023) +++ branches/xml-class-rework/thirdparty/iconv/iconv.asd 2006-10-22 16:40:58 UTC (rev 2024) @@ -4,4 +4,4 @@ :author "Yoshinori Tahara read.eval.print@gmail.com" :version "0.2" :components ((:file "iconv")) - :depends-on (uffi)) + :depends-on (cffi-uffi-compat))
Modified: branches/xml-class-rework/thirdparty/iconv/iconv.lisp =================================================================== --- branches/xml-class-rework/thirdparty/iconv/iconv.lisp 2006-10-22 15:57:04 UTC (rev 2023) +++ branches/xml-class-rework/thirdparty/iconv/iconv.lisp 2006-10-22 16:40:58 UTC (rev 2024) @@ -1,16 +1,19 @@ (defpackage :koto.iconv (:nicknames :iconv) - (:use :cl :uffi) + (:use :cl :cffi-uffi-compat) (:export :iconv :EILSEQ :EINVAL :E2BIG)) - + (in-package :iconv)
+(cffi-uffi-compat:load-foreign-library "/usr/lib/libc.so") +(cffi-uffi-compat:load-foreign-library "/usr/local/lib/libiconv.so") + #-:sbcl -(uffi:def-foreign-var ("errno" errno) :int "iconv") +(cffi-uffi-compat:def-foreign-var ("errno" errno) :int "iconv")
(defun get-errno () #-:sbcl @@ -19,71 +22,58 @@ (sb-alien:get-errno) )
-(uffi:def-constant EILSEQ #+freebsd 86 #-freebsd 84) ;invalid multibyte -(uffi:def-constant EINVAL 22) ;imcomplete multibyte -(uffi:def-constant E2BIG 7) ;not enough outbuf +(cffi-uffi-compat:def-constant EILSEQ #+freebsd 86 #-freebsd 84) ;invalid multibyte +(cffi-uffi-compat:def-constant EINVAL 22) ;imcomplete multibyte +(cffi-uffi-compat:def-constant E2BIG 7) ;not enough outbuf
-(uffi:def-foreign-type char-ptr (* :unsigned-char)) -(uffi:def-foreign-type iconv-t :pointer-void) +(cffi-uffi-compat:def-foreign-type uchar-ptr (* :unsigned-char)) +(cffi-uffi-compat:def-foreign-type iconv-t :pointer-void)
-(uffi:def-function ("iconv_open" iconv-open) +(cffi-uffi-compat:def-function ("iconv_open" iconv-open) ((tocode :cstring) (fromcode :cstring)) :returning 'iconv-t)
-(uffi:def-function ("iconv_close" iconv-close) +(cffi-uffi-compat:def-function ("iconv_close" iconv-close) ((cd 'iconv-t)) :returning :int)
-(uffi:def-function ("iconv" %iconv) +(cffi-uffi-compat:def-function ("iconv" %iconv) ((cd 'iconv-t) - (inbuf (* char-ptr)) + (inbuf (* uchar-ptr)) (inbytesleft (* :unsigned-long)) - (outbuf (* char-ptr)) + (outbuf (* uchar-ptr)) (outbytesleft (* :unsigned-long))) :returning :unsigned-int)
(defmacro with-iconv-cd ((cd from to) &body body) - `(uffi:with-cstrings ((fromcode ,from) + `(cffi-uffi-compat:with-cstrings ((fromcode ,from) (tocode ,to)) (let ((,cd (iconv-open tocode fromcode))) (unwind-protect (progn ,@body) (iconv-close ,cd)))))
-(defun iconv (from-code to-code from-vector +(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-vector)) + (let* ((from-len (length from-string)) (to-len (* from-len 2)) - (remain (make-array 3 - :element-type '(unsigned-byte 8) - :fill-pointer 0 - :adjustable t)) - (string-mode (characterp (aref from-vector 0))) - inbuffer - (outbuffer (uffi:allocate-foreign-string to-len :unsigned t)) - (in-ptr (uffi:allocate-foreign-object 'char-ptr)) - (out-ptr (uffi:allocate-foreign-object 'char-ptr)) - (inbytesleft (uffi:allocate-foreign-object :unsigned-int)) - (outbytesleft (uffi:allocate-foreign-object :unsigned-int))) + (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 - (if string-mode - (setf inbuffer (uffi:convert-to-foreign-string from-vector)) - (progn - (setf inbuffer (uffi:allocate-foreign-string from-len :unsigned t)) - (loop for i from 0 below from-len - do (setf (uffi:deref-array inbuffer :unsigned-char i) - (aref from-vector i))))) - (setf (uffi:deref-pointer in-ptr 'char-ptr) inbuffer - (uffi:deref-pointer out-ptr 'char-ptr) outbuffer - (uffi:deref-pointer inbytesleft :unsigned-int) from-len - (uffi:deref-pointer outbytesleft :unsigned-int) to-len) + (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 (uffi:deref-pointer - inbytesleft :unsigned-int))) + (- from-len (cffi-uffi-compat:deref-pointer inbytesleft :unsigned-int))) (self () (when (= (%iconv cd in-ptr inbytesleft @@ -92,29 +82,17 @@ (if (= (get-errno) EILSEQ) (if error-p (error "invalid multibyte(~X)." - (uffi:deref-array - inbuffer :unsigned-byte (current))) + (cffi-uffi-compat:deref-array inbuffer (cffi-uffi-compat::convert-uffi-type :unsigned-byte) (current))) (progn - (setf (uffi:deref-array - inbuffer :unsigned-byte (current)) - error-value) + (setf (cffi-uffi-compat:deref-array inbuffer (cffi-uffi-compat::convert-uffi-type :unsigned-byte) (current)) + error-value) (self))) - (loop for i from (current) - below from-len - do (vector-push-extend - (aref from-vector i) remain)))))) + (error "unexpected iconv error ~A" (get-errno)))))) (self)) - (let* ((out-length (- to-len (uffi:deref-pointer outbytesleft :unsigned-int))) - (out (make-array out-length - :element-type (array-element-type from-vector)))) - (dotimes (i out-length) - (setf (aref out i) (if string-mode - (code-char (uffi:deref-array outbuffer :unsigned-byte i)) - (uffi:deref-array outbuffer :unsigned-byte i)))) - (values out remain))) - (progn (uffi:free-foreign-object outbytesleft) - (uffi:free-foreign-object inbytesleft) - (uffi:free-foreign-object out-ptr) - (uffi:free-foreign-object in-ptr) - (uffi:free-foreign-object outbuffer) - (uffi:free-foreign-object inbuffer)))))) + (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)))))