tests/gpgscm: Add a TinySCHEME-based test driver.
[gnupg.git] / tests / gpgscm / ffi.scm
1 ;; FFI interface for TinySCHEME.
2 ;;
3 ;; Copyright (C) 2016 g10 Code GmbH
4 ;;
5 ;; This file is part of GnuPG.
6 ;;
7 ;; GnuPG is free software; you can redistribute it and/or modify
8 ;; it under the terms of the GNU General Public License as published by
9 ;; the Free Software Foundation; either version 3 of the License, or
10 ;; (at your option) any later version.
11 ;;
12 ;; GnuPG is distributed in the hope that it will be useful,
13 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 ;; GNU General Public License for more details.
16 ;;
17 ;; You should have received a copy of the GNU General Public License
18 ;; along with this program; if not, see <http://www.gnu.org/licenses/>.
19
20 ;; Foreign function wrapper.  Expects F to return a list with the
21 ;; first element being the `error_t' value returned by the foreign
22 ;; function.  The error is thrown, or the cdr of the result is
23 ;; returned.
24 (define (ffi-apply name f args)
25   (let ((result (apply f args)))
26     (cond
27      ((string? result)
28       (ffi-fail name args result))
29      ((not (= (car result) 0))
30       (ffi-fail name args (strerror (car result))))
31      ((and (= (car result) 0) (pair? (cdr result))) (cadr result))
32      ((= (car result) 0) '())
33      (else
34       (throw (list "Result violates FFI calling convention: " result))))))
35
36 (define (ffi-fail name args message)
37   (let ((args' (open-output-string)))
38     (write (cons (string->symbol name) args) args')
39     (throw (string-append
40             (get-output-string args') ": " message))))