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))