26 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Scheme
		
	
	
	
			
		
		
	
	
			26 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Scheme
		
	
	
	
;;;; This file is dependent on content of other files added trough (include...)
 | 
						|
;;;; And that's why it is separated
 | 
						|
 | 
						|
(define make-c-function
 | 
						|
  (lambda (shared-object c-name return-type argument-types)
 | 
						|
    (dlerror) ;; Clean all previous errors
 | 
						|
    (let ((c-function (dlsym shared-object c-name))
 | 
						|
          (maybe-dlerror (dlerror)))
 | 
						|
      (lambda arguments
 | 
						|
        (let ((return-pointer (internal-ffi-call (length argument-types)
 | 
						|
                                                 (type->libffi-type-number return-type)
 | 
						|
                                                 (map type->libffi-type-number argument-types)
 | 
						|
                                                 c-function
 | 
						|
                                                 (size-of-type return-type)
 | 
						|
                                                 arguments)))
 | 
						|
          (c-bytevector-get return-pointer return-type 0))))))
 | 
						|
 | 
						|
(define-syntax define-c-procedure
 | 
						|
  (syntax-rules ()
 | 
						|
    ((_ scheme-name shared-object c-name return-type argument-types)
 | 
						|
     (define scheme-name
 | 
						|
       (make-c-function shared-object
 | 
						|
                        (symbol->string c-name)
 | 
						|
                        return-type
 | 
						|
                        argument-types)))))
 |