1 ;; FFI interface for TinySCHEME.
3 ;; Copyright (C) 2016 g10 Code GmbH
5 ;; This file is part of GnuPG.
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.
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.
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/>.
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
24 (define (ffi-apply name f args)
25 (let ((result (apply f args)))
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) '())
34 (throw (list "Result violates FFI calling convention: " result))))))
36 (define (ffi-fail name args message)
37 (let ((args' (open-output-string)))
38 (write (cons (string->symbol name) args) args')
40 (get-output-string args') ": " message))))
42 ;; Pseudo-definitions for foreign functions. Evaluates to no code,
43 ;; but serves as documentation.
44 (macro (ffi-define form))
48 ;; Low-level mechanism to terminate the process.
49 (ffi-define (_exit status))