changeset 39305:22c925655e32

(convert-standard-filename): Replace invalid characters only after converting dash/underscore to a period.
author Eli Zaretskii <eliz@gnu.org>
date Sun, 16 Sep 2001 17:58:09 +0000
parents 7be776e0f517
children b10ad115df7e
files lisp/dos-fns.el
diffstat 1 files changed, 18 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/dos-fns.el	Sun Sep 16 12:02:47 2001 +0000
+++ b/lisp/dos-fns.el	Sun Sep 16 17:58:09 2001 +0000
@@ -74,18 +74,25 @@
 	    ;; 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 @@
 	    (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) '(?/ ?\\)))