tests/gpgscm: Add a TinySCHEME-based test driver.
[gnupg.git] / tests / gpgscm / repl.scm
1 ;; A read-evaluate-print-loop for gpgscm.
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 ;; Interactive repl using 'prompt' function.  P must be a function
21 ;; that given the current entered prefix returns the prompt to
22 ;; display.
23 (define (repl p)
24   (let ((repl-environment (make-environment)))
25     (call/cc
26      (lambda (exit)
27        (let loop ((prefix ""))
28          (let ((line (prompt (p prefix))))
29            (if (and (not (eof-object? line)) (= 0 (string-length line)))
30                (exit (loop prefix)))
31            (if (not (eof-object? line))
32                (let* ((next (string-append prefix line))
33                       (c (catch (begin (echo "Parse error:" *error*)
34                                        (loop prefix))
35                                 (read (open-input-string next)))))
36                  (if (not (eof-object? c))
37                      (begin
38                        (catch (echo "Error:" *error*)
39                               (echo "    ===>" (eval c repl-environment)))
40                        (exit (loop ""))))
41                  (exit (loop next))))))))))
42
43 (define (prompt-append-prefix prompt prefix)
44   (string-append prompt (if (> (string-length prefix) 0)
45                             (string-append prefix "...")
46                             "> ")))
47
48 ;; Default repl run by main.c.
49 (define (interactive-repl)
50   (repl (lambda (p) (prompt-append-prefix "gpgscm " p))))