[bknr-cvs] r2022 - branches/xml-class-rework/thirdparty/iconv

bknr at bknr.net bknr at bknr.net
Sat Oct 21 16:14:15 UTC 2006


Author: hhubner
Date: 2006-10-21 12:14:15 -0400 (Sat, 21 Oct 2006)
New Revision: 2022

Modified:
   branches/xml-class-rework/thirdparty/iconv/iconv.lisp
Log:
FreeBSD fixes
Add string mode to convert strings directly
Create output buffer with correct size (after conversion)


Modified: branches/xml-class-rework/thirdparty/iconv/iconv.lisp
===================================================================
--- branches/xml-class-rework/thirdparty/iconv/iconv.lisp	2006-10-21 15:32:24 UTC (rev 2021)
+++ branches/xml-class-rework/thirdparty/iconv/iconv.lisp	2006-10-21 16:14:15 UTC (rev 2022)
@@ -19,7 +19,7 @@
   (sb-alien:get-errno)
   )
 
-(uffi:def-constant EILSEQ 84)           ;invalid multibyte
+(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
 
@@ -53,19 +53,15 @@
 
 (defun iconv (from-code to-code from-vector
 	      &optional error-p (error-value #.(char-code #\?)))
-  (declare (type (vector (unsigned-byte 8)) from-vector))
   (with-iconv-cd (cd from-code to-code)
     (let* ((from-len (length from-vector))
 	   (to-len (* from-len 2))
-	   (out (make-array to-len
-			    :element-type '(unsigned-byte 8)
-			    :fill-pointer 0
-			    :adjustable t))
 	   (remain (make-array 3
 			       :element-type '(unsigned-byte 8)
 			       :fill-pointer 0
 			       :adjustable t))
-	   (inbuffer (uffi:allocate-foreign-string from-len :unsigned 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))
@@ -73,46 +69,52 @@
 	   (outbytesleft (uffi:allocate-foreign-object :unsigned-int)))
       (unwind-protect
 	   (progn
-	     (loop for i from 0 below from-len
-		   do (setf (uffi:deref-array inbuffer :unsigned-char i)
-			    (aref from-vector i)))
+	     (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)
-	     (labels ((current ()
-			(- from-len (uffi:deref-pointer
-				     inbytesleft :unsigned-int)))
-		      (self ()
-			(when (= (%iconv cd
-					 in-ptr inbytesleft
-					 out-ptr outbytesleft)
-				 #xffffffff)
-			    (if (= (get-errno) EILSEQ)
-				(if error-p
-				    (error "invalid multibyte(~X)."
-					   (uffi:deref-array
-					    inbuffer :unsigned-byte (current)))
-				    (progn
-				      (setf (uffi:deref-array
-					     inbuffer :unsigned-byte (current))
-					    error-value)
-				      (self)))
-				(loop for i from (current)
-				   below from-len
-				   do (vector-push-extend
-				       (aref from-vector i) remain))))))
+	     (labels
+		 ((current ()
+		    (- from-len (uffi:deref-pointer
+				 inbytesleft :unsigned-int)))
+		  (self ()
+		    (when (= (%iconv cd
+				     in-ptr inbytesleft
+				     out-ptr outbytesleft)
+			     #xffffffff)
+		      (if (= (get-errno) EILSEQ)
+			  (if error-p
+			      (error "invalid multibyte(~X)."
+				     (uffi:deref-array
+				      inbuffer :unsigned-byte (current)))
+			      (progn
+				(setf (uffi:deref-array
+				       inbuffer :unsigned-byte (current))
+					  error-value)
+				(self)))
+			  (loop for i from (current)
+			     below from-len
+			     do (vector-push-extend
+				 (aref from-vector i) remain))))))
 	       (self))
-	     (loop for i from 0
-		   below (- to-len
-			    (uffi:deref-pointer outbytesleft :unsigned-int))
-		   do (vector-push-extend
-		       (uffi:deref-array outbuffer :unsigned-byte i)
-		       out)))
+	     (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)))
-      (values out remain))))
+	       (uffi:free-foreign-object inbuffer))))))




More information about the Bknr-cvs mailing list