base64.ss
#lang scheme/base
(require (planet bzlib/base)
         net/base64
         "port.ss"
         "filter.ss"
         (rename-in net/base64 (base64-decode-stream input-base64-filter))
         )

(define (output-base64-filter in out)
  (base64-encode-stream in out #"\n"))

;; one can use this to write things into base64
(define (open-input-base64-port in)
  (make-input-filter-port in input-base64-filter #f))

(define call-with-input-base64-port
  (make-call-with-input-port open-input-base64-port in))

(define (open-input-base64-file path)
  (open-input-base64-port (open-input-file path)))

(define call-with-input-base64-file
  (make-call-with-input-port open-input-base64-file path))

(define (open-output-base64-port out)
  (make-output-filter-port out output-base64-filter #f))

(define call-with-output-base64-port
  (make-call-with-output-port open-output-base64-port out))

(define (open-output-base64-file path #:exists (exists 'replace))
  (open-input-base64-port (open-output-file path #:exists exists)))

(define call-with-output-base64-file
  (make-call-with-output-port open-output-base64-file path #:exists (exists 'replace)))

(provide/contract 
 (open-input-base64-port (-> input-port? input-port?))
 (call-with-input-base64-port (-> input-port? (-> input-port? any) any))
 (open-input-base64-file (-> path-string? input-port?))
 (call-with-input-base64-file (-> path-string? (-> input-port? any) any))
 (open-output-base64-port (-> output-port? output-port?))
 (call-with-output-base64-port (-> output-port? (-> output-port? any) any))
 (open-output-base64-file (->* (path-string?)
                               (#:exists (or/c 'replace 'error))
                               output-port?))
 (call-with-output-base64-file (->* (path-string? (-> output-port? any))
                                    (#:exists (or/c 'replace 'error))
                                    any))
 (output-base64-filter port-filter/c)
 )

(provide input-base64-filter)