diff --git a/src/code/filesys.lisp b/src/code/filesys.lisp index 4b93242..34b95f2 100644 --- a/src/code/filesys.lisp +++ b/src/code/filesys.lisp @@ -152,52 +152,37 @@ (make-pattern (pattern)))))) (defun unparse-physical-piece (thing escape-char) - (etypecase thing - ((member :wild) "*") - (simple-string - (let* ((srclen (length thing)) - (dstlen srclen)) - (dotimes (i srclen) - (let ((char (schar thing i))) - (case char - ((#\* #\? #\[) - (incf dstlen)) - (t (when (char= char escape-char) - (incf dstlen)))))) - (let ((result (make-string dstlen)) - (dst 0)) - (dotimes (src srclen) - (let ((char (schar thing src))) - (case char - ((#\* #\? #\[) - (setf (schar result dst) escape-char) - (incf dst)) - (t (when (char= char escape-char) - (setf (schar result dst) escape-char) - (incf dst)))) - (setf (schar result dst) char) - (incf dst))) - result))) - (pattern - (with-simple-output-to-string (s) - (dolist (piece (pattern-pieces thing)) - (etypecase piece - (simple-string - (write-string piece s)) - (symbol - (ecase piece - (:multi-char-wild - (write-string "*" s)) - (:single-char-wild - (write-string "?" s)))) - (cons - (case (car piece) - (:character-set - (write-string "[" s) - (write-string (cdr piece) s) - (write-string "]" s)) - (t - (error "invalid pattern piece: ~S" piece)))))))))) + (flet ((write-escaped-simple-string (string escape stream) + (dotimes (i (length string)) + (let ((char (schar string i))) + (when (or (char= char escape) (member char '(#\* #\? #\[))) + (write-char escape stream)) + (write-char char stream))))) + (etypecase thing + ((member :wild) "*") + (simple-string + (with-simple-output-to-string (s) + (write-escaped-simple-string thing escape-char s))) + (pattern + (with-simple-output-to-string (s) + (dolist (piece (pattern-pieces thing)) + (etypecase piece + (simple-string + (write-escaped-simple-string piece escape-char s)) + (symbol + (ecase piece + (:multi-char-wild + (write-string "*" s)) + (:single-char-wild + (write-string "?" s)))) + (cons + (case (car piece) + (:character-set + (write-string "[" s) + (write-string (cdr piece) s) + (write-string "]" s)) + (t + (error "invalid pattern piece: ~S" piece))))))))))) (defun make-matcher (piece) (cond ((eq piece :wild)