clsql/uffi clsql-uffi.lisp,1.1,1.2

"Kevin M. Rosenberg" <[email protected]> Fri, 13 Dec 2002 05:21:56 -0700
Newsgroups gmane.lisp.clsql.cvs
Message-ID <[email protected]>
Update of /pubcvs/clsql/uffi
In directory boa.b9.com:/tmp/cvs-serv378/uffi

Modified Files:
	clsql-uffi.lisp 
Log Message:



Index: clsql-uffi.lisp
===================================================================
RCS file: /pubcvs/clsql/uffi/clsql-uffi.lisp,v
retrieving revision 1.1
retrieving revision 1.2
diff -C2 -d -r1.1 -r1.2
*** clsql-uffi.lisp	30 Sep 2002 10:19:24 -0000	1.1
--- clsql-uffi.lisp	13 Dec 2002 12:21:54 -0000	1.2
***************
*** 84,103 ****
    `(values (ash ,int64 -32) (logand ,int64 +2^32-1+)))
  
  (defun convert-raw-field (char-ptr types index)
    (let ((type (if (listp types)
  		  (nth index types)
  		  types)))
!     (case type
!       (:double
!        (atof char-ptr))
!       ((or :int32 :int)
!        (atoi char-ptr))
!       (:int64
!        (uffi:with-foreign-object (high32-ptr :int)
! 	 (let ((low32 (atol64 char-ptr high32-ptr))
! 	       (high32 (uffi:deref-pointer high32-ptr :int)))
! 	   (if (zerop high32)
! 	       low32
! 	       (make-64-bit-integer high32 low32)))))
        (t
!        (uffi:convert-from-foreign-string char-ptr)))))
--- 84,118 ----
    `(values (ash ,int64 -32) (logand ,int64 +2^32-1+)))
  
+ (defun char-ptr-points-to-null (char-ptr)
+   "Returns T if foreign character pointer refers to 'NULL' string. Only called for numeric entries"
+   ;; Uses short cut and returns T if first character is #\N. It should
+   ;; never be non-numeric
+   (let ((char (uffi:ensure-char-character
+ 	       (uffi:deref-pointer char-ptr :char))))
+     (eql char #\N)))
+     
  (defun convert-raw-field (char-ptr types index)
    (let ((type (if (listp types)
  		  (nth index types)
  		  types)))
!     (cond
!       ((and (or (eq type :double) (eq type :int32) (eq type :int)
! 		(eq type :int64))
! 	    (char-ptr-points-to-null char-ptr))
!        nil)
        (t
!        (case type
! 	 (:double
! 	  (atof char-ptr))
! 	 ((or :int32 :int)
! 	  (atoi char-ptr))
! 	 (:int64
! 	  (uffi:with-foreign-object (high32-ptr :int)
! 	    (let ((low32 (atol64 char-ptr high32-ptr))
! 		  (high32 (uffi:deref-pointer high32-ptr :int)))
! 	      (if (zerop high32)
! 		  low32
! 		  (make-64-bit-integer high32 low32)))))
! 	 (t
! 	  (uffi:convert-from-foreign-string char-ptr)))))))
!