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