(logior x (ash y 8) (ash z 16) (ash w 24)))) (eval-when (expand) (define-syntax pack-flags (syntax-rules () ;; Add clauses as needed. ((pack-flags f1 f2) (logior (if f1 (ash 1 0) 0) (if f2 (ash 1 1) 0)))))) (define-syntax-rule (define-byte-order-swapper name size ref set) (define* (name buf #:optional (start 0) (end (bytevector-length buf))) "Patch up the text buffer @var{buf}, swapping the endianness of each N-byte unit." (unless (zero? (modulo (- end start) size)) (error "unexpected length")) (let lp ((pos start)) (when (< pos end) (set buf pos (ref buf pos (endianness big)) (endianness little)) (lp (+ pos size)))))) (define-byte-order-swapper byte-swap/2! 2 bytevector-u16-ref bytevector-u16-set!) (define-byte-order-swapper byte-swap/4! 4 bytevector-u32-ref bytevector-u32-set!) (define-byte-order-swapper byte-swap/8! 8 bytevector-u64-ref bytevector-u64-set!)