Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/make make(1): refactor DirMatchFiles



details:   https://anonhg.NetBSD.org/src/rev/909d1292b5b5
branches:  trunk
changeset: 945268:909d1292b5b5
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sun Oct 25 08:59:26 2020 +0000

description:
make(1): refactor DirMatchFiles

Split the conditions since the comment only applies to one of them.
Use local variables for common subexpressions.

diffstat:

 usr.bin/make/dir.c |  70 ++++++++++++++++++++++++++++-------------------------
 1 files changed, 37 insertions(+), 33 deletions(-)

diffs (113 lines):

diff -r 664c1117d479 -r 909d1292b5b5 usr.bin/make/dir.c
--- a/usr.bin/make/dir.c        Sun Oct 25 08:50:32 2020 +0000
+++ b/usr.bin/make/dir.c        Sun Oct 25 08:59:26 2020 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dir.c,v 1.180 2020/10/25 08:10:03 rillig Exp $ */
+/*     $NetBSD: dir.c,v 1.181 2020/10/25 08:59:26 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -135,7 +135,7 @@
 #include "job.h"
 
 /*     "@(#)dir.c      8.2 (Berkeley) 1/2/94"  */
-MAKE_RCSID("$NetBSD: dir.c,v 1.180 2020/10/25 08:10:03 rillig Exp $");
+MAKE_RCSID("$NetBSD: dir.c,v 1.181 2020/10/25 08:59:26 rillig Exp $");
 
 #define DIR_DEBUG0(text) DEBUG0(DIR, text)
 #define DIR_DEBUG1(fmt, arg1) DEBUG1(DIR, fmt, arg1)
@@ -576,48 +576,48 @@
     return wild && brackets == 0 && braces == 0;
 }
 
-/*-
- *-----------------------------------------------------------------------
- * DirMatchFiles --
- *     Given a pattern and a CachedDir structure, see if any files
- *     match the pattern and add their names to the 'expansions' list if
- *     any do. This is incomplete -- it doesn't take care of patterns like
- *     src / *src / *.c properly (just *.c on any of the directories), but it
- *     will do for now.
+/* See if any files match the pattern and add their names to the 'expansions'
+ * list if they do.
+ *
+ * This is incomplete -- wildcards are only expanded in the final path
+ * component, but not in directories like src/lib*c/file*.c, but it
+ * will do for now (now being 1993 until at least 2020). To expand these,
+ * use the ':sh' variable modifier such as in ${:!echo src/lib*c/file*.c!}.
  *
  * Input:
  *     pattern         Pattern to look for
  *     dir             Directory to search
  *     expansion       Place to store the results
- *
- * Side Effects:
- *     File names are added to the expansions lst. The directory will be
- *     fully hashed when this is done.
- *-----------------------------------------------------------------------
  */
 static void
 DirMatchFiles(const char *pattern, CachedDir *dir, StringList *expansions)
 {
+    const char *dirName = dir->name;
+    Boolean isDot = dirName[0] == '.' && dirName[1] == '\0';
     HashIter hi;
-    HashEntry *entry;          /* Current entry in the table */
-    Boolean isDot;             /* TRUE if the directory being searched is . */
-
-    isDot = (dir->name[0] == '.' && dir->name[1] == '\0');
 
     HashIter_Init(&hi, &dir->files);
-    while ((entry = HashIter_Next(&hi)) != NULL) {
+    while (HashIter_Next(&hi) != NULL) {
+       const char *base = hi.entry->key;
+
+       if (!Str_Match(base, pattern))
+           continue;
+
        /*
-        * See if the file matches the given pattern. Note we follow the UNIX
-        * convention that dot files will only be found if the pattern
-        * begins with a dot (note also that as a side effect of the hashing
-        * scheme, .* won't match . or .. since they aren't hashed).
+        * Follow the UNIX convention that dot files are only found if the
+        * pattern begins with a dot. The pattern '.*' does not match '.' or
+        * '..' since these are not included in the directory cache.
+        *
+        * XXX: This means that the pattern '[a-z.]*' does not find '.file'.
         */
-       if (Str_Match(entry->key, pattern) &&
-           (entry->key[0] != '.' || pattern[0] == '.'))
+       if (base[0] == '.' && pattern[0] != '.')
+           continue;
+
        {
-           Lst_Append(expansions,
-                      (isDot ? bmake_strdup(entry->key) :
-                       str_concat3(dir->name, "/", entry->key)));
+           char *fullName = isDot
+                            ? bmake_strdup(base)
+                            : str_concat3(dirName, "/", base);
+           Lst_Append(expansions, fullName);
        }
     }
 }
@@ -686,10 +686,14 @@
     return s;
 }
 
-/* Expand curly braces like the C shell. Does this recursively.
- * Note the special case: if after the piece of the curly brace is
- * done, there are no wildcard characters in the result, the result is
- * placed on the list WITHOUT CHECKING FOR ITS EXISTENCE.
+/* Expand curly braces like the C shell. Brace expansion by itself is purely
+ * textual, the expansions are not looked up in the file system. But if an
+ * expanded word contains wildcard characters, it is expanded further,
+ * matching only the actually existing files.
+ *
+ * Example: "{a{b,c}}" expands to "ab" and "ac".
+ * Example: "{a}" expands to "a".
+ * Example: "{a,*.c}" expands to "a" and all "*.c" files that exist.
  *
  * Input:
  *     word            Entire word to expand



Home | Main Index | Thread Index | Old Index