35 lines
1.0 KiB
Scheme
35 lines
1.0 KiB
Scheme
;; Copyright (C) 2023 Camden Dixie O'Brien
|
|
;; SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
(define (tsv-fields line)
|
|
(reverse
|
|
(let iter ((len (string-length line))
|
|
(rem (string-copy line))
|
|
(idx 0)
|
|
(res '()))
|
|
(cond ((>= idx len) (cons rem res))
|
|
((char=? #\tab (string-ref rem idx))
|
|
(iter (- len idx 1)
|
|
(substring rem (+ idx 1) len)
|
|
0
|
|
(cons (substring rem 0 idx) res)))
|
|
(else (iter len rem (+ idx 1) res))))))
|
|
|
|
(define (vcard name number)
|
|
(format "BEGIN:VCARD~%N:;~a;;;~%TEL;TYPE=cell:~a~%END:VCARD~%" name number))
|
|
|
|
(define (tsv-contact->vcard line)
|
|
(let* ((fields (tsv-fields line))
|
|
(number (list-ref fields 0))
|
|
(name (list-ref fields 1)))
|
|
(vcard name number)))
|
|
|
|
(define (foreach-line thunk)
|
|
(let loop ()
|
|
(let ((line (get-line (current-input-port))))
|
|
(unless (eof-object? line)
|
|
(display (thunk line))
|
|
(loop)))))
|
|
|
|
(foreach-line tsv-contact->vcard)
|