51 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Scheme
		
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Scheme
		
	
	
	
(define type->libffi-type-number
 | 
						|
  (lambda (type)
 | 
						|
    (cond ((equal? type 'int8) 1)
 | 
						|
          ((equal? type 'uint8) 2)
 | 
						|
          ((equal? type 'int16) 3)
 | 
						|
          ((equal? type 'uint16) 4)
 | 
						|
          ((equal? type 'int32) 5)
 | 
						|
          ((equal? type 'uint32) 6)
 | 
						|
          ((equal? type 'int64) 7)
 | 
						|
          ((equal? type 'uint64) 8)
 | 
						|
          ((equal? type 'char) 9)
 | 
						|
          ((equal? type 'unsigned-char) 10)
 | 
						|
          ((equal? type 'short) 11)
 | 
						|
          ((equal? type 'unsigned-short) 12)
 | 
						|
          ((equal? type 'int) 13)
 | 
						|
          ((equal? type 'unsigned-int) 14)
 | 
						|
          ((equal? type 'long) 15)
 | 
						|
          ((equal? type 'unsigned-long) 16)
 | 
						|
          ((equal? type 'float) 17)
 | 
						|
          ((equal? type 'double) 18)
 | 
						|
          ((equal? type 'void) 19)
 | 
						|
          ((equal? type 'pointer) 20)
 | 
						|
          ((equal? type 'pointer-address) 21)
 | 
						|
          ((equal? type 'callback) 22)
 | 
						|
          (else (error "Undefined type" type)))))
 | 
						|
 | 
						|
(define c-bytevector-get
 | 
						|
  (lambda (pointer type offset)
 | 
						|
    (cond ((equal? type 'int8) (c-bytevector-s8-ref pointer offset))
 | 
						|
          ((equal? type 'uint8) (c-bytevector-u8-ref pointer offset))
 | 
						|
          ((equal? type 'int16) (c-bytevector-s16-ref pointer offset))
 | 
						|
          ((equal? type 'uint16) (c-bytevector-u16-ref pointer offset))
 | 
						|
          ((equal? type 'int32) (c-bytevector-s32-ref pointer offset))
 | 
						|
          ((equal? type 'uint32) (c-bytevector-u32-ref pointer offset))
 | 
						|
          ((equal? type 'int64) (c-bytevector-s64-ref pointer offset))
 | 
						|
          ((equal? type 'uint64) (c-bytevector-u64-ref pointer offset))
 | 
						|
          ((equal? type 'char) (integer->char (c-bytevector-s8-ref pointer offset)))
 | 
						|
          ((equal? type 'unsigned-char) (integer->char (c-bytevector-u8-ref pointer offset)))
 | 
						|
          ((equal? type 'short) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'short)))
 | 
						|
          ((equal? type 'unsigned-short) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'unsigned-short)))
 | 
						|
          ((equal? type 'int) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'int)))
 | 
						|
          ((equal? type 'unsigned-int) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'unsigned-int)))
 | 
						|
          ((equal? type 'long) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'long)))
 | 
						|
          ((equal? type 'unsigned-long) (c-bytevector-sint-ref pointer offset (native-endianness) (c-size-of 'unsigned-long)))
 | 
						|
          ((equal? type 'float) (c-bytevector-ieee-single-native-ref pointer offset))
 | 
						|
          ((equal? type 'double) (c-bytevector-ieee-double-native-ref pointer offset))
 | 
						|
          ((equal? type 'pointer) (c-bytevector-pointer-ref pointer offset))
 | 
						|
          ((not (equal? type 'void)) (error "No such foreign type" type))
 | 
						|
          ;; Return unspecified on purpose if type is void
 | 
						|
          )))
 |