From: Olof-Joachim Frahm Date: Thu, 6 Jun 2013 21:05:27 +0000 (+0200) Subject: Merge remote-tracking branch 'RobBlackwell/master' X-Git-Url: http://repo.macrolet.net/gitweb/?a=commitdiff_plain;h=a16b18e3d0e52886badfaedfb3aa5ba1d886cbdb;hp=007ec8f9db3cebde863dbde267611be5f1f5df5b;p=binary-types.git Merge remote-tracking branch 'RobBlackwell/master' --- diff --git a/binary-types.lisp b/binary-types.lisp index b5bf6f4..b540d74 100644 --- a/binary-types.lisp +++ b/binary-types.lisp @@ -14,7 +14,6 @@ ;;;;------------------------------------------------------------------ (defpackage #:binary-types - (:nicknames #:bt) (:use #:common-lisp) (:export #:*endian* ; [dynamic-var] must be bound when reading integers #:endianess ; [deftype] The set of endian names @@ -23,9 +22,15 @@ #:u8 ; [type-name] 8-bit unsigned integer #:u16 ; [type-name] 16-bit unsigned integer #:u32 ; [type-name] 32-bit unsigned integer + #:u64 ; [type-name] 64-bit unsigned integer + #:u128 ; [type-name] 128-bit unsigned integer + #:u256 ; [type-name] 256-bit unsigned integer #:s8 ; [type-name] 8-bit signed integer #:s16 ; [type-name] 16-bit signed integer #:s32 ; [type-name] 32-bit signed integer + #:s64 ; [type-name] 64-bit signed integer + #:s128 ; [type-name] 128-bit signed integer + #:s256 ; [type-name] 256-bit signed integer ; (you may define additional integer types ; of any size yourself.) ;; type defining macros @@ -224,6 +229,9 @@ or nil if TYPE is not constant-sized.")) (define-unsigned u8 1) (define-unsigned u16 2) (define-unsigned u32 4) +(define-unsigned u64 8) +(define-unsigned u128 16) +(define-unsigned u256 32) (defmethod read-binary ((type binary-unsigned) stream &key &allow-other-keys) (if (= 1 (sizeof type)) @@ -266,6 +274,9 @@ or nil if TYPE is not constant-sized.")) (define-signed s8 1) (define-signed s16 2) (define-signed s32 4) +(define-signed s64 8) +(define-signed s128 16) +(define-signed s256 32) (defmethod read-binary ((type binary-signed) stream &key &allow-other-keys) (let ((unsigned-value 0)) @@ -661,6 +672,14 @@ read are returned." ',type-name))))))) +(defun calculate-sizeof (slot-types) + (loop + for slot-type in slot-types + for sizeof = (sizeof slot-type) + when (null sizeof) + do (return) + sum sizeof)) + (defmacro define-binary-struct (name-and-options dummy-options &rest doc-slot-descriptions) (declare (ignore dummy-options)) ; clisp seems to require this.. (let (embedded-declarations) @@ -721,7 +740,7 @@ read are returned." (setf (find-binary-type ',type-name) (make-instance 'binary-struct 'name ',type-name - 'sizeof (loop for s in ',slot-types sum (sizeof s)) + 'sizeof (calculate-sizeof ',slot-types) 'slots ',binslots 'offset 0 'constructor (find-symbol (format nil "~A-~A" '#:make ',type-name))))