changeset 30525:f49e65f35fc1

(shell-quote-wildcard-pattern): New function. (insert-directory): Call it. Only prepend "\" to command on Unix and GNU/Linux systems.
author Eli Zaretskii <eliz@gnu.org>
date Sun, 30 Jul 2000 13:26:45 +0000
parents 62ed067637af
children 96c739fe987e
files lisp/files.el
diffstat 1 files changed, 58 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/files.el	Sun Jul 30 11:50:38 2000 +0000
+++ b/lisp/files.el	Sun Jul 30 13:26:45 2000 +0000
@@ -3411,6 +3411,50 @@
 	(let ((wildcard (not (file-directory-p dirname))))
 	  (insert-directory dirname switches wildcard (not wildcard)))))))
 
+(defun shell-quote-wildcard-pattern (pattern)
+  "Quote characters special to the shell in PATTERN, leave wildcards alone.
+
+PATTERN is assumed to represent a file-name wildcard suitable for the
+underlying filesystem.  For Unix and GNU/Linux, the characters from the
+set [ \\t\\n;<>&|()#$] are quoted with a backslash; for DOS/Windows, all
+the parts of the pattern which don't include wildcard characters are
+quoted with double quotes.
+Existing quote characters in PATTERN are left alone, so you can pass
+PATTERN that already quotes some of the special characters."
+  (save-match-data
+    (cond
+     ((memq system-type '(ms-dos windows-nt))
+      ;; DOS/Windows don't allow `"' in file names.  So if the
+      ;; argument has quotes, we can safely assume it is already
+      ;; quoted by the caller.
+      (if (or (string-match "[\"]" pattern)
+	      ;; We quote [&()#$'] in case their shell is a port of a
+	      ;; Unixy shell.  We quote [,=+] because stock DOS and
+	      ;; Windows shells require that in some cases, such as
+	      ;; passing arguments to batch files that use positional
+	      ;; arguments like %1.
+	      (not (string-match "[ \t;&()#$',=+]" pattern)))
+	  pattern
+	(let ((result "\"")
+	      (beg 0)
+	      end)
+	  (while (string-match "[*?]+" pattern beg)
+	    (setq end (match-beginning 0)
+		  result (concat result (substring pattern beg end)
+				 "\""
+				 (substring pattern end (match-end 0))
+				 "\"")
+		  beg (match-end 0)))
+	  (concat result (substring pattern beg) "\""))))
+     (t
+      (let ((beg 0))
+	(while (string-match "[ \t\n;<>&|()#$]" pattern beg)
+	  (setq pattern
+		(concat (substring pattern 0 (match-beginning 0))
+			"\\"
+			(substring pattern (match-beginning 0)))
+		beg (1+ (match-end 0)))))))))
+
 (defvar insert-directory-program "ls"
   "Absolute or relative name of the `ls' program used by `insert-directory'.")
 
@@ -3461,30 +3505,28 @@
 		(if wildcard
 		    ;; Run ls in the directory of the file pattern we asked for
 		    (let ((default-directory (file-name-directory file))
-			  (pattern (file-name-nondirectory file))
-			  (beg 0))
-		      ;; Quote some characters that have special
-		      ;; meanings in shells; but don't quote the
-		      ;; wildcards--we want them to be special.
-		      ;; We also currently don't quote the quoting
-		      ;; characters in case people want to use them
-		      ;; explicitly to quote wildcard characters.
-		      (while (string-match "[ \t\n;<>&|()#$]" pattern beg)
-			(setq pattern
-			      (concat (substring pattern 0 (match-beginning 0))
-				      "\\"
-				      (substring pattern (match-beginning 0)))
-			      beg (1+ (match-end 0))))
+			  (pattern (file-name-nondirectory file)))
 		      (call-process
                        shell-file-name nil t nil
-                       "-c" (concat "\\" ; Disregard shell aliases!
+                       "-c" (concat (if (memq system-type '(ms-dos windows-nt))
+					""
+				      "\\") ; Disregard Unix shell aliases!
                                     insert-directory-program
                                     " -d "
                                     (if (stringp switches)
                                         switches
                                         (mapconcat 'identity switches " "))
                                     " -- "
-                                    pattern)))
+				    ;; Quote some characters that have
+				    ;; special meanings in shells; but
+				    ;; don't quote the wildcards--we
+				    ;; want them to be special.  We
+				    ;; also currently don't quote the
+				    ;; quoting characters in case
+				    ;; people want to use them
+				    ;; explicitly to quote wildcard
+				    ;; characters.
+                                    (shell-quote-wildcard-pattern pattern))))
 		  ;; SunOS 4.1.3, SVr4 and others need the "." to list the
 		  ;; directory if FILE is a symbolic link.
 		  (apply 'call-process