#!/local/gauche/bin/gosh ; ; Blunders its way through an email header. ; (use srfi-1) (use srfi-13) (define (process-field header-list line) (let ((ci (string-index line #\:))) (if (not ci) (error "process-field: invalid current-line")) (acons (string-take line ci) (string-drop line (+ ci 1)) header-list))) (define (read-field header-list current-line) (let ((new-line (read-line))) (if (or (eof-object? new-line) (string-null? new-line)) (process-field header-list current-line) (let ((ci (string-skip new-line #[\s]))) (if (or (eqv? ci 0) (boolean? ci)) (process-field (read-field header-list new-line) current-line) (read-field header-list (string-join (list current-line (string-drop new-line ci))))))))) (define (read-header) (let ((line (read-line))) (if (eof-object? line) (list) (read-field (list) line)))) (define (print-all) (for-each (lambda (thing) (print "X: " (car thing) ", " (cdr thing))) (read-header))) (define (main args) (if (equal? (length args) 1) (print-all) (let ((header (read-header))) (print (cadr args) ": " (cdr (assoc (cadr args) header))))))