svn commit: r202075 - projects/jbuild/usr.bin/make

Craig Rodrigues rodrigc at FreeBSD.org
Mon Jan 11 10:30:58 UTC 2010


Author: rodrigc
Date: Mon Jan 11 10:30:57 2010
New Revision: 202075
URL: http://svn.freebsd.org/changeset/base/202075

Log:
  Add Dir_FindHereOrAbove() function from NetBSD:
  
    revision 1.40
    date: 2004/02/03 19:25:29;  author: chuck;  state: Exp;  lines: +86 -3
    add parent directory search for make as discussed on tech-toolchain.
     - new dir.c function: Dir_FindHereOrAbove:
        Search for a path in the current directory and then all the directories
        above it in turn until the path is found or we reach the root ("/").
  
  Submitted by:   obrien, Simon Gerarty <sjg at NetBSD.org>
  Obtained from:	NetBSD

Modified:
  projects/jbuild/usr.bin/make/dir.c
  projects/jbuild/usr.bin/make/dir.h

Modified: projects/jbuild/usr.bin/make/dir.c
==============================================================================
--- projects/jbuild/usr.bin/make/dir.c	Mon Jan 11 10:16:12 2010	(r202074)
+++ projects/jbuild/usr.bin/make/dir.c	Mon Jan 11 10:30:57 2010	(r202075)
@@ -61,6 +61,10 @@ __FBSDID("$FreeBSD$");
  *			If it exists, the entire path is returned.
  *			Otherwise NULL is returned.
  *
+ *	Dir_FindHereOrAbove Search for a path in the current directory and
+ *			then all the directories above it in turn until
+ *			the path is found or we reach the root ("/").
+ *
  *	Dir_MTime	Return the modification time of a node. The file
  *			is searched for along the default search path.
  *			The path and mtime fields of the node are filled in.
@@ -83,7 +87,7 @@ __FBSDID("$FreeBSD$");
  *	Dir_PrintDirectories	Print stats about the directory cache.
  */
 
-#include <sys/types.h>
+#include <sys/param.h>
 #include <sys/stat.h>
 #include <dirent.h>
 #include <err.h>
@@ -655,7 +659,7 @@ Path_FindFile(char *name, struct Path *p
 	 * (fish.c) and what pmake finds (./fish.c).
 	 */
 	if ((!hasSlash || (cp - name == 2 && *name == '.')) &&
-	    (Hash_FindEntry(&dot->files, cp) != NULL)) {
+	    (dot != NULL && Hash_FindEntry(&dot->files, cp) != NULL)) {
 		DEBUGF(DIR, ("in '.'\n"));
 		hits += 1;
 		dot->hits += 1;
@@ -851,6 +855,83 @@ Path_FindFile(char *name, struct Path *p
 
 /*-
  *-----------------------------------------------------------------------
+ * Dir_FindHereOrAbove  --
+ *	search for a path starting at a given directory and then working
+ *	our way up towards the root.
+ *
+ * Input:
+ *	here		starting directory
+ *	search_path	the path we are looking for
+ *	result		the result of a successful search is placed here
+ *	rlen		the length of the result buffer
+ *			(typically MAXPATHLEN + 1)
+ *
+ * Results:
+ *	0 on failure, 1 on success [in which case the found path is put
+ *	in the result buffer].
+ *
+ * Side Effects:
+ *-----------------------------------------------------------------------
+ */
+int
+Dir_FindHereOrAbove(char *here, char *search_path, char *result, int rlen)
+{
+	struct stat st;
+	char dirbase[MAXPATHLEN + 1], *db_end;
+	char try[MAXPATHLEN + 1], *try_end;
+
+	/* copy out our starting point */
+	snprintf(dirbase, sizeof(dirbase), "%s", here);
+	db_end = dirbase + strlen(dirbase);
+
+	/* loop until we determine a result */
+	while (1) {
+		/* try and stat(2) it ... */
+		snprintf(try, sizeof(try), "%s/%s", dirbase, search_path);
+		if (stat(try, &st) != -1) {
+			/*
+			 * Success!  If we found a file, chop off
+			 * the filename so we return a directory.
+			 */
+			if ((st.st_mode & S_IFMT) != S_IFDIR) {
+				try_end = try + strlen(try);
+				while (try_end > try && *try_end != '/')
+					try_end--;
+				if (try_end > try)
+					*try_end = 0;	/* chop! */
+			}
+
+			/*
+			 * Done!
+			 */
+			snprintf(result, rlen, "%s", try);
+			return(1);
+		}
+
+		/*
+		 * Nope, we didn't find it.  If we used up dirbase we've
+		 * reached the root and failed.
+		 */
+		if (db_end == dirbase)
+			break;		/* Failed! */
+
+		/*
+		 * truncate dirbase from the end to move up a dir
+		 */
+		while (db_end > dirbase && *db_end != '/')
+			db_end--;
+		*db_end = 0;		/* chop! */
+
+	} /* while (1) */
+
+	/*
+	 * We failed...
+	 */
+	return(0);
+}
+
+/*-
+ *-----------------------------------------------------------------------
  * Dir_MTime  --
  *	Find the modification time of the file described by gn along the
  *	search path dirSearchPath.

Modified: projects/jbuild/usr.bin/make/dir.h
==============================================================================
--- projects/jbuild/usr.bin/make/dir.h	Mon Jan 11 10:16:12 2010	(r202074)
+++ projects/jbuild/usr.bin/make/dir.h	Mon Jan 11 10:30:57 2010	(r202075)
@@ -72,5 +72,6 @@ void Path_Print(const struct Path *);
 typedef void path_listcb_t(char *, size_t, const char *);
 void Path_List(const struct Path *, path_listcb_t *, char *, size_t);
 #endif
+int Dir_FindHereOrAbove(char *, char *, char *, int);
 
 #endif /* dir_h_6002e3b8 */


More information about the svn-src-projects mailing list