mescc: Remove debugging.
[mes.git] / module / mes / guile.mes
1 ;;; -*-scheme-*-
2
3 ;;; Mes --- Maxwell Equations of Software
4 ;;; Copyright © 2016,2017,2018 Jan Nieuwenhuizen <janneke@gnu.org>
5 ;;;
6 ;;; This file is part of Mes.
7 ;;;
8 ;;; 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 ;;; 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 Mes.  If not, see <http://www.gnu.org/licenses/>.
20
21 ;;; Commentary:
22
23 ;;; Code:
24
25 (define-macro (define-module module . rest) #t)
26 (define-macro (use-modules . rest) #t)
27 (define-macro (cond-expand-provide . rest) #t)
28
29 (define-macro (include-from-path file)
30   (let loop ((path (cons %moduledir (string-split (or (getenv "GUILE_LOAD_PATH") "") #\:))))
31     (if (getenv "MES_DEBUG")
32         ;;(format (current-error-port) "include-from-path: ~s [PATH:~s]\n" file path)
33         (core:display-error (string-append "include-from-path: " file " [PATH:" (string-join path ":") "]\n")))
34     (if (null? path) (error "include-from-path: not found: " file)
35         (let ((file (string-append (car path) "/" file)))
36           (if (access? file R_OK) `(load ,file)
37               (loop (cdr path)))))))
38
39 (mes-use-module (mes catch))
40 (mes-use-module (mes posix))
41 (mes-use-module (srfi srfi-16))
42 (mes-use-module (srfi srfi-26))
43 (mes-use-module (mes display))
44
45 (if #t ;;(not (defined? 'read-string))
46     (define (read-string)
47       (define (read-string c)
48         (if (eq? c #\*eof*) '()
49             (cons c (read-string (read-char)))))
50       (let ((string (list->string (read-string (read-char)))))
51         (if (and=> (getenv "MES_DEBUG") (compose (cut > <> 2) string->number))
52             (core:display-error (string-append "drained: `" string "'\n")))
53         string)))
54
55 (define (drain-input port) (read-string))
56
57 (define (make-string n . fill)
58   (list->string (apply make-list n fill)))
59
60 (define (object->string x . rest)
61   (with-output-to-string
62     (lambda () ((if (pair? rest) (car rest) write) x))))
63
64 (define (port-filename p) "<stdin>")
65 (define (port-line p) 0)
66
67 (define (with-input-from-string string thunk)
68   (define save-peek-char peek-char)
69   (define save-read-char read-char)
70   (define save-unread-char unread-char)
71   (if (and=> (getenv "MES_DEBUG") (compose (cut > <> 2) string->number))
72       (core:display-error (string-append "with-input-from-string: `" string "'\n")))
73   (let ((tell 0)
74         (end (string-length string)))
75     (set! peek-char
76           (lambda ()
77             (if (= tell end) (integer->char -1)
78                 (string-ref string tell))))
79     (set! read-char
80           (lambda () (if (= tell end) (integer->char -1)
81                          (begin
82                            (set! tell (1+ tell))
83                            (string-ref string (- tell 1))))))
84     (set! unread-char
85           (lambda (c) (set! tell (1- tell)) c)))
86   (let ((r (thunk)))
87     (set! peek-char save-peek-char)
88     (set! read-char save-read-char)
89     (set! unread-char save-unread-char)
90     r))
91
92 (define (with-input-from-file file thunk)
93   (let ((port (open-input-file file)))
94     (if (= port -1)
95         (error 'no-such-file file)
96         (let* ((save (current-input-port))
97                (foo (set-current-input-port port))
98                (r (thunk)))
99           (set-current-input-port save)
100           r))))
101
102 (define (with-output-to-file file thunk)
103   (let ((port (open-output-file file)))
104     (if (= port -1)
105         (error 'cannot-open file)
106         (let* ((save (current-output-port))
107                (foo (set-current-output-port port))
108                (r (thunk)))
109           (set-current-output-port save)
110           r))))
111
112 (define (with-output-to-port port thunk)
113   (let* ((save (current-output-port))
114          (foo (set-current-output-port port))
115          (r (thunk)))
116     (set-current-output-port save)
117     r))
118
119 (define core:open-input-file open-input-file)
120 (define (open-input-file file)
121   (let ((port (core:open-input-file file)))
122     (when (getenv "MES_DEBUG")
123       (core:display-error (string-append "open-input-file: `" file "'\n"))
124       (core:display-error "port=")
125       (core:display-error port)
126       (core:display-error "\n"))
127     port))
128
129 (define open-input-string
130   (let ((save-set-current-input-port #f)
131         (string-port #f))
132     (lambda (string)
133       (if (and=> (getenv "MES_DEBUG") (compose (cut > <> 2) string->number))
134           (core:display-error (string-append "open-input-string: `" string "'\n")))
135       (set! save-set-current-input-port set-current-input-port)
136       (set! string-port (cons '*string-port* (gensym)))
137       (set! set-current-input-port
138             (let ((save-peek-char peek-char)
139                   (save-read-char read-char)
140                   (save-unread-char unread-char)
141                   (tell 0)
142                   (end (string-length string)))
143               (lambda (port)
144                 (when (and=> (getenv "MES_DEBUG") (compose (cut > <> 2) string->number))
145                     (core:display-error (string-append "open-input-string: `" string "' save-set-current-input-port port="))
146                     (core:display-error port)
147                     (core:display-error "\n"))
148                 (if (not (equal? port string-port)) (save-set-current-input-port port)
149                     (begin
150                       (set! tell 0)
151                       (set! peek-char
152                             (lambda () (if (= tell end) (integer->char -1)
153                                            (string-ref string tell))))
154                       (set! read-char
155                             (lambda () (if (= tell end) (integer->char -1)
156                                            (begin
157                                              (set! tell (1+ tell))
158                                              (string-ref string (- tell 1))))))
159                       (set! unread-char
160                             (lambda (c) (set! tell (1- tell)) c))
161                       (set! set-current-input-port
162                             (lambda (port)
163                               (when (getenv "MES_DEBUG")
164                                 (core:display-error (string-append "open-input-string: `" string "' set-current-input-port port="))
165                                 (core:display-error port)
166                                 (core:display-error "\n"))
167                               (save-set-current-input-port port)
168                               (set! peek-char save-peek-char)
169                               (set! read-char save-read-char)
170                               (set! unread-char save-unread-char)
171                               (set! set-current-input-port save-set-current-input-port)
172                               string-port)))))))
173       string-port)))
174
175 (define (dirname file-name)
176   (let ((lst (filter (negate string-null?) (string-split file-name #\/))))
177     (if (<= (length lst) 1) "."
178         (string-join (list-head lst (1- (length lst))) "/"))))
179
180 ;; FIXME: c&p from display
181 (define (with-output-to-string thunk)
182   (define save-write-byte write-byte)
183   (let ((stdout '()))
184     (set! write-byte
185           (lambda (x . rest)
186             (let ((out? (or (null? rest) (eq? (car rest) (current-output-port)))))
187               (if (not out?) (apply save-write-byte (cons x rest))
188                   (begin
189                     (set! stdout (append stdout (list (integer->char x))))
190                     x)))))
191     (thunk)
192     (let ((r (apply string stdout)))
193       (set! write-byte save-write-byte)
194       r)))
195
196 ;; FIXME: c&p from display
197 (define (simple-format destination format . rest)
198   (let ((port (if (boolean? destination) (current-output-port) destination))
199         (lst (string->list format)))
200     (define (simple-format lst args)
201       (if (pair? lst)
202           (let ((c (car lst)))
203             (if (not (eq? c #\~)) (begin (write-char (car lst) port)
204                                          (simple-format (cdr lst) args))
205                 (let ((c (cadr lst)))
206                   (case c
207                     ((#\a) (display (car args) port))
208                     ((#\s) (write (car args) port)))
209                   (simple-format (cddr lst) (cdr args)))))))
210
211     (if destination (simple-format lst rest)
212         (with-output-to-string
213           (lambda () (simple-format lst rest))))))
214 (define format simple-format)
215