]> git.eshelyaron.com Git - emacs.git/commitdiff
(convert-standard-filename): Replace invalid
authorEli Zaretskii <eliz@gnu.org>
Sun, 16 Sep 2001 17:59:35 +0000 (17:59 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sun, 16 Sep 2001 17:59:35 +0000 (17:59 +0000)
characters only after converting dash/underscore to a period.

lisp/ChangeLog
lisp/dos-fns.el

index e69e04dd552450593ff6147481a44dbb0eee8baa..9d618fe0c5b26de57a0e7b9d397372e3195abdc5 100644 (file)
@@ -1,6 +1,8 @@
 2001-09-16  Eli Zaretskii  <eliz@is.elta.co.il>
 
-       * dos-fns.el (original-make-auto-save-file-name): New.
+       * dos-fns.el (convert-standard-filename): Replace invalid
+       characters only after converting dash/underscore to a period.
+       (original-make-auto-save-file-name): New.
        (make-auto-save-file-name): New function, overrides the definition
        on files.el and calls the original function via
        original-make-auto-save-file-name.
index 3751cc76d243cd0e6b9f04876e0973c75f8329ee..4b91cdf7a1b93bdaf66f76e0417a7300271bfc3f 100644 (file)
@@ -74,18 +74,25 @@ with a definition that really does change some file names."
            ;; Change a leading period to a leading underscore.
            (if (= (aref string 0) ?.)
                (aset string 0 ?_))
+           ;; If the name is longer than 8 chars, and doesn't have a
+           ;; period, and we have a dash or underscore that isn't too
+           ;; close to the beginning, change that to a period.  This
+           ;; is so we could salvage more characters of the original
+           ;; name by pushing them into the extension.
+           (if (and (not (string-match "\\." string))
+                    (> (length string) 8)
+                    ;; We don't gain anything if we put the period closer
+                    ;; than 5 chars from the beginning (5 + 3 = 8).
+                    (setq i (string-match "[-_]" string 5)))
+               (aset string i ?\.))
            ;; Get rid of invalid characters.
            (while (setq i (string-match
                            "[^-a-zA-Z0-9_.%~^$!#&{}@`'()\200-\376]"
                            string))
              (aset string i ?_))
-           ;; If we don't have a period,
-           ;; and we have a dash or underscore that isn't the first char,
-           ;; change that to a period.
-           (if (and (not (string-match "\\." string))
-                    (setq i (string-match "[-_]" string 1)))
-               (aset string i ?\.))
            ;; If we don't have a period in the first 8 chars, insert one.
+           ;; This enables to have 3 more characters from the original
+           ;; name in the extension.
            (if (> (or (string-match "\\." string) (length string))
                   8)
                (setq string
@@ -98,13 +105,14 @@ with a definition that really does change some file names."
            (if (> (length string) (+ firstdot 4))
                (setq string (substring string 0 (+ firstdot 4))))
            ;; Change all periods except the first one into underscores.
+           ;; (DOS doesn't allow more than one period.)
            (while (string-match "\\." string (1+ firstdot))
              (setq i (string-match "\\." string (1+ firstdot)))
              (aset string i ?_))
-           ;; If the last character of the original filename was `~',
-           ;; make sure the munged name ends with it also.  This is so
-           ;; a backup file retains its final `~'.
-           (if (equal lastchar ?~)
+           ;; If the last character of the original filename was `~' or `#',
+           ;; make sure the munged name ends with it also.  This is so that
+           ;; backup and auto-save files retain their telltale form.
+           (if (memq lastchar '(?~ ?#))
                (aset string (1- (length string)) lastchar))))
          (concat (if (and (stringp dir)
                           (memq (aref dir dlen-m-1) '(?/ ?\\)))