Emacs lisp:
(defun toggle-case-file (file)
"Create a file with a name that is toggled case and toggle case in that file"
(interactive (list (read-file-name "File: ")))
(let ((filename (file-name-nondirectory file))
(edit-buffer nil))
(find-file file)
(setq edit-buffer (current-buffer))
(toggle-case-buffer)
(switch-to-buffer "*temp-filename-buffer*")
(insert filename)
(toggle-case-buffer)
(setq filename (buffer-string))
(kill-buffer)
(switch-to-buffer edit-buffer)
(write-file filename)))
(defun toggle-case-buffer ()
"Toggles case on the contents of the buffer."
(goto-char (point-min))
(while (<= (point) (1- (point-max)))
(if (upcasep (following-char))
(insert (downcase (following-char)))
(insert (upcase (following-char))))
(delete-char 1)))
(defun upcasep (char)
"Returns t if char is upcase."
(not (= char (downcase char))))
This code is ugly, but it works. I should have written a function that works on a string, and not a buffer, and I wouldn't need a temporary buffer.