diff --git a/scsh/scsh.scm b/scsh/scsh.scm index d405737..04238ce 100644 --- a/scsh/scsh.scm +++ b/scsh/scsh.scm @@ -444,7 +444,8 @@ (close-fdes (open-fdes fname oflags #o600)) fname) (if (null? maybe-prefix) '() - (list (string-append (car maybe-prefix) ".~a")))))) + (list (string-append (constant-format-string (car maybe-prefix)) + ".~a")))))) (define *temp-file-template* (make-fluid (string-append "/tmp/" (number->string (pid)) ".~a"))) @@ -463,6 +464,23 @@ (loop (+ i 1))))))))) +;; Double tildes in S. +;; Using the return value as a format string will output exactly S. +(define (constant-format-string s) ; Ugly code. Would be much clearer + (let* ((len (string-length s)) ; if written with string SRFI. + (tilde? (lambda (s i) (char=? #\~ (string-ref s i)))) + (newlen (do ((i (- len 1) (- i 1)) + (ans 0 (+ ans (if (tilde? s i) 2 1)))) + ((< i 0) ans))) + (fs (make-string newlen))) + (let lp ((i 0) (j 0)) + (cond ((< i len) + (let ((j (cond ((tilde? s i) (string-set! fs j #\~) (+ j 1)) + (else j)))) + (string-set! fs j (string-ref s i)) + (lp (+ i 1) (+ j 1)))))) + fs)) + ;;; Roughly equivalent to (pipe). ;;; Returns two file ports [iport oport] open on a temp file.