Update of /project/elephant/cvsroot/elephant/src/memutil In directory clnet:/tmp/cvs-serv1882/src/memutil
Modified Files: libmemutil.c memutil.lisp Log Message: Added 64-bit support, verified for 32-bit lisp via Allegro/Mac OS X. Thanks to Henrik Hjelte
--- /project/elephant/cvsroot/elephant/src/memutil/libmemutil.c 2006/11/11 18:41:11 1.2 +++ /project/elephant/cvsroot/elephant/src/memutil/libmemutil.c 2007/02/01 04:03:27 1.3 @@ -57,48 +57,47 @@
#include <string.h> #include <wchar.h> +#include <stdint.h>
/* Pointer arithmetic utility functions */ -/* should these be in network-byte order? probably not..... */ -int read_int(char *buf, int offset) { - int i; - memcpy(&i, buf+offset, sizeof(int)); - return i; -} - -unsigned int read_uint(char *buf, int offset) { - unsigned int ui; - memcpy(&ui, buf+offset, sizeof(unsigned int)); - return ui; -}
-float read_float(char *buf, int offset) { - float f; - memcpy(&f, buf+offset, sizeof(float)); - return f; -} +/* NOTE: Byte order is on a per-machine basis, serialized streams using this + library will not be compatable between little-endian and big-endian platforms */
-double read_double(char *buf, int offset) { - double d; - memcpy(&d, buf+offset, sizeof(double)); - return d; -} +/*------------------------------------------------------------------------------ + reader_and_writer
-void write_int(char *buf, int num, int offset) { - memcpy(buf+offset, &num, sizeof(int)); -} + Generates the following code:
-void write_uint(char *buf, unsigned int num, int offset) { - memcpy(buf+offset, &num, sizeof(unsigned int)); -} - -void write_float(char *buf, float num, int offset) { - memcpy(buf+offset, &num, sizeof(float)); -} - -void write_double(char *buf, double num, int offset) { - memcpy(buf+offset, &num, sizeof(double)); -} + double read_double(char *buf, int offset) { + double d; + memcpy(&d, buf+offset, sizeof(double)); + return d; + } + void write_double(char *buf, double num, int offset) { + memcpy(buf+offset, &num, sizeof(double)); + } + When called like this: + reader_and_writer(double) +-------------------------------------------------------------------------------- +*/ + +#define reader_and_writer( DATATYPE ) \ +DATATYPE read_##DATATYPE (char *buf, int offset) { \ + DATATYPE i; \ + memcpy(&i, buf+offset, sizeof( DATATYPE )); \ + return i; \ +} \ +void write_##DATATYPE (char *buf, DATATYPE num, int offset) { \ + memcpy(buf+offset, &num, sizeof( DATATYPE )); \ +} + +reader_and_writer(int32_t) +reader_and_writer(uint32_t) +reader_and_writer(int64_t) +reader_and_writer(uint64_t) +reader_and_writer(float) +reader_and_writer(double)
char *offset_charp(char *p, int offset) { return p + offset; --- /project/elephant/cvsroot/elephant/src/memutil/memutil.lisp 2007/01/31 20:05:38 1.15 +++ /project/elephant/cvsroot/elephant/src/memutil/memutil.lisp 2007/02/01 04:03:28 1.16 @@ -40,11 +40,17 @@ #:resize-buffer-stream #:resize-buffer-stream-no-copy #:reset-buffer-stream #:buffer-stream-buffer #:buffer-stream-length #:buffer-stream-size - #:buffer-write-byte #:buffer-write-int - #:buffer-write-uint #:buffer-write-float #:buffer-write-double - #:buffer-write-string #:buffer-read-byte #:buffer-read-fixnum - #:buffer-read-int #:buffer-read-uint #:buffer-read-float - #:buffer-read-double + + #:buffer-write-byte #:buffer-write-float + #:buffer-write-double #:buffer-write-string + #:buffer-write-int32 #:buffer-write-uint32 + #:buffer-write-int64 #:buffer-write-uint64 + + #:buffer-read-byte #:buffer-read-fixnum32 #:buffer-read-fixnum64 + #:buffer-read-int32 #:buffer-read-uint32 + #:buffer-read-int64 #:buffer-read-uint64 + #:buffer-read-float #:buffer-read-double + #:buffer-read-ucs1-string #+(or lispworks (and allegro ics)) #:buffer-read-ucs2-string #+(and sbcl sb-unicode) #:buffer-read-ucs4-string @@ -92,11 +98,12 @@ ;;buffer-stream-buffer buffer-stream-size buffer-stream-position ;;buffer-stream-length reset-buffer-stream - buffer-write-byte buffer-write-int buffer-write-uint + buffer-write-byte buffer-write-int32 buffer-write-uint32 + buffer-write-int64 buffer-write-uint64 buffer-write-float buffer-write-double buffer-write-string - buffer-read-byte buffer-read-fixnum buffer-read-int - buffer-read-uint buffer-read-float buffer-read-double - buffer-read-ucs1-string + buffer-read-byte buffer-read-fixnum buffer-read-int32 + buffer-read-uint32 buffer-read-int64 buffer-read-uint64 + buffer-read-float buffer-read-double buffer-read-ucs1-string #+(or lispworks (and allegro ics)) buffer-read-ucs2-string #+(and sbcl sb-unicode) buffer-read-ucs4-string)) ) @@ -174,7 +181,7 @@ ;; TODO: #+openmcl versions which do macptr arith.
#+(or cmu sbcl) -(defun read-int (buf offset) +(defun read-int32 (buf offset) "Read a 32-bit signed integer from a foreign char buffer." (declare (type (alien (* char)) buf) (type fixnum offset)) @@ -183,7 +190,16 @@ (* (signed 32))))))
#+(or cmu sbcl) -(defun read-uint (buf offset) +(defun read-int64 (buf offset) + "Read a 64-bit signed integer from a foreign char buffer." + (declare (type (alien (* char)) buf) + (type fixnum offset)) + (the (signed-byte 64) + (deref (cast (sap-alien (sap+ (alien-sap buf) offset) (* char)) + (* (signed 64)))))) + +#+(or cmu sbcl) +(defun read-uint32 (buf offset) "Read a 32-bit unsigned integer from a foreign char buffer." (declare (type (alien (* char)) buf) (type fixnum offset)) @@ -191,6 +207,16 @@ (deref (cast (sap-alien (sap+ (alien-sap buf) offset) (* char)) (* (unsigned 32))))))
+ +#+(or cmu sbcl) +(defun read-uint64 (buf offset) + "Read a 64-bit unsigned integer from a foreign char buffer." + (declare (type (alien (* char)) buf) + (type fixnum offset)) + (the (signed-byte 64) + (deref (cast (sap-alien (sap+ (alien-sap buf) offset) (* char)) + (* (signed 64)))))) + #+(or cmu sbcl) (defun read-float (buf offset) "Read a single-float from a foreign char buffer." @@ -210,7 +236,7 @@ (* double-float)))))
#+(or cmu sbcl) -(defun write-int (buf num offset) +(defun write-int32 (buf num offset) "Write a 32-bit signed integer to a foreign char buffer." (declare (type (alien (* char)) buf) (type (signed-byte 32) num) @@ -219,7 +245,16 @@ (* (signed 32)))) num))
#+(or cmu sbcl) -(defun write-uint (buf num offset) +(defun write-int64 (buf num offset) + "Write a 64-bit signed integer to a foreign char buffer." + (declare (type (alien (* char)) buf) + (type (signed-byte 64) num) + (type fixnum offset)) + (setf (deref (cast (sap-alien (sap+ (alien-sap buf) offset) (* char)) + (* (signed 64)))) num)) + +#+(or cmu sbcl) +(defun write-uint32 (buf num offset) "Write a 32-bit unsigned integer to a foreign char buffer." (declare (type (alien (* char)) buf) (type (unsigned-byte 32) num) @@ -228,6 +263,14 @@ (* (unsigned 32)))) num))
#+(or cmu sbcl) +(defun write-uint64 (buf num offset) + "Write a 64-bit unsigned integer to a foreign char buffer." + (declare (type (alien (* char)) buf) + (type (unsigned-byte 64) num) + (type fixnum offset)) + (setf (deref (cast (sap-alien (sap+ (alien-sap buf) offset) (* char)) + (* (unsigned 64)))) num)) +#+(or cmu sbcl) (defun write-float (buf num offset) "Write a single-float to a foreign char buffer." (declare (type (alien (* char)) buf) @@ -253,18 +296,30 @@ (sap-alien (sap+ (alien-sap p) offset) (* char)))
#-(or cmu sbcl) -(def-function ("read_int" read-int) +(def-function ("read_int32" read-int32) ((buf array-or-pointer-char) (offset :int)) :returning :int)
#-(or cmu sbcl) -(def-function ("read_uint" read-uint) +(def-function ("read_uint32" read-uint32) ((buf array-or-pointer-char) (offset :int)) :returning :unsigned-int)
#-(or cmu sbcl) +(def-function ("read_int64" read-int64) + ((buf array-or-pointer-char) + (offset :int)) + :returning :long) + +#-(or cmu sbcl) +(def-function ("read_uint64" read-uint64) + ((buf array-or-pointer-char) + (offset :int)) + :returning :unsigned-long) + +#-(or cmu sbcl) (def-function ("read_float" read-float) ((buf array-or-pointer-char) (offset :int)) @@ -277,20 +332,34 @@ :returning :double)
#-(or cmu sbcl) -(def-function ("write_int" write-int) +(def-function ("write_int32" write-int32) ((buf array-or-pointer-char) (num :int) (offset :int)) :returning :void)
#-(or cmu sbcl) -(def-function ("write_uint" write-uint) +(def-function ("write_uint32" write-uint32) ((buf array-or-pointer-char) (num :unsigned-int) (offset :int)) :returning :void)
#-(or cmu sbcl) +(def-function ("write_int64" write-int64) + ((buf array-or-pointer-char) + (num :long) + (offset :int)) + :returning :void) + +#-(or cmu sbcl) +(def-function ("write_uint64" write-uint64) + ((buf array-or-pointer-char) + (num :unsigned-long) + (offset :int)) + :returning :void) + +#-(or cmu sbcl) (def-function ("write_float" write-float) ((buf array-or-pointer-char) (num :float) @@ -482,7 +551,7 @@ (setf (deref-array buf '(:array :char) size) b) (setf size needed))))
-(defun buffer-write-int (i bs) +(defun buffer-write-int32 (i bs) "Write a 32-bit signed integer." (declare (type buffer-stream bs) (type (signed-byte 32) i)) @@ -493,11 +562,11 @@ (let ((needed (+ size 4))) (when (> needed len) (resize-buffer-stream bs needed)) - (write-int buf i size) + (write-int32 buf i size) (setf size needed) nil)))
-(defun buffer-write-uint (u bs) +(defun buffer-write-uint32 (u bs) "Write a 32-bit unsigned integer." (declare (type buffer-stream bs) (type (unsigned-byte 32) u)) @@ -508,7 +577,37 @@ (let ((needed (+ size 4))) (when (> needed len) (resize-buffer-stream bs needed)) - (write-uint buf u size) + (write-uint32 buf u size) + (setf size needed) + nil))) + +(defun buffer-write-int64 (i bs) + "Write a 64-bit signed integer." + (declare (type buffer-stream bs) + (type (signed-byte 64) i)) + (with-struct-slots ((buf buffer-stream-buffer) + (size buffer-stream-size) + (len buffer-stream-length)) + bs + (let ((needed (+ size 8))) + (when (> needed len) + (resize-buffer-stream bs needed)) + (write-int64 buf i size) + (setf size needed) + nil))) + +(defun buffer-write-uint64 (u bs) + "Write a 64-bit unsigned integer." + (declare (type buffer-stream bs) + (type (unsigned-byte 64) u)) + (with-struct-slots ((buf buffer-stream-buffer) + (size buffer-stream-size) + (len buffer-stream-length)) + bs + (let ((needed (+ size 8))) + (when (> needed len) + (resize-buffer-stream bs needed)) + (write-uint64 buf u size) (setf size needed) nil)))
@@ -600,28 +699,73 @@ (writable (max vlen (- size position)))) (dotimes (i writable bs) (buffer-write-byte (aref bv i) bs)))) - + +(defun buffer-write-int (bs int) + ;; deprecated, better to use explicit int32 or int64 version + (buffer-write-int32 bs int)) + +(defun buffer-read-int (bs) + ;; deprecated, better to use explicit int32 or int64 version + (buffer-read-int32 bs))
(defun buffer-read-fixnum (bs) + ;; deprecated, better to use explicit int32 or int64 version + (the fixnum (buffer-read-fixnum32 bs))) + +(defun buffer-read-uint (bs) + ;; deprecated, better to use explicit int32 or int64 version + (buffer-read-uint32 bs)) + +(defun buffer-write-uint (bs int) + ;; deprecated, better to use explicit int32 or int64 version + (buffer-write-uint32 bs int)) + +(defconstant +2^32+ 4294967296) +(defconstant +2^64+ 18446744073709551616) + +(defun buffer-read-fixnum32 (bs) "Read a 32-bit signed integer, which is assumed to be a fixnum." (declare (type buffer-stream bs)) (let ((position (buffer-stream-position bs))) (setf (buffer-stream-position bs) (+ position 4)) (the fixnum (read-int (buffer-stream-buffer bs) position))))
-(defun buffer-read-int (bs) +(defun buffer-read-int32 (bs) "Read a 32-bit signed integer." (declare (type buffer-stream bs)) (let ((position (buffer-stream-position bs))) (setf (buffer-stream-position bs) (+ position 4)) - (the (signed-byte 32) (read-int (buffer-stream-buffer bs) position)))) + (the (signed-byte 32) (read-int32 (buffer-stream-buffer bs) position))))
-(defun buffer-read-uint (bs) +(defun buffer-read-uint32 (bs) "Read a 32-bit unsigned integer." (declare (type buffer-stream bs)) (let ((position (buffer-stream-position bs))) (setf (buffer-stream-position bs) (+ position 4)) - (the (unsigned-byte 32)(read-uint (buffer-stream-buffer bs) position)))) + (the (unsigned-byte 32)(read-uint32 (buffer-stream-buffer bs) position)))) + +(defun buffer-read-fixnum64 (bs) + (declare (type buffer-stream bs)) + (let ((position (buffer-stream-position bs))) + (setf (buffer-stream-position bs) (+ position 8)) + (if (< #.most-positive-fixnum +2^32+) + (+ (read-int32 (buffer-stream-buffer bs) position) + (* +2^32+ (read-int32 (buffer-stream-buffer bs) (+ position 4)))) + (the fixnum (read-int64 (buffer-stream-buffer bs) position))))) + +(defun buffer-read-int64 (bs) + "Read a 64-bit signed integer." + (declare (type buffer-stream bs)) + (let ((position (buffer-stream-position bs))) + (setf (buffer-stream-position bs) (+ position 8)) + (the (signed-byte 64) (read-int64 (buffer-stream-buffer bs) position)))) + +(defun buffer-read-uint64 (bs) + "Read a 64-bit unsigned integer." + (declare (type buffer-stream bs)) + (let ((position (buffer-stream-position bs))) + (setf (buffer-stream-position bs) (+ position 8)) + (the (unsigned-byte 64) (read-uint64 (buffer-stream-buffer bs) position))))
(defun buffer-read-float (bs) "Read a single-float."