build: Have configure respect GUILE_LOAD_PATH for mes to find Nyacc.
[mes.git] / mes / module / mes / guile.mes
1 ;;; -*-scheme-*-
2
3 ;;; GNU Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016,2017,2018,2019 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; This file is part of GNU Mes.
7 ;;;
8 ;;; GNU Mes is free software; you can redistribute it and/or modify it
9 ;;; under the terms of the GNU General Public License as published by
10 ;;; the Free Software Foundation; either version 3 of the License, or (at
11 ;;; your option) any later version.
12 ;;;
13 ;;; GNU Mes is distributed in the hope that it will be useful, but
14 ;;; WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;;; GNU General Public License for more details.
17 ;;;
18 ;;; You should have received a copy of the GNU General Public License
19 ;;; along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 ;;; Commentary:
22
23 ;;; Code:
24
25 (mes-use-module (srfi srfi-13))
26
27 (define-macro (cond-expand-provide . rest) #t)
28
29 (mes-use-module (mes catch))
30 (mes-use-module (mes posix))
31 (mes-use-module (srfi srfi-16))
32 (mes-use-module (mes display))
33 (mes-use-module (mes simple-format))
34
35 (define %load-path (or (and=> (getenv "GUILE_LOAD_PATH") (lambda (x) (string-split x #\:))) '()))
36
37 (define (drain-input port) (read-string))
38
39 (define (read-line . rest)
40   (let* ((port (if (pair? rest) (car rest) (current-input-port)))
41          (handle-delim (if (and (pair? rest) (pair? (cdr rest))) (cadr rest) 'trim))
42          (c (read-char port)))
43     (if (eof-object? c) c
44         (list->string
45          (let loop ((c c))
46            (if (or (eof-object? c) (eq? c #\newline)) (case handle-delim
47                                                         ((trim) '())
48                                                         ((concat) '(#\newline))
49                                                         (else (error (format #f "not supported: handle-delim=~a" handle-delim))))
50                (cons c (loop (read-char port)))))))))
51
52 (define (object->string x . rest)
53   (with-output-to-string
54     (lambda () ((if (pair? rest) (car rest) write) x))))
55
56 (define (port-filename p) "<stdin>")
57 (define (port-line p) 0)
58
59 (define (with-input-from-string string thunk)
60   (let ((prev (set-current-input-port (open-input-string string)))
61         (r (thunk)))
62     (set-current-input-port prev)
63     r))
64
65 (define (with-input-from-file file thunk)
66   (let ((port (open-input-file file)))
67     (if (= port -1)
68         (error 'no-such-file file)
69         (let* ((save (current-input-port))
70                (foo (set-current-input-port port))
71                (r (thunk)))
72           (set-current-input-port save)
73           r))))
74
75 (define (with-output-to-file file thunk)
76   (let ((port (open-output-file file)))
77     (if (= port -1)
78         (error 'cannot-open file)
79         (let* ((save (current-output-port))
80                (foo (set-current-output-port port))
81                (r (thunk)))
82           (set-current-output-port save)
83           r))))
84
85 (define (with-error-to-file file thunk)
86   (let ((port (open-output-file file)))
87     (if (= port -1)
88         (error 'cannot-open file)
89         (let* ((save (current-error-port))
90                (foo (set-current-error-port port))
91                (r (thunk)))
92           (set-current-error-port save)
93           r))))
94
95 (define (with-output-to-port port thunk)
96   (let* ((save (current-output-port))
97          (foo (set-current-output-port port))
98          (r (thunk)))
99     (set-current-output-port save)
100     r))
101
102 (define core:open-input-file open-input-file)
103 (define (open-input-file file)
104   (let ((port (core:open-input-file file))
105         (debug (and=> (getenv "MES_DEBUG") string->number)))
106     (when (and debug (> debug 1))
107       (core:display-error (string-append "open-input-file: `" file "'"))
108       (when (> debug 3)
109         (core:display-error " port=")
110         (core:display-error port))
111       (core:display-error "\n"))
112     port))
113
114 (define (dirname file-name)
115   (let* ((lst (string-split file-name #\/))
116          (lst (filter (negate string-null?) lst)))
117     (if (null? lst) (if (string-prefix? "/" file-name) "/" ".")
118         (let ((dir (string-join (list-head lst (1- (length lst))) "/")))
119           (if (string-prefix? "/" file-name) (string-append "/" dir)
120               (if (string-null? dir) "."
121                   dir))))))
122
123 (define (file-exists? o)
124   (access? o R_OK))