+;;; Field conversion functions
+
+(defun canonicalize-field-types (types num-fields)
+ (if (listp types)
+ (let ((length-types (length types))
+ new-types)
+ (loop for i from 0 below num-fields
+ do
+ (if (>= i length-types)
+ (push t new-types) ;; types is shorted than num-fields
+ (push
+ (case (nth i types)
+ ((:int :long :double t)
+ (nth i types))
+ (t
+ t))
+ new-types)))
+ (nreverse new-types))
+ (if (eq types :auto)
+ :auto
+ nil)))
+
+(uffi:def-function "atoi"
+ ((str :cstring))
+ :returning :int)
+
+(uffi:def-function "atol"
+ ((str :cstring))
+ :returning :long)
+
+(uffi:def-function "atof"
+ ((str :cstring))
+ :returning :double)
+
+(defun convert-raw-field (char-ptr types index)
+ (let ((type (if (listp types)
+ (nth index types)
+ types)))
+ (case type
+ (:int
+ (atoi char-ptr))
+ (:long
+ (atol char-ptr))
+ (:double
+ (atof char-ptr))
+ (otherwise
+ (uffi:convert-from-foreign-string char-ptr)))))
+