1(library (nmosh bootstrap util)
2	 (export read-all
3		 compile-to-codevector
4		 compile-to-codevector/toplevel
5		 obj->fasl
6		 fasl->obj
7		 write-cobj)
8
9	 (import (only (mosh) format)
10		 (rnrs) (srfi :8) (srfi :42)
11         #|
12         (only
13           (nmosh boot compiler)
14           compile compile-w/o-halt)
15         |#
16         (primitives
17           compile compile-w/o-halt)
18		 (primitives
19		   fasl-read
20		   fasl-write!))
21
22; from binary2c.scm
23(define (do-write-cobj name p bv)
24  (format p "static const uint8_t ~a_image[] = {" name)
25  (do-ec (: i 0 (bytevector-length bv))
26	 (begin (when (zero? (mod i 15)) (newline p))
27		(format p "0x~a," (number->string (bytevector-u8-ref bv i) 16))))
28  (display "\n};\n" p))
29
30(define (write-cobj name p bv)
31  (let ((s (call-with-string-output-port (lambda (port) (do-write-cobj name port bv)))))
32    (put-string p s)))
33
34(define (compile-to-codevector/toplevel l)
35  (compile l))
36
37(define (compile-to-codevector l)
38  (compile-w/o-halt l))
39
40(define (obj->fasl obj)
41  (receive (port bv-proc) (open-bytevector-output-port)
42    (fasl-write! obj port)
43    (bv-proc)))
44
45(define (fasl->obj fasl)
46  (call-with-port (open-bytevector-input-port fasl) fasl-read))
47
48(define (read-all fn)
49  (define (reader p)
50    (define (itr cur)
51      (let ((e (read p)))
52        (if (eof-object? e)
53          (reverse cur)
54          (itr (cons e cur)))))
55    (itr '()))
56  (call-with-input-file fn reader))
57)
58