changeset 23942:8fa87eee9ae5

(file-expand-wildcards): Handle wildcards in directory name. Be careful about whether to return a relative file name, and if so, relative to what directory.
author Richard M. Stallman <rms@gnu.org>
date Sat, 26 Dec 1998 05:14:48 +0000
parents 7da919fff9be
children 7555c77bc4f0
files lisp/files.el
diffstat 1 files changed, 34 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/files.el	Fri Dec 25 19:34:43 1998 +0000
+++ b/lisp/files.el	Sat Dec 26 05:14:48 1998 +0000
@@ -3064,9 +3064,40 @@
 
 (defun file-expand-wildcards (pattern &optional full)
   "Expand wildcard pattern PATTERN.
-This returns a list of file names which match the pattern."
-  (directory-files (file-name-directory pattern) full
-		   (wildcard-to-regexp (file-name-nondirectory pattern))))
+This returns a list of file names which match the pattern.
+
+If PATTERN is written as an absolute relative file name,
+the values are absolute also.
+
+If PATTERN is written as a relative file name, it is interpreted
+relative to the current default directory, `default-directory'.
+The file names returned are normally also relative to the current
+default directory.  However, if FULL is non-nil, they are absolute."
+  (let* ((nondir (file-name-nondirectory pattern))
+	 (dirpart (file-name-directory pattern))
+	 ;; A list of all dirs that DIRPART specifies.
+	 ;; This can be more than one dir
+	 ;; if DIRPART contains wildcards.
+	 (dirs (if (and dirpart (string-match "[[.*+\\^$?]" dirpart))
+		   (mapcar 'file-name-as-directory
+			   (file-expand-wildcards (directory-file-name dirpart)))
+		 (list dirpart)))
+	 contents)
+    (while dirs
+      (when (or (null (car dirs))	; Possible if DIRPART is not wild.
+		(file-directory-p (directory-file-name (car dirs))))
+	(let ((this-dir-contents
+	       (directory-files (or (car dirs) ".") full
+				(wildcard-to-regexp nondir))))
+	  (setq contents
+		(nconc
+		 (if (and (car dirs) (not full))
+		     (mapcar (function (lambda (name) (concat (car dirs) name)))
+			     this-dir-contents)
+		   this-dir-contents)
+		 contents))))
+      (setq dirs (cdr dirs)))
+    contents))
 
 (defun list-directory (dirname &optional verbose)
   "Display a list of files in or matching DIRNAME, a la `ls'.