36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
(define (config:assoc-safe-add alist key val)
(let ((newalist (filter (lambda (x)(not (equal? key (car x)))) alist)))
(append newalist (list (list key val)))))
(define (config:eval-string-in-environment str)
(let ((cmdres (cmd-run->list (conc "echo " str))))
(if (null? cmdres) ""
(car cmdres))))
;; read a config file, returns hash table of alists
;; adds to ht if given (must be #f otherwise)
;; envion-patt is a regex spec that identifies sections that will be eval'd
;; in the environment on the fly
(define (read-config path ht allow-system #!key (environ-patt #f))
(if (not (file-exists? path))
(if (not ht)(make-hash-table) ht)
(let ((inp (open-input-file path))
(res (if (not ht)(make-hash-table) ht))
(include-rx (regexp "^\\[include\\s+(.*)\\]\\s*$"))
(section-rx (regexp "^\\[(.*)\\]\\s*$"))
(blank-l-rx (regexp "^\\s*$"))
|
|
>
|
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
(define (config:assoc-safe-add alist key val)
(let ((newalist (filter (lambda (x)(not (equal? key (car x)))) alist)))
(append newalist (list (list key val)))))
(define (config:eval-string-in-environment str)
(let ((cmdres (cmd-run->list (conc "echo " str))))
(if (null? cmdres) ""
(caar cmdres))))
;; read a config file, returns hash table of alists
;; adds to ht if given (must be #f otherwise)
;; envion-patt is a regex spec that identifies sections that will be eval'd
;; in the environment on the fly
(define (read-config path ht allow-system #!key (environ-patt #f))
(debug:print 4 "INFO: read-config " path " allow-system " allow-system " environ-patt " environ-patt)
(if (not (file-exists? path))
(if (not ht)(make-hash-table) ht)
(let ((inp (open-input-file path))
(res (if (not ht)(make-hash-table) ht))
(include-rx (regexp "^\\[include\\s+(.*)\\]\\s*$"))
(section-rx (regexp "^\\[(.*)\\]\\s*$"))
(blank-l-rx (regexp "^\\s*$"))
|
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
(if (null? res)
""
(string-intersperse res " ")))))
(hash-table-set! res curr-section-name
(config:assoc-safe-add alist key val))
(loop (read-line inp) curr-section-name #f #f))
(loop (read-line inp) curr-section-name #f #f)))
(key-val-pr ( x key val ) (let ((alist (hash-table-ref/default res curr-section-name '()))
(realval (if (and environ-patt (string-match (regexp environ-patt) curr-section-name))
(config:eval-string-in-environment val)
val)))
(hash-table-set! res curr-section-name
(config:assoc-safe-add alist key realval))
(loop (read-line inp) curr-section-name key #f)))
;; if a continued line
(cont-ln-rx ( x whsp val ) (let ((alist (hash-table-ref/default res curr-section-name '())))
(if var-flag ;; if set to a string then we have a continued var
(let ((newval (conc
|
|
|
>
>
>
>
>
|
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
(if (null? res)
""
(string-intersperse res " ")))))
(hash-table-set! res curr-section-name
(config:assoc-safe-add alist key val))
(loop (read-line inp) curr-section-name #f #f))
(loop (read-line inp) curr-section-name #f #f)))
(key-val-pr ( x key val ) (let* ((alist (hash-table-ref/default res curr-section-name '()))
(envar (and environ-patt (string-match (regexp environ-patt) curr-section-name)))
(realval (if envar
(config:eval-string-in-environment val)
val)))
(if envar
(begin
(debug:print 4 "INFO: read-config key=" key ", val=" val ", realval=" realval)
(setenv key realval)))
(hash-table-set! res curr-section-name
(config:assoc-safe-add alist key realval))
(loop (read-line inp) curr-section-name key #f)))
;; if a continued line
(cont-ln-rx ( x whsp val ) (let ((alist (hash-table-ref/default res curr-section-name '())))
(if var-flag ;; if set to a string then we have a continued var
(let ((newval (conc
|