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): split Dir_FindFile into separate funct...



details:   https://anonhg.NetBSD.org/src/rev/5932411879fe
branches:  trunk
changeset: 950257:5932411879fe
user:      rillig <rillig%NetBSD.org@localhost>
date:      Sat Jan 23 12:36:02 2021 +0000

description:
make(1): split Dir_FindFile into separate functions

diffstat:

 usr.bin/make/dir.c |  208 +++++++++++++++++++++++++++++-----------------------
 1 files changed, 114 insertions(+), 94 deletions(-)

diffs (238 lines):

diff -r bc6fa9af9e8d -r 5932411879fe usr.bin/make/dir.c
--- a/usr.bin/make/dir.c        Sat Jan 23 12:35:22 2021 +0000
+++ b/usr.bin/make/dir.c        Sat Jan 23 12:36:02 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: dir.c,v 1.262 2021/01/23 12:25:35 rillig Exp $ */
+/*     $NetBSD: dir.c,v 1.263 2021/01/23 12:36:02 rillig Exp $ */
 
 /*
  * Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -138,7 +138,7 @@
 #include "job.h"
 
 /*     "@(#)dir.c      8.2 (Berkeley) 1/2/94"  */
-MAKE_RCSID("$NetBSD: dir.c,v 1.262 2021/01/23 12:25:35 rillig Exp $");
+MAKE_RCSID("$NetBSD: dir.c,v 1.263 2021/01/23 12:36:02 rillig Exp $");
 
 /*
  * A search path is a list of CachedDir structures. A CachedDir has in it the
@@ -1064,6 +1064,115 @@
        return NULL;
 }
 
+static Boolean
+FindFileRelative(SearchPath *path, Boolean seenDotLast,
+                const char *name, char **out_file)
+{
+       SearchPathNode *ln;
+       Boolean checkedDot = FALSE;
+       char *file;
+
+       DEBUG0(DIR, "   Trying subdirectories...\n");
+
+       if (!seenDotLast) {
+               if (dot != NULL) {
+                       checkedDot = TRUE;
+                       if ((file = DirLookupSubdir(dot, name)) != NULL)
+                               goto found;
+               }
+               if (cur != NULL &&
+                   (file = DirLookupSubdir(cur, name)) != NULL)
+                       goto found;
+       }
+
+       for (ln = path->first; ln != NULL; ln = ln->next) {
+               CachedDir *dir = ln->datum;
+               if (dir == dotLast)
+                       continue;
+               if (dir == dot) {
+                       if (checkedDot)
+                               continue;
+                       checkedDot = TRUE;
+               }
+               if ((file = DirLookupSubdir(dir, name)) != NULL)
+                       goto found;
+       }
+
+       if (seenDotLast) {
+               if (dot != NULL && !checkedDot) {
+                       checkedDot = TRUE;
+                       if ((file = DirLookupSubdir(dot, name)) != NULL)
+                               goto found;
+               }
+               if (cur != NULL &&
+                   (file = DirLookupSubdir(cur, name)) != NULL)
+                       goto found;
+       }
+
+       if (checkedDot) {
+               /*
+                * Already checked by the given name, since . was in
+                * the path, so no point in proceeding.
+                */
+               DEBUG0(DIR, "   Checked . already, returning NULL\n");
+               file = NULL;
+               goto found;
+       }
+
+       return FALSE;
+
+found:
+       *out_file = file;
+       return TRUE;
+}
+
+static Boolean
+FindFileAbsolute(SearchPath *path, Boolean const seenDotLast,
+                const char *const name, const char *const base,
+                char **out_file)
+{
+       char *file;
+       SearchPathNode *ln;
+
+       /*
+        * For absolute names, compare directory path prefix against
+        * the the directory path of each member on the search path
+        * for an exact match. If we have an exact match on any member
+        * of the search path, use the cached contents of that member
+        * to lookup the final file component. If that lookup fails we
+        * can safely assume that the file does not exist at all.
+        * This is signified by DirLookupAbs() returning an empty
+        * string.
+        */
+       DEBUG0(DIR, "   Trying exact path matches...\n");
+
+       if (!seenDotLast && cur != NULL &&
+           ((file = DirLookupAbs(cur, name, base)) != NULL))
+               goto found;
+
+       for (ln = path->first; ln != NULL; ln = ln->next) {
+               CachedDir *dir = ln->datum;
+               if (dir == dotLast)
+                       continue;
+               if ((file = DirLookupAbs(dir, name, base)) != NULL)
+                       goto found;
+       }
+
+       if (seenDotLast && cur != NULL &&
+           ((file = DirLookupAbs(cur, name, base)) != NULL))
+               goto found;
+
+       return FALSE;
+
+found:
+       if (file[0] == '\0') {
+               free(file);
+               file = NULL;
+       }
+       *out_file = file;
+       return TRUE;
+}
+
 /*
  * Find the file with the given name along the given search path.
  *
@@ -1170,100 +1279,11 @@
        }
 
        if (name[0] != '/') {
-               SearchPathNode *ln;
-               Boolean checkedDot = FALSE;
-
-               DEBUG0(DIR, "   Trying subdirectories...\n");
-
-               if (!seenDotLast) {
-                       if (dot != NULL) {
-                               checkedDot = TRUE;
-                               if ((file = DirLookupSubdir(dot, name)) != NULL)
-                                       return file;
-                       }
-                       if (cur != NULL &&
-                           (file = DirLookupSubdir(cur, name)) != NULL)
-                               return file;
-               }
-
-               for (ln = path->first; ln != NULL; ln = ln->next) {
-                       CachedDir *dir = ln->datum;
-                       if (dir == dotLast)
-                               continue;
-                       if (dir == dot) {
-                               if (checkedDot)
-                                       continue;
-                               checkedDot = TRUE;
-                       }
-                       if ((file = DirLookupSubdir(dir, name)) != NULL)
-                               return file;
-               }
-
-               if (seenDotLast) {
-                       if (dot != NULL && !checkedDot) {
-                               checkedDot = TRUE;
-                               if ((file = DirLookupSubdir(dot, name)) != NULL)
-                                       return file;
-                       }
-                       if (cur != NULL &&
-                           (file = DirLookupSubdir(cur, name)) != NULL)
-                               return file;
-               }
-
-               if (checkedDot) {
-                       /*
-                        * Already checked by the given name, since . was in
-                        * the path, so no point in proceeding.
-                        */
-                       DEBUG0(DIR, "   Checked . already, returning NULL\n");
-                       return NULL;
-               }
-
-       } else { /* name[0] == '/' */
-               SearchPathNode *ln;
-
-               /*
-                * For absolute names, compare directory path prefix against
-                * the the directory path of each member on the search path
-                * for an exact match. If we have an exact match on any member
-                * of the search path, use the cached contents of that member
-                * to lookup the final file component. If that lookup fails we
-                * can safely assume that the file does not exist at all.
-                * This is signified by DirLookupAbs() returning an empty
-                * string.
-                */
-               DEBUG0(DIR, "   Trying exact path matches...\n");
-
-               if (!seenDotLast && cur != NULL &&
-                   ((file = DirLookupAbs(cur, name, base)) != NULL)) {
-                       if (file[0] == '\0') {
-                               free(file);
-                               return NULL;
-                       }
+               if (FindFileRelative(path, seenDotLast, name, &file))
                        return file;
-               }
-
-               for (ln = path->first; ln != NULL; ln = ln->next) {
-                       CachedDir *dir = ln->datum;
-                       if (dir == dotLast)
-                               continue;
-                       if ((file = DirLookupAbs(dir, name, base)) != NULL) {
-                               if (file[0] == '\0') {
-                                       free(file);
-                                       return NULL;
-                               }
-                               return file;
-                       }
-               }
-
-               if (seenDotLast && cur != NULL &&
-                   ((file = DirLookupAbs(cur, name, base)) != NULL)) {
-                       if (file[0] == '\0') {
-                               free(file);
-                               return NULL;
-                       }
+       } else {
+               if (FindFileAbsolute(path, seenDotLast, name, base, &file))
                        return file;
-               }
        }
 
        /*



Home | Main Index | Thread Index | Old Index