master
util.scm
1(define-module (util)
2 #:use-module (ice-9 popen)
3 #:use-module (ice-9 rdelim)
4 #:use-module (srfi srfi-1)
5 #:export (file-read line-parse list-sort var-expand var-parse)
6)
7
8(define (file-read f)
9 (call-with-input-file f
10 (lambda (p)
11 (let loop ((L '()))
12 (let ((l (read-line p)))
13 (if (eof-object? l)
14 (reverse L)
15 (loop (cons l L))))))))
16
17(define (line-parse l)
18 (let* ((p (string-split l #\:))
19 (t (string-trim-both (car p)))
20 (ds (string-trim-both (cadr p)))
21 (d (if (string-null? ds)
22 '()
23 (string-split ds #\space))))
24 (list t d)))
25
26
27(define (list-sort t l)
28 (let ((s '()) (r '()))
29
30 (define (visit t)
31 (if (not (member t s))
32 (begin (let ((e (assoc t l)))
33 (if e (for-each visit (cadr e))))
34 (set! s (cons t s))
35 (set! r (cons t r)))))
36
37 (visit t)
38 (reverse r)))
39
40(define (var-parse v)
41 (let ((p (string-contains v "=")))
42 (cons
43 (string-trim-both (substring v 0 p))
44 (string-trim-both
45 (substring v (+ p 1))))))
46
47(define (var-expand s l)
48 (fold
49 (lambda (l s)
50 (let* ((old (string-append "$(" (car l) ")"))
51 (pos (string-contains s old)))
52 (if pos
53 (string-replace s
54 (cdr l)
55 pos
56 (+ pos (string-length old)))
57 s)))
58 s
59 l))