Compare commits

...

2 Commits

View File

@@ -4,43 +4,31 @@
(define (tsv-fields line) (define (tsv-fields line)
(reverse (reverse
(let iter ((len (string-length line)) (let iter ((len (string-length line))
(rem (string-copy line)) (rem (string-copy line))
(idx 0) (idx 0)
(res '())) (res '()))
(cond ((>= idx len) (cons rem res)) (cond ((>= idx len) (cons rem res))
((char=? #\tab (string-ref rem idx)) ((char=? #\tab (string-ref rem idx))
(iter (- len idx 1) (iter (- len idx 1)
(substring rem (+ idx 1) len) (substring rem (+ idx 1) len)
0 0
(cons (substring rem 0 idx) res))) (cons (substring rem 0 idx) res)))
(else (iter len rem (+ idx 1) res)))))) (else (iter len rem (+ idx 1) res))))))
(define (vcard name number) (define (vcard name number)
(with-output-to-string (format "BEGIN:VCARD~%N:;~a;;;~%TEL;TYPE=cell:~a~%END:VCARD~%" name number))
(lambda ()
(display "BEGIN:VCARD")
(newline)
(display "N:;")
(display name)
(display ";;;")
(newline)
(display "TEL;TYPE=cell:")
(display number)
(newline)
(display "END:VCARD")
(newline))))
(define (tsv-contact->vcard line) (define (tsv-contact->vcard line)
(let* ((fields (tsv-fields line)) (let* ((fields (tsv-fields line))
(number (list-ref fields 0)) (number (list-ref fields 0))
(name (list-ref fields 1))) (name (list-ref fields 1)))
(vcard name number))) (vcard name number)))
(define (foreach-line thunk) (define (foreach-line thunk)
(let loop () (let loop ()
(let ((line (get-line (current-input-port)))) (let ((line (get-line (current-input-port))))
(unless (eof-object? line) (unless (eof-object? line)
(display (thunk line)) (display (thunk line))
(loop))))) (loop)))))
(foreach-line tsv-contact->vcard) (foreach-line tsv-contact->vcard)