rror "too few values" types)) (else ;; alignof will error-check (let* ((type (car types)) (offset (align offset (alignof type)))) (if (pair? type) (write-c-struct bv offset (car types) (car vals)) ((assv-ref *writers* type) bv offset (car vals))) (lp (+ offset (sizeof type)) (cdr types) (cdr vals))))))) (define (read-c-struct bv offset types) (let lp ((offset offset) (types types) (vals '())) (cond ((not (pair? types)) (reverse vals)) (else ;; alignof will error-check (let* ((type (car types)) (offset (align offset (alignof type)))) (lp (+ offset (sizeof type)) (cdr types) (cons (if (pair? type) (read-c-struct bv offset (car types)) ((assv-ref *readers* type) bv offset)) vals))))))) (define (make-c-struct types vals) (let ((bv (make-bytevector (sizeof types) 0))) (write-c-struct bv 0 types vals) (bytevector->pointer bv))) (define (parse-c-struct foreign types) (let ((size (fold (lambda (type total) (+ (sizeof type) (align total (alignof type)))) 0 types))) (read-c-struct (pointer->bytevector foreign size) 0 types)))