r9727: 1 Jul 2004 Kevin Rosenberg <kevin@rosenberg.net>
[clsql.git] / uffi / clsql-uffi.lisp
index e1f687b53494cd28b2f9471bff3d0a444e49207e..1bb9a1a90d0b6085b4d5f3d6d754fb5b4f5e2e80 100644 (file)
 
 (defun canonicalize-type-list (types auto-list)
   "Ensure a field type list meets expectations"
-  (declaim (optimize (speed 3) (safety 0)))
+  (declare (optimize (speed 3) (safety 0)))
   (do ((i 0 (1+ i))
        (new-types '())
        (length-types (length types))
        (length-auto-list (length auto-list)))
       ((= i length-auto-list)
        (nreverse new-types))
-    (declaim (fixnum length-types length-auto-list i))
+    (declare (fixnum length-types length-auto-list i))
     (if (>= i length-types)
        (push t new-types) ;; types is shorted than num-fields
        (push
   :returning :unsigned-int)
 
 (uffi:def-constant +2^32+ 4294967296)
+(uffi:def-constant +2^64+ 18446744073709551616)
 (uffi:def-constant +2^32-1+ (1- +2^32+))
 
 (defmacro make-64-bit-integer (high32 low32)
-  `(+ ,low32 (ash ,high32 32)))
+  `(if (zerop (ldb (byte 1 31) ,high32))
+       (+ ,low32 (ash ,high32 32))
+     (- (+ ,low32 (ash ,high32 32)) +2^64+)))
+
+;; From high to low ints
+(defmacro make-128-bit-integer (a b c d)
+  `(+ ,d (ash ,c 32) (ash ,b 64) (ash ,a 96)))
 
 (defmacro split-64-bit-integer (int64)
   `(values (ash ,int64 -32) (logand ,int64 +2^32-1+)))