123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- (define-module (gcrypt internal)
- #:use-module (gcrypt package-config)
- #:use-module (system foreign)
- #:export (libgcrypt->pointer
- libgcrypt->procedure
- define-enumerate-type
- define-lookup-procedure
- gcrypt-version))
- (define (libgcrypt->pointer name)
- "Return a pointer to symbol FUNC in libgcrypt."
- (catch #t
- (lambda ()
- (dynamic-func name (dynamic-link %libgcrypt)))
- (lambda args
- (lambda _
- (throw 'system-error name "~A" (list (strerror ENOSYS))
- (list ENOSYS))))))
- (define (libgcrypt->procedure return name params)
- "Return a pointer to symbol FUNC in libgcrypt."
- (catch #t
- (lambda ()
- (let ((ptr (dynamic-func name (dynamic-link %libgcrypt))))
-
- (pointer->procedure return ptr params
- #:return-errno? #t)))
- (lambda args
- (lambda _
- (throw 'system-error name "~A" (list (strerror ENOSYS))
- (list ENOSYS))))))
- (define-syntax-rule (define-enumerate-type name->integer symbol->integer
- integer->symbol
- (name id) ...)
- (begin
- (define-syntax name->integer
- (syntax-rules (name ...)
- "Return hash algorithm NAME."
- ((_ name) id) ...))
- (define symbol->integer
- (let ((alist '((name . id) ...)))
- (lambda (symbol)
- "Look up SYMBOL and return the corresponding integer or #f if it
- could not be found."
- (assq-ref alist symbol))))
- (define-lookup-procedure integer->symbol
- "Return the name (a symbol) corresponding to the given integer value."
- (id name) ...)))
- (define-syntax define-lookup-procedure
- (lambda (s)
- "Define LOOKUP as a procedure that maps an integer to its corresponding
- value in O(1)."
- (syntax-case s ()
- ((_ lookup docstring (index value) ...)
- (let* ((values (map cons
- (syntax->datum #'(index ...))
- #'(value ...)))
- (min (apply min (syntax->datum #'(index ...))))
- (max (apply max (syntax->datum #'(index ...))))
- (array (let loop ((i max)
- (result '()))
- (if (< i min)
- result
- (loop (- i 1)
- (cons (or (assv-ref values i) *unspecified*)
- result))))))
- #`(define lookup
-
- (let ((values '#(#,@array)))
- (lambda (integer)
- docstring
- (and (<= integer #,max) (>= integer #,min)
- (let ((result (vector-ref values (- integer #,min))))
- (if (unspecified? result)
- #f
- result)))))))))))
- (define gcrypt-version
-
-
-
-
- (let* ((proc (libgcrypt->procedure '* "gcry_check_version" '(*)))
- (version (catch 'system-error
- (lambda ()
- (pointer->string (proc %null-pointer)))
- (const ""))))
- (lambda ()
- "Return the version number of libgcrypt as a string."
- version)))
|