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)))))))
!