Avoid C-isms #5
1 changed files with 20 additions and 30 deletions
50
osc.lisp
50
osc.lisp
|
@ -291,16 +291,6 @@
|
||||||
(ldb (byte 16 0) (decode-int32 s)))
|
(ldb (byte 16 0) (decode-int32 s)))
|
||||||
#-(or sbcl cmucl openmcl allegro) (error "cant decode floats using this implementation"))
|
#-(or sbcl cmucl openmcl allegro) (error "cant decode floats using this implementation"))
|
||||||
|
|
||||||
(defun decode-int32 (s)
|
|
||||||
"4 byte -> 32 bit int -> two's compliment (in network byte order)"
|
|
||||||
(let ((i (+ (ash (elt s 0) 24)
|
|
||||||
(ash (elt s 1) 16)
|
|
||||||
(ash (elt s 2) 8)
|
|
||||||
(elt s 3))))
|
|
||||||
(if (>= i #x7fffffff)
|
|
||||||
(- 0 (- #x100000000 i))
|
|
||||||
i)))
|
|
||||||
|
|
||||||
(defun decode-uint32 (s)
|
(defun decode-uint32 (s)
|
||||||
"4 byte -> 32 bit unsigned int"
|
"4 byte -> 32 bit unsigned int"
|
||||||
(let ((i (+ (ash (elt s 0) 24)
|
(let ((i (+ (ash (elt s 0) 24)
|
||||||
|
@ -309,6 +299,18 @@
|
||||||
(elt s 3))))
|
(elt s 3))))
|
||||||
i))
|
i))
|
||||||
|
|
||||||
|
(defun decode-uint64 (s)
|
||||||
|
"8 byte -> 64 bit unsigned int"
|
||||||
|
(let ((i (+ (ash (elt s 0) 56)
|
||||||
|
(ash (elt s 1) 48)
|
||||||
|
(ash (elt s 2) 40)
|
||||||
|
(ash (elt s 3) 32)
|
||||||
|
(ash (elt s 4) 24)
|
||||||
|
(ash (elt s 5) 16)
|
||||||
|
(ash (elt s 6) 8)
|
||||||
|
(elt s 7))))
|
||||||
|
i))
|
||||||
|
|
||||||
(defmacro defint-encoder (num-of-octets &optional docstring)
|
(defmacro defint-encoder (num-of-octets &optional docstring)
|
||||||
(let ((enc-name (intern (format nil "~:@(encode-int~)~D" (* 8 num-of-octets))))
|
(let ((enc-name (intern (format nil "~:@(encode-int~)~D" (* 8 num-of-octets))))
|
||||||
(buf (gensym))
|
(buf (gensym))
|
||||||
|
@ -327,28 +329,16 @@
|
||||||
(defint-encoder 4 "Convert an integer into a sequence of 4 bytes in network byte order.")
|
(defint-encoder 4 "Convert an integer into a sequence of 4 bytes in network byte order.")
|
||||||
(defint-encoder 8 "Convert an integer into a sequence of 8 bytes in network byte order.")
|
(defint-encoder 8 "Convert an integer into a sequence of 8 bytes in network byte order.")
|
||||||
|
|
||||||
(defun decode-uint64 (s)
|
(defun decode-int32 (s)
|
||||||
"8 byte -> 64 bit unsigned int"
|
"4 byte -> 32 bit int -> two's complement (in network byte order)"
|
||||||
(let ((i (+ (ash (elt s 0) 56)
|
(let ((i (decode-uint32 s)))
|
||||||
(ash (elt s 1) 48)
|
(if (>= i #x7fffffff)
|
||||||
(ash (elt s 2) 40)
|
(- 0 (- #x100000000 i))
|
||||||
(ash (elt s 3) 32)
|
i)))
|
||||||
(ash (elt s 4) 24)
|
|
||||||
(ash (elt s 5) 16)
|
|
||||||
(ash (elt s 6) 8)
|
|
||||||
(elt s 7))))
|
|
||||||
i))
|
|
||||||
|
|
||||||
(defun decode-int64 (s)
|
(defun decode-int64 (s)
|
||||||
"8 byte -> 64 bit int -> two's compliment (in network byte order)"
|
"8 byte -> 64 bit int -> two's complement (in network byte order)"
|
||||||
(let ((i (+ (ash (elt s 0) 56)
|
(let ((i (decode-uint64 s)))
|
||||||
(ash (elt s 1) 48)
|
|
||||||
(ash (elt s 2) 40)
|
|
||||||
(ash (elt s 3) 32)
|
|
||||||
(ash (elt s 4) 24)
|
|
||||||
(ash (elt s 5) 16)
|
|
||||||
(ash (elt s 6) 8)
|
|
||||||
(elt s 7))))
|
|
||||||
(if (>= i #x7fffffffffffffff)
|
(if (>= i #x7fffffffffffffff)
|
||||||
(- 0 (- #x10000000000000000 i))
|
(- 0 (- #x10000000000000000 i))
|
||||||
i)))
|
i)))
|
||||||
|
|
Loading…
Reference in a new issue