35 lines
1.1 KiB
Racket
35 lines
1.1 KiB
Racket
#lang racket/base
|
|
(require racket/cmdline file/gzip file/gunzip net/base64)
|
|
|
|
(define do-lang? #f)
|
|
|
|
(define (encode/decode-text who lang-from lang-to convert1 convert2)
|
|
(when do-lang?
|
|
(let ([l (cadr (or (regexp-match #rx"^ *#lang +(.*[^ ]) *$" (read-line))
|
|
(error who "missing #lang line")))])
|
|
(if (equal? l lang-from)
|
|
(printf "#lang ~a\n" lang-to)
|
|
(error who "bad #lang: expected ~s, got ~s" lang-from l))))
|
|
(define O (open-output-bytes))
|
|
(convert1 (current-input-port) O)
|
|
(convert2 (open-input-bytes (get-output-bytes O)) (current-output-port))
|
|
(flush-output))
|
|
|
|
(define (encode-text)
|
|
(encode/decode-text
|
|
'encode-text "racket/base" "s-exp framework/private/decode"
|
|
deflate base64-encode-stream))
|
|
|
|
(define (decode-text)
|
|
(encode/decode-text
|
|
'decode-text "s-exp framework/private/decode" "racket/base"
|
|
base64-decode-stream inflate))
|
|
|
|
(command-line
|
|
#:once-each
|
|
["-l" "translate lang line" (set! do-lang? #t)]
|
|
#:once-any
|
|
["-e" "encode" (encode-text) (exit)]
|
|
["-d" "decode" (decode-text) (exit)])
|
|
(printf "Use `-h' for help\n")
|