60 lines
2.0 KiB
Scheme
60 lines
2.0 KiB
Scheme
(define make-c-array
|
|
(lambda (type size . fill)
|
|
(let ((array (make-c-bytevector (* (c-type-size type) size))))
|
|
(when (not (null? fill))
|
|
(letrec* ((filler (car fill))
|
|
(looper (lambda (count)
|
|
(when (> size count)
|
|
(c-array-set! array type count filler)
|
|
(looper (+ count 1))))))
|
|
(looper 0)))
|
|
array)))
|
|
|
|
(define c-array-ref
|
|
(lambda (array type index)
|
|
(let* ((size (c-type-size type))
|
|
(offset (* index size)))
|
|
(cond
|
|
((equal? 'pointer type)
|
|
(c-bytevector-pointer-ref array offset))
|
|
((c-type-signed? type)
|
|
(c-bytevector-sint-ref array offset (native-endianness) size))
|
|
(else
|
|
(c-bytevector-uint-ref array offset (native-endianness) size))))))
|
|
|
|
(define c-array-set!
|
|
(lambda (array type index value)
|
|
(let* ((size (c-type-size type))
|
|
(offset (* index size)))
|
|
(cond
|
|
((equal? 'pointer type)
|
|
(c-bytevector-pointer-set! array offset value))
|
|
((c-type-signed? type)
|
|
(c-bytevector-sint-set! array offset value (native-endianness) size))
|
|
(else
|
|
(c-bytevector-uint-set! array offset value (native-endianness) size))))))
|
|
|
|
(define list->c-array
|
|
(lambda (list type)
|
|
(let* ((array-size (length list))
|
|
(type-size (c-type-size type))
|
|
(array (make-c-bytevector (* type-size array-size)))
|
|
(index 0))
|
|
(for-each
|
|
(lambda (item)
|
|
(c-array-set! array type index item)
|
|
(set! index (+ index 1)))
|
|
list)
|
|
array)))
|
|
|
|
(define c-array->list
|
|
(lambda (array type size)
|
|
(letrec*
|
|
((looper (lambda (index result)
|
|
(if (>= index size)
|
|
result
|
|
(looper (+ index 1)
|
|
(append result
|
|
(list (c-array-ref array type index))))))))
|
|
(looper 0 (list)))))
|