Module Name: src
Committed By: rillig
Date: Mon Nov 23 20:21:35 UTC 2020
Modified Files:
src/usr.bin/make: dir.c
Log Message:
make(1): indent dir.c using tabs instead of spaces
Except for Dir_Expand and Dir_UpdateMTime, which are nested too deeply
to use tabs right now. They first have to be split into separate
functions.
To generate a diff of this commit:
cvs rdiff -u -r1.211 -r1.212 src/usr.bin/make/dir.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/make/dir.c
diff -u src/usr.bin/make/dir.c:1.211 src/usr.bin/make/dir.c:1.212
--- src/usr.bin/make/dir.c:1.211 Mon Nov 23 18:24:05 2020
+++ src/usr.bin/make/dir.c Mon Nov 23 20:21:34 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: dir.c,v 1.211 2020/11/23 18:24:05 rillig Exp $ */
+/* $NetBSD: dir.c,v 1.212 2020/11/23 20:21:34 rillig Exp $ */
/*
* Copyright (c) 1988, 1989, 1990 The Regents of the University of California.
@@ -134,7 +134,7 @@
#include "job.h"
/* "@(#)dir.c 8.2 (Berkeley) 1/2/94" */
-MAKE_RCSID("$NetBSD: dir.c,v 1.211 2020/11/23 18:24:05 rillig Exp $");
+MAKE_RCSID("$NetBSD: dir.c,v 1.212 2020/11/23 20:21:34 rillig Exp $");
#define DIR_DEBUG0(text) DEBUG0(DIR, text)
#define DIR_DEBUG1(fmt, arg1) DEBUG1(DIR, fmt, arg1)
@@ -212,63 +212,63 @@ typedef ListNode CachedDirListNode;
typedef ListNode SearchPathNode;
-SearchPath *dirSearchPath; /* main search path */
+SearchPath *dirSearchPath; /* main search path */
/* A list of cached directories, with fast lookup by directory name. */
typedef struct OpenDirs {
- CachedDirList *list;
- HashTable /* of CachedDirListNode */ table;
+ CachedDirList *list;
+ HashTable /* of CachedDirListNode */ table;
} OpenDirs;
static void
OpenDirs_Init(OpenDirs *odirs)
{
- odirs->list = Lst_New();
- HashTable_Init(&odirs->table);
+ odirs->list = Lst_New();
+ HashTable_Init(&odirs->table);
}
#ifdef CLEANUP
static void
OpenDirs_Done(OpenDirs *odirs)
{
- CachedDirListNode *ln = odirs->list->first;
- while (ln != NULL) {
- CachedDirListNode *next = ln->next;
- CachedDir *dir = ln->datum;
- Dir_Destroy(dir); /* removes the dir from odirs->list */
- ln = next;
- }
- Lst_Free(odirs->list);
- HashTable_Done(&odirs->table);
+ CachedDirListNode *ln = odirs->list->first;
+ while (ln != NULL) {
+ CachedDirListNode *next = ln->next;
+ CachedDir *dir = ln->datum;
+ Dir_Destroy(dir); /* removes the dir from odirs->list */
+ ln = next;
+ }
+ Lst_Free(odirs->list);
+ HashTable_Done(&odirs->table);
}
#endif
static CachedDir *
OpenDirs_Find(OpenDirs *odirs, const char *name)
{
- CachedDirListNode *ln = HashTable_FindValue(&odirs->table, name);
- return ln != NULL ? ln->datum : NULL;
+ CachedDirListNode *ln = HashTable_FindValue(&odirs->table, name);
+ return ln != NULL ? ln->datum : NULL;
}
static void
OpenDirs_Add(OpenDirs *odirs, CachedDir *cdir)
{
- if (HashTable_FindEntry(&odirs->table, cdir->name) != NULL)
- return;
- Lst_Append(odirs->list, cdir);
- HashTable_Set(&odirs->table, cdir->name, odirs->list->last);
+ if (HashTable_FindEntry(&odirs->table, cdir->name) != NULL)
+ return;
+ Lst_Append(odirs->list, cdir);
+ HashTable_Set(&odirs->table, cdir->name, odirs->list->last);
}
static void
OpenDirs_Remove(OpenDirs *odirs, const char *name)
{
- HashEntry *he = HashTable_FindEntry(&odirs->table, name);
- CachedDirListNode *ln;
- if (he == NULL)
- return;
- ln = HashEntry_Get(he);
- HashTable_DeleteEntry(&odirs->table, he);
- Lst_Remove(odirs->list, ln);
+ HashEntry *he = HashTable_FindEntry(&odirs->table, name);
+ CachedDirListNode *ln;
+ if (he == NULL)
+ return;
+ ln = HashEntry_Get(he);
+ HashTable_DeleteEntry(&odirs->table, he);
+ Lst_Remove(odirs->list, ln);
}
static OpenDirs openDirs; /* all cached directories */
@@ -299,9 +299,9 @@ static HashTable mtimes;
static HashTable lmtimes; /* same as mtimes but for lstat */
typedef enum CachedStatsFlags {
- CST_NONE = 0,
- CST_LSTAT = 1 << 0, /* call lstat(2) instead of stat(2) */
- CST_UPDATE = 1 << 1 /* ignore existing cached entry */
+ CST_NONE = 0,
+ CST_LSTAT = 1 << 0, /* call lstat(2) instead of stat(2) */
+ CST_UPDATE = 1 << 1 /* ignore existing cached entry */
} CachedStatsFlags;
/* Returns 0 and the result of stat(2) or lstat(2) in *out_cst,
@@ -310,76 +310,76 @@ static int
cached_stats(const char *pathname, struct cached_stat *out_cst,
CachedStatsFlags flags)
{
- HashTable *tbl = flags & CST_LSTAT ? &lmtimes : &mtimes;
- struct stat sys_st;
- struct cached_stat *cst;
- int rc;
+ HashTable *tbl = flags & CST_LSTAT ? &lmtimes : &mtimes;
+ struct stat sys_st;
+ struct cached_stat *cst;
+ int rc;
- if (pathname == NULL || pathname[0] == '\0')
- return -1; /* This can happen in meta mode. */
+ if (pathname == NULL || pathname[0] == '\0')
+ return -1; /* This can happen in meta mode. */
- cst = HashTable_FindValue(tbl, pathname);
- if (cst != NULL && !(flags & CST_UPDATE)) {
- *out_cst = *cst;
- DIR_DEBUG2("Using cached time %s for %s\n",
- Targ_FmtTime(cst->cst_mtime), pathname);
- return 0;
- }
+ cst = HashTable_FindValue(tbl, pathname);
+ if (cst != NULL && !(flags & CST_UPDATE)) {
+ *out_cst = *cst;
+ DIR_DEBUG2("Using cached time %s for %s\n",
+ Targ_FmtTime(cst->cst_mtime), pathname);
+ return 0;
+ }
- rc = (flags & CST_LSTAT ? lstat : stat)(pathname, &sys_st);
- if (rc == -1)
- return -1; /* don't cache negative lookups */
-
- if (sys_st.st_mtime == 0)
- sys_st.st_mtime = 1; /* avoid confusion with missing file */
-
- if (cst == NULL) {
- cst = bmake_malloc(sizeof *cst);
- HashTable_Set(tbl, pathname, cst);
- }
+ rc = (flags & CST_LSTAT ? lstat : stat)(pathname, &sys_st);
+ if (rc == -1)
+ return -1; /* don't cache negative lookups */
+
+ if (sys_st.st_mtime == 0)
+ sys_st.st_mtime = 1; /* avoid confusion with missing file */
+
+ if (cst == NULL) {
+ cst = bmake_malloc(sizeof *cst);
+ HashTable_Set(tbl, pathname, cst);
+ }
- cst->cst_mtime = sys_st.st_mtime;
- cst->cst_mode = sys_st.st_mode;
+ cst->cst_mtime = sys_st.st_mtime;
+ cst->cst_mode = sys_st.st_mode;
- *out_cst = *cst;
- DIR_DEBUG2(" Caching %s for %s\n",
- Targ_FmtTime(sys_st.st_mtime), pathname);
+ *out_cst = *cst;
+ DIR_DEBUG2(" Caching %s for %s\n",
+ Targ_FmtTime(sys_st.st_mtime), pathname);
- return 0;
+ return 0;
}
int
cached_stat(const char *pathname, struct cached_stat *cst)
{
- return cached_stats(pathname, cst, CST_NONE);
+ return cached_stats(pathname, cst, CST_NONE);
}
int
cached_lstat(const char *pathname, struct cached_stat *cst)
{
- return cached_stats(pathname, cst, CST_LSTAT);
+ return cached_stats(pathname, cst, CST_LSTAT);
}
/* Initialize the directories module. */
void
Dir_Init(void)
{
- dirSearchPath = Lst_New();
- OpenDirs_Init(&openDirs);
- HashTable_Init(&mtimes);
- HashTable_Init(&lmtimes);
+ dirSearchPath = Lst_New();
+ OpenDirs_Init(&openDirs);
+ HashTable_Init(&mtimes);
+ HashTable_Init(&lmtimes);
}
void
Dir_InitDir(const char *cdname)
{
- Dir_InitCur(cdname);
+ Dir_InitCur(cdname);
- dotLast = bmake_malloc(sizeof *dotLast);
- dotLast->refCount = 1;
- dotLast->hits = 0;
- dotLast->name = bmake_strdup(".DOTLAST");
- HashSet_Init(&dotLast->files);
+ dotLast = bmake_malloc(sizeof *dotLast);
+ dotLast->refCount = 1;
+ dotLast->hits = 0;
+ dotLast->name = bmake_strdup(".DOTLAST");
+ HashSet_Init(&dotLast->files);
}
/*
@@ -388,33 +388,33 @@ Dir_InitDir(const char *cdname)
void
Dir_InitCur(const char *cdname)
{
- CachedDir *dir;
-
- if (cdname == NULL)
- return;
+ CachedDir *dir;
- /*
- * Our build directory is not the same as our source directory.
- * Keep this one around too.
- */
- dir = Dir_AddDir(NULL, cdname);
- if (dir == NULL)
- return;
-
- /* XXX: Reference counting is wrong here.
- * If this function is called repeatedly with the same directory name,
- * its reference count increases each time even though the number of
- * actual references stays the same. */
+ if (cdname == NULL)
+ return;
- dir->refCount++;
- if (cur != NULL && cur != dir) {
/*
- * We've been here before, clean up.
+ * Our build directory is not the same as our source directory.
+ * Keep this one around too.
*/
- cur->refCount--;
- Dir_Destroy(cur);
- }
- cur = dir;
+ dir = Dir_AddDir(NULL, cdname);
+ if (dir == NULL)
+ return;
+
+ /* XXX: Reference counting is wrong here.
+ * If this function is called repeatedly with the same directory name,
+ * its reference count increases each time even though the number of
+ * actual references stays the same. */
+
+ dir->refCount++;
+ if (cur != NULL && cur != dir) {
+ /*
+ * We've been here before, clean up.
+ */
+ cur->refCount--;
+ Dir_Destroy(cur);
+ }
+ cur = dir;
}
/* (Re)initialize "dot" (current/object directory) path hash.
@@ -422,24 +422,24 @@ Dir_InitCur(const char *cdname)
void
Dir_InitDot(void)
{
- if (dot != NULL) {
- /* Remove old entry from openDirs, but do not destroy. */
- OpenDirs_Remove(&openDirs, dot->name);
- }
+ if (dot != NULL) {
+ /* Remove old entry from openDirs, but do not destroy. */
+ OpenDirs_Remove(&openDirs, dot->name);
+ }
- dot = Dir_AddDir(NULL, ".");
+ dot = Dir_AddDir(NULL, ".");
- if (dot == NULL) {
- Error("Cannot open `.' (%s)", strerror(errno));
- exit(1);
- }
+ if (dot == NULL) {
+ Error("Cannot open `.' (%s)", strerror(errno));
+ exit(1);
+ }
- /*
- * We always need to have dot around, so we increment its reference count
- * to make sure it's not destroyed.
- */
- dot->refCount++;
- Dir_SetPATH(); /* initialize */
+ /*
+ * We always need to have dot around, so we increment its reference
+ * count to make sure it's not destroyed.
+ */
+ dot->refCount++;
+ Dir_SetPATH(); /* initialize */
}
/* Clean up the directories module. */
@@ -447,18 +447,18 @@ void
Dir_End(void)
{
#ifdef CLEANUP
- if (cur) {
- cur->refCount--;
- Dir_Destroy(cur);
- }
- dot->refCount--;
- dotLast->refCount--;
- Dir_Destroy(dotLast);
- Dir_Destroy(dot);
- Dir_ClearPath(dirSearchPath);
- Lst_Free(dirSearchPath);
- OpenDirs_Done(&openDirs);
- HashTable_Done(&mtimes);
+ if (cur) {
+ cur->refCount--;
+ Dir_Destroy(cur);
+ }
+ dot->refCount--;
+ dotLast->refCount--;
+ Dir_Destroy(dotLast);
+ Dir_Destroy(dot);
+ Dir_ClearPath(dirSearchPath);
+ Lst_Free(dirSearchPath);
+ OpenDirs_Done(&openDirs);
+ HashTable_Done(&mtimes);
#endif
}
@@ -470,41 +470,41 @@ Dir_End(void)
void
Dir_SetPATH(void)
{
- CachedDirListNode *ln;
- Boolean hasLastDot = FALSE; /* true if we should search dot last */
+ CachedDirListNode *ln;
+ Boolean hasLastDot = FALSE; /* true if we should search dot last */
- Var_Delete(".PATH", VAR_GLOBAL);
+ Var_Delete(".PATH", VAR_GLOBAL);
- if ((ln = dirSearchPath->first) != NULL) {
- CachedDir *dir = ln->datum;
- if (dir == dotLast) {
- hasLastDot = TRUE;
- Var_Append(".PATH", dotLast->name, VAR_GLOBAL);
+ if ((ln = dirSearchPath->first) != NULL) {
+ CachedDir *dir = ln->datum;
+ if (dir == dotLast) {
+ hasLastDot = TRUE;
+ Var_Append(".PATH", dotLast->name, VAR_GLOBAL);
+ }
}
- }
- if (!hasLastDot) {
- if (dot)
- Var_Append(".PATH", dot->name, VAR_GLOBAL);
- if (cur)
- Var_Append(".PATH", cur->name, VAR_GLOBAL);
- }
+ if (!hasLastDot) {
+ if (dot)
+ Var_Append(".PATH", dot->name, VAR_GLOBAL);
+ if (cur)
+ Var_Append(".PATH", cur->name, VAR_GLOBAL);
+ }
- for (ln = dirSearchPath->first; ln != NULL; ln = ln->next) {
- CachedDir *dir = ln->datum;
- if (dir == dotLast)
- continue;
- if (dir == dot && hasLastDot)
- continue;
- Var_Append(".PATH", dir->name, VAR_GLOBAL);
- }
+ for (ln = dirSearchPath->first; ln != NULL; ln = ln->next) {
+ CachedDir *dir = ln->datum;
+ if (dir == dotLast)
+ continue;
+ if (dir == dot && hasLastDot)
+ continue;
+ Var_Append(".PATH", dir->name, VAR_GLOBAL);
+ }
- if (hasLastDot) {
- if (dot)
- Var_Append(".PATH", dot->name, VAR_GLOBAL);
- if (cur)
- Var_Append(".PATH", cur->name, VAR_GLOBAL);
- }
+ if (hasLastDot) {
+ if (dot)
+ Var_Append(".PATH", dot->name, VAR_GLOBAL);
+ if (cur)
+ Var_Append(".PATH", cur->name, VAR_GLOBAL);
+ }
}
/* See if the given name has any wildcard characters in it and all braces and
@@ -519,35 +519,35 @@ Dir_SetPATH(void)
Boolean
Dir_HasWildcards(const char *name)
{
- const char *p;
- Boolean wild = FALSE;
- int braces = 0, brackets = 0;
-
- for (p = name; *p != '\0'; p++) {
- switch (*p) {
- case '{':
- braces++;
- wild = TRUE;
- break;
- case '}':
- braces--;
- break;
- case '[':
- brackets++;
- wild = TRUE;
- break;
- case ']':
- brackets--;
- break;
- case '?':
- case '*':
- wild = TRUE;
- break;
- default:
- break;
+ const char *p;
+ Boolean wild = FALSE;
+ int braces = 0, brackets = 0;
+
+ for (p = name; *p != '\0'; p++) {
+ switch (*p) {
+ case '{':
+ braces++;
+ wild = TRUE;
+ break;
+ case '}':
+ braces--;
+ break;
+ case '[':
+ brackets++;
+ wild = TRUE;
+ break;
+ case ']':
+ brackets--;
+ break;
+ case '?':
+ case '*':
+ wild = TRUE;
+ break;
+ default:
+ break;
+ }
}
- }
- return wild && brackets == 0 && braces == 0;
+ return wild && brackets == 0 && braces == 0;
}
/* See if any files match the pattern and add their names to the 'expansions'
@@ -566,38 +566,42 @@ Dir_HasWildcards(const char *name)
static void
DirMatchFiles(const char *pattern, CachedDir *dir, StringList *expansions)
{
- const char *dirName = dir->name;
- Boolean isDot = dirName[0] == '.' && dirName[1] == '\0';
- HashIter hi;
-
- /* XXX: Iterating over all hash entries is inefficient. If the pattern
- * is a plain string without any wildcards, a direct lookup is faster. */
-
- HashIter_InitSet(&hi, &dir->files);
- while (HashIter_Next(&hi) != NULL) {
- const char *base = hi.entry->key;
-
- if (!Str_Match(base, pattern))
- continue;
+ const char *dirName = dir->name;
+ Boolean isDot = dirName[0] == '.' && dirName[1] == '\0';
+ HashIter hi;
/*
- * 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.
- *
- * This means that the pattern '[a-z.]*' does not find '.file', which
- * is consistent with bash, NetBSD sh and csh.
+ * XXX: Iterating over all hash entries is inefficient. If the
+ * pattern is a plain string without any wildcards, a direct lookup
+ * is faster.
*/
- if (base[0] == '.' && pattern[0] != '.')
- continue;
- {
- char *fullName = isDot
- ? bmake_strdup(base)
- : str_concat3(dirName, "/", base);
- Lst_Append(expansions, fullName);
+ HashIter_InitSet(&hi, &dir->files);
+ while (HashIter_Next(&hi) != NULL) {
+ const char *base = hi.entry->key;
+
+ if (!Str_Match(base, pattern))
+ continue;
+
+ /*
+ * 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.
+ *
+ * This means that the pattern '[a-z.]*' does not find
+ * '.file', which is consistent with bash, NetBSD sh and csh.
+ */
+ if (base[0] == '.' && pattern[0] != '.')
+ continue;
+
+ {
+ char *fullName = isDot
+ ? bmake_strdup(base)
+ : str_concat3(dirName, "/", base);
+ Lst_Append(expansions, fullName);
+ }
}
- }
}
/* Find the next closing brace in the string, taking nested braces into
@@ -605,17 +609,17 @@ DirMatchFiles(const char *pattern, Cache
static const char *
closing_brace(const char *p)
{
- int nest = 0;
- while (*p != '\0') {
- if (*p == '}' && nest == 0)
- break;
- if (*p == '{')
- nest++;
- if (*p == '}')
- nest--;
- p++;
- }
- return p;
+ int nest = 0;
+ while (*p != '\0') {
+ if (*p == '}' && nest == 0)
+ break;
+ if (*p == '{')
+ nest++;
+ if (*p == '}')
+ nest--;
+ p++;
+ }
+ return p;
}
/* Find the next closing brace or comma in the string, taking nested braces
@@ -623,45 +627,45 @@ closing_brace(const char *p)
static const char *
separator_comma(const char *p)
{
- int nest = 0;
- while (*p != '\0') {
- if ((*p == '}' || *p == ',') && nest == 0)
- break;
- if (*p == '{')
- nest++;
- if (*p == '}')
- nest--;
- p++;
- }
- return p;
+ int nest = 0;
+ while (*p != '\0') {
+ if ((*p == '}' || *p == ',') && nest == 0)
+ break;
+ if (*p == '{')
+ nest++;
+ if (*p == '}')
+ nest--;
+ p++;
+ }
+ return p;
}
static Boolean
contains_wildcard(const char *p)
{
- for (; *p != '\0'; p++) {
- switch (*p) {
- case '*':
- case '?':
- case '{':
- case '[':
- return TRUE;
+ for (; *p != '\0'; p++) {
+ switch (*p) {
+ case '*':
+ case '?':
+ case '{':
+ case '[':
+ return TRUE;
+ }
}
- }
- return FALSE;
+ return FALSE;
}
static char *
concat3(const char *a, size_t a_len, const char *b, size_t b_len,
const char *c, size_t c_len)
{
- size_t s_len = a_len + b_len + c_len;
- char *s = bmake_malloc(s_len + 1);
- memcpy(s, a, a_len);
- memcpy(s + a_len, b, b_len);
- memcpy(s + a_len + b_len, c, c_len);
- s[s_len] = '\0';
- return s;
+ size_t s_len = a_len + b_len + c_len;
+ char *s = bmake_malloc(s_len + 1);
+ memcpy(s, a, a_len);
+ memcpy(s + a_len, b, b_len);
+ memcpy(s + a_len + b_len, c, c_len);
+ s[s_len] = '\0';
+ return s;
}
/* Expand curly braces like the C shell. Brace expansion by itself is purely
@@ -683,42 +687,43 @@ static void
DirExpandCurly(const char *word, const char *brace, SearchPath *path,
StringList *expansions)
{
- const char *prefix, *middle, *piece, *middle_end, *suffix;
- size_t prefix_len, suffix_len;
+ const char *prefix, *middle, *piece, *middle_end, *suffix;
+ size_t prefix_len, suffix_len;
- /* Split the word into prefix '{' middle '}' suffix. */
-
- middle = brace + 1;
- middle_end = closing_brace(middle);
- if (*middle_end == '\0') {
- Error("Unterminated {} clause \"%s\"", middle);
- return;
- }
+ /* Split the word into prefix '{' middle '}' suffix. */
- prefix = word;
- prefix_len = (size_t)(brace - prefix);
- suffix = middle_end + 1;
- suffix_len = strlen(suffix);
-
- /* Split the middle into pieces, separated by commas. */
-
- piece = middle;
- while (piece < middle_end + 1) {
- const char *piece_end = separator_comma(piece);
- size_t piece_len = (size_t)(piece_end - piece);
-
- char *file = concat3(prefix, prefix_len, piece, piece_len,
- suffix, suffix_len);
-
- if (contains_wildcard(file)) {
- Dir_Expand(file, path, expansions);
- free(file);
- } else {
- Lst_Append(expansions, file);
+ middle = brace + 1;
+ middle_end = closing_brace(middle);
+ if (*middle_end == '\0') {
+ Error("Unterminated {} clause \"%s\"", middle);
+ return;
}
- piece = piece_end + 1; /* skip over the comma or closing brace */
- }
+ prefix = word;
+ prefix_len = (size_t)(brace - prefix);
+ suffix = middle_end + 1;
+ suffix_len = strlen(suffix);
+
+ /* Split the middle into pieces, separated by commas. */
+
+ piece = middle;
+ while (piece < middle_end + 1) {
+ const char *piece_end = separator_comma(piece);
+ size_t piece_len = (size_t)(piece_end - piece);
+
+ char *file = concat3(prefix, prefix_len, piece, piece_len,
+ suffix, suffix_len);
+
+ if (contains_wildcard(file)) {
+ Dir_Expand(file, path, expansions);
+ free(file);
+ } else {
+ Lst_Append(expansions, file);
+ }
+
+ piece = piece_end +
+ 1; /* skip over the comma or closing brace */
+ }
}
@@ -726,24 +731,24 @@ DirExpandCurly(const char *word, const c
static void
DirExpandPath(const char *word, SearchPath *path, StringList *expansions)
{
- SearchPathNode *ln;
- for (ln = path->first; ln != NULL; ln = ln->next) {
- CachedDir *dir = ln->datum;
- DirMatchFiles(word, dir, expansions);
- }
+ SearchPathNode *ln;
+ for (ln = path->first; ln != NULL; ln = ln->next) {
+ CachedDir *dir = ln->datum;
+ DirMatchFiles(word, dir, expansions);
+ }
}
static void
PrintExpansions(StringList *expansions)
{
- const char *sep = "";
- StringListNode *ln;
- for (ln = expansions->first; ln != NULL; ln = ln->next) {
- const char *word = ln->datum;
- debug_printf("%s%s", sep, word);
- sep = " ";
- }
- debug_printf("\n");
+ const char *sep = "";
+ StringListNode *ln;
+ for (ln = expansions->first; ln != NULL; ln = ln->next) {
+ const char *word = ln->datum;
+ debug_printf("%s%s", sep, word);
+ sep = " ";
+ }
+ debug_printf("\n");
}
/* Expand the given word into a list of words by globbing it, looking in the
@@ -844,18 +849,18 @@ Dir_Expand(const char *word, SearchPath
static char *
DirLookup(CachedDir *dir, const char *base)
{
- char *file; /* the current filename to check */
+ char *file; /* the current filename to check */
- DIR_DEBUG1(" %s ...\n", dir->name);
+ DIR_DEBUG1(" %s ...\n", dir->name);
- if (!HashSet_Contains(&dir->files, base))
- return NULL;
+ if (!HashSet_Contains(&dir->files, base))
+ return NULL;
- file = str_concat3(dir->name, "/", base);
- DIR_DEBUG1(" returning %s\n", file);
- dir->hits++;
- hits++;
- return file;
+ file = str_concat3(dir->name, "/", base);
+ DIR_DEBUG1(" returning %s\n", file);
+ dir->hits++;
+ hits++;
+ return file;
}
@@ -864,18 +869,18 @@ DirLookup(CachedDir *dir, const char *ba
static char *
DirLookupSubdir(CachedDir *dir, const char *name)
{
- struct cached_stat cst;
- char *file = dir == dot ? bmake_strdup(name)
- : str_concat3(dir->name, "/", name);
+ struct cached_stat cst;
+ char *file = dir == dot ? bmake_strdup(name)
+ : str_concat3(dir->name, "/", name);
- DIR_DEBUG1("checking %s ...\n", file);
+ DIR_DEBUG1("checking %s ...\n", file);
- if (cached_stat(file, &cst) == 0) {
- nearmisses++;
- return file;
- }
- free(file);
- return NULL;
+ if (cached_stat(file, &cst) == 0) {
+ nearmisses++;
+ return file;
+ }
+ free(file);
+ return NULL;
}
/* Find if the file with the given name exists in the given path.
@@ -885,31 +890,32 @@ DirLookupSubdir(CachedDir *dir, const ch
static char *
DirLookupAbs(CachedDir *dir, const char *name, const char *cp)
{
- const char *dnp; /* pointer into dir->name */
- const char *np; /* pointer into name */
+ const char *dnp; /* pointer into dir->name */
+ const char *np; /* pointer into name */
- DIR_DEBUG1(" %s ...\n", dir->name);
+ DIR_DEBUG1(" %s ...\n", dir->name);
- /*
- * If the file has a leading path component and that component
- * exactly matches the entire name of the current search
- * directory, we can attempt another cache lookup. And if we don't
- * have a hit, we can safely assume the file does not exist at all.
- */
- for (dnp = dir->name, np = name; *dnp != '\0' && *dnp == *np; dnp++, np++)
- continue;
- if (*dnp != '\0' || np != cp - 1)
- return NULL;
+ /*
+ * If the file has a leading path component and that component
+ * exactly matches the entire name of the current search
+ * directory, we can attempt another cache lookup. And if we don't
+ * have a hit, we can safely assume the file does not exist at all.
+ */
+ for (dnp = dir->name, np = name;
+ *dnp != '\0' && *dnp == *np; dnp++, np++)
+ continue;
+ if (*dnp != '\0' || np != cp - 1)
+ return NULL;
- if (!HashSet_Contains(&dir->files, cp)) {
- DIR_DEBUG0(" must be here but isn't -- returning\n");
- return bmake_strdup(""); /* to terminate the search */
- }
+ if (!HashSet_Contains(&dir->files, cp)) {
+ DIR_DEBUG0(" must be here but isn't -- returning\n");
+ return bmake_strdup(""); /* to terminate the search */
+ }
- dir->hits++;
- hits++;
- DIR_DEBUG1(" returning %s\n", name);
- return bmake_strdup(name);
+ dir->hits++;
+ hits++;
+ DIR_DEBUG1(" returning %s\n", name);
+ return bmake_strdup(name);
}
/* Find the file given on "." or curdir.
@@ -918,21 +924,21 @@ static char *
DirFindDot(const char *name, const char *base)
{
- if (HashSet_Contains(&dot->files, base)) {
- DIR_DEBUG0(" in '.'\n");
- hits++;
- dot->hits++;
- return bmake_strdup(name);
- }
+ if (HashSet_Contains(&dot->files, base)) {
+ DIR_DEBUG0(" in '.'\n");
+ hits++;
+ dot->hits++;
+ return bmake_strdup(name);
+ }
- if (cur != NULL && HashSet_Contains(&cur->files, base)) {
- DIR_DEBUG1(" in ${.CURDIR} = %s\n", cur->name);
- hits++;
- cur->hits++;
- return str_concat3(cur->name, "/", base);
- }
+ if (cur != NULL && HashSet_Contains(&cur->files, base)) {
+ DIR_DEBUG1(" in ${.CURDIR} = %s\n", cur->name);
+ hits++;
+ cur->hits++;
+ return str_concat3(cur->name, "/", base);
+ }
- return NULL;
+ return NULL;
}
/* Find the file with the given name along the given search path.
@@ -954,245 +960,247 @@ DirFindDot(const char *name, const char
char *
Dir_FindFile(const char *name, SearchPath *path)
{
- SearchPathNode *ln;
- char *file; /* the current filename to check */
- const char *base; /* Terminal name of file */
- Boolean hasLastDot = FALSE; /* true if we should search dot last */
- Boolean hasSlash; /* true if 'name' contains a / */
- struct cached_stat cst; /* Buffer for stat, if necessary */
- const char *trailing_dot = ".";
-
- /*
- * Find the final component of the name and note whether it has a
- * slash in it (the name, I mean)
- */
- base = strrchr(name, '/');
- if (base) {
- hasSlash = TRUE;
- base++;
- } else {
- hasSlash = FALSE;
- base = name;
- }
+ SearchPathNode *ln;
+ char *file; /* the current filename to check */
+ const char *base; /* Terminal name of file */
+ Boolean hasLastDot = FALSE; /* true if we should search dot last */
+ Boolean hasSlash; /* true if 'name' contains a / */
+ struct cached_stat cst; /* Buffer for stat, if necessary */
+ const char *trailing_dot = ".";
- DIR_DEBUG1("Searching for %s ...", name);
+ /*
+ * Find the final component of the name and note whether it has a
+ * slash in it (the name, I mean)
+ */
+ base = strrchr(name, '/');
+ if (base) {
+ hasSlash = TRUE;
+ base++;
+ } else {
+ hasSlash = FALSE;
+ base = name;
+ }
- if (path == NULL) {
- DIR_DEBUG0("couldn't open path, file not found\n");
- misses++;
- return NULL;
- }
+ DIR_DEBUG1("Searching for %s ...", name);
- if ((ln = path->first) != NULL) {
- CachedDir *dir = ln->datum;
- if (dir == dotLast) {
- hasLastDot = TRUE;
- DIR_DEBUG0("[dot last]...");
+ if (path == NULL) {
+ DIR_DEBUG0("couldn't open path, file not found\n");
+ misses++;
+ return NULL;
}
- }
- DIR_DEBUG0("\n");
- /*
- * If there's no leading directory components or if the leading
- * directory component is exactly `./', consult the cached contents
- * of each of the directories on the search path.
- */
- if (!hasSlash || (base - name == 2 && *name == '.')) {
+ if ((ln = path->first) != NULL) {
+ CachedDir *dir = ln->datum;
+ if (dir == dotLast) {
+ hasLastDot = TRUE;
+ DIR_DEBUG0("[dot last]...");
+ }
+ }
+ DIR_DEBUG0("\n");
+
/*
- * We look through all the directories on the path seeking one which
- * contains the final component of the given name. If such a beast
- * is found, we concatenate the directory name and the final
- * component and return the resulting string. If we don't find any
- * such thing, we go on to phase two...
- *
- * No matter what, we always look for the file in the current
- * directory before anywhere else (unless we found the magic
- * DOTLAST path, in which case we search it last) and we *do not*
- * add the ./ to it if it exists.
- * This is so there are no conflicts between what the user
- * specifies (fish.c) and what pmake finds (./fish.c).
+ * If there's no leading directory components or if the leading
+ * directory component is exactly `./', consult the cached contents
+ * of each of the directories on the search path.
*/
- if (!hasLastDot && (file = DirFindDot(name, base)) != NULL)
- return file;
+ if (!hasSlash || (base - name == 2 && *name == '.')) {
+ /*
+ * We look through all the directories on the path seeking one
+ * which contains the final component of the given name. If
+ * such a beast is found, we concatenate the directory name
+ * and the final component and return the resulting string.
+ * If we don't find any such thing, we go on to phase two.
+ *
+ * No matter what, we always look for the file in the current
+ * directory before anywhere else (unless we found the magic
+ * DOTLAST path, in which case we search it last) and we *do
+ * not* add the ./ to it if it exists.
+ * This is so there are no conflicts between what the user
+ * specifies (fish.c) and what pmake finds (./fish.c).
+ */
+ if (!hasLastDot && (file = DirFindDot(name, base)) != NULL)
+ return file;
- for (; ln != NULL; ln = ln->next) {
- CachedDir *dir = ln->datum;
- if (dir == dotLast)
- continue;
- if ((file = DirLookup(dir, base)) != NULL)
- return file;
+ for (; ln != NULL; ln = ln->next) {
+ CachedDir *dir = ln->datum;
+ if (dir == dotLast)
+ continue;
+ if ((file = DirLookup(dir, base)) != NULL)
+ return file;
+ }
+
+ if (hasLastDot && (file = DirFindDot(name, base)) != NULL)
+ return file;
}
- if (hasLastDot && (file = DirFindDot(name, base)) != NULL)
- return file;
- }
+ /*
+ * We didn't find the file on any directory in the search path.
+ * If the name doesn't contain a slash, that means it doesn't exist.
+ * If it *does* contain a slash, however, there is still hope: it
+ * could be in a subdirectory of one of the members of the search
+ * path. (eg. /usr/include and sys/types.h. The above search would
+ * fail to turn up types.h in /usr/include, but it *is* in
+ * /usr/include/sys/types.h).
+ * [ This no longer applies: If we find such a beast, we assume there
+ * will be more (what else can we assume?) and add all but the last
+ * component of the resulting name onto the search path (at the
+ * end).]
+ * This phase is only performed if the file is *not* absolute.
+ */
+ if (!hasSlash) {
+ DIR_DEBUG0(" failed.\n");
+ misses++;
+ return NULL;
+ }
- /*
- * We didn't find the file on any directory in the search path.
- * If the name doesn't contain a slash, that means it doesn't exist.
- * If it *does* contain a slash, however, there is still hope: it
- * could be in a subdirectory of one of the members of the search
- * path. (eg. /usr/include and sys/types.h. The above search would
- * fail to turn up types.h in /usr/include, but it *is* in
- * /usr/include/sys/types.h).
- * [ This no longer applies: If we find such a beast, we assume there
- * will be more (what else can we assume?) and add all but the last
- * component of the resulting name onto the search path (at the
- * end).]
- * This phase is only performed if the file is *not* absolute.
- */
- if (!hasSlash) {
- DIR_DEBUG0(" failed.\n");
- misses++;
- return NULL;
- }
+ if (*base == '\0') {
+ /* we were given a trailing "/" */
+ base = trailing_dot;
+ }
+
+ if (name[0] != '/') {
+ Boolean checkedDot = FALSE;
+
+ DIR_DEBUG0(" Trying subdirectories...\n");
+
+ if (!hasLastDot) {
+ if (dot) {
+ checkedDot = TRUE;
+ if ((file = DirLookupSubdir(dot, name)) != NULL)
+ return file;
+ }
+ if (cur && (file = DirLookupSubdir(cur, name)) != NULL)
+ return file;
+ }
- if (*base == '\0') {
- /* we were given a trailing "/" */
- base = trailing_dot;
- }
+ 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 (name[0] != '/') {
- Boolean checkedDot = FALSE;
+ if (hasLastDot) {
+ if (dot && !checkedDot) {
+ checkedDot = TRUE;
+ if ((file = DirLookupSubdir(dot, name)) != NULL)
+ return file;
+ }
+ if (cur && (file = DirLookupSubdir(cur, name)) != NULL)
+ return file;
+ }
- DIR_DEBUG0(" Trying subdirectories...\n");
+ if (checkedDot) {
+ /*
+ * Already checked by the given name, since . was in
+ * the path, so no point in proceeding.
+ */
+ DIR_DEBUG0(" Checked . already, returning NULL\n");
+ return NULL;
+ }
- if (!hasLastDot) {
- if (dot) {
- checkedDot = TRUE;
- if ((file = DirLookupSubdir(dot, name)) != NULL)
- return file;
- }
- if (cur && (file = DirLookupSubdir(cur, name)) != NULL)
- return file;
- }
+ } else { /* name[0] == '/' */
- 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;
- }
+ /*
+ * 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.
+ */
+ DIR_DEBUG0(" Trying exact path matches...\n");
- if (hasLastDot) {
- if (dot && !checkedDot) {
- checkedDot = TRUE;
- if ((file = DirLookupSubdir(dot, name)) != NULL)
- return file;
- }
- if (cur && (file = DirLookupSubdir(cur, name)) != NULL)
- return file;
- }
+ if (!hasLastDot && cur &&
+ ((file = DirLookupAbs(cur, name, base)) != NULL)) {
+ if (file[0] == '\0') {
+ free(file);
+ return NULL;
+ }
+ return file;
+ }
- if (checkedDot) {
- /*
- * Already checked by the given name, since . was in the path,
- * so no point in proceeding...
- */
- DIR_DEBUG0(" Checked . already, returning NULL\n");
- return NULL;
- }
+ 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;
+ }
+ }
- } else { /* name[0] == '/' */
+ if (hasLastDot && cur &&
+ ((file = DirLookupAbs(cur, name, base)) != NULL)) {
+ if (file[0] == '\0') {
+ free(file);
+ return NULL;
+ }
+ return file;
+ }
+ }
/*
- * 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.
+ * Didn't find it that way, either. Sigh. Phase 3. Add its directory
+ * onto the search path in any case, just in case, then look for the
+ * thing in the hash table. If we find it, grand. We return a new
+ * copy of the name. Otherwise we sadly return a NULL pointer. Sigh.
+ * Note that if the directory holding the file doesn't exist, this
+ * will do an extra search of the final directory on the path. Unless
+ * something weird happens, this search won't succeed and life will
+ * be groovy.
+ *
+ * Sigh. We cannot add the directory onto the search path because
+ * of this amusing case:
+ * $(INSTALLDIR)/$(FILE): $(FILE)
+ *
+ * $(FILE) exists in $(INSTALLDIR) but not in the current one.
+ * When searching for $(FILE), we will find it in $(INSTALLDIR)
+ * b/c we added it here. This is not good...
*/
- DIR_DEBUG0(" Trying exact path matches...\n");
-
- if (!hasLastDot && cur &&
- ((file = DirLookupAbs(cur, name, base)) != NULL)) {
- if (file[0] == '\0') {
- free(file);
+#if 0
+ if (base == trailing_dot) {
+ base = strrchr(name, '/');
+ base++;
+ }
+ base[-1] = '\0';
+ (void)Dir_AddDir(path, name);
+ base[-1] = '/';
+
+ bigmisses++;
+ ln = Lst_Last(path);
+ if (ln == NULL) {
return NULL;
- }
- 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;
- }
+ } else {
+ dir = LstNode_Datum(ln);
}
- if (hasLastDot && cur &&
- ((file = DirLookupAbs(cur, name, base)) != NULL)) {
- if (file[0] == '\0') {
- free(file);
+ if (Hash_FindEntry(&dir->files, base) != NULL) {
+ return bmake_strdup(name);
+ } else {
return NULL;
- }
- return file;
}
- }
-
- /*
- * Didn't find it that way, either. Sigh. Phase 3. Add its directory
- * onto the search path in any case, just in case, then look for the
- * thing in the hash table. If we find it, grand. We return a new
- * copy of the name. Otherwise we sadly return a NULL pointer. Sigh.
- * Note that if the directory holding the file doesn't exist, this will
- * do an extra search of the final directory on the path. Unless something
- * weird happens, this search won't succeed and life will be groovy.
- *
- * Sigh. We cannot add the directory onto the search path because
- * of this amusing case:
- * $(INSTALLDIR)/$(FILE): $(FILE)
- *
- * $(FILE) exists in $(INSTALLDIR) but not in the current one.
- * When searching for $(FILE), we will find it in $(INSTALLDIR)
- * b/c we added it here. This is not good...
- */
-#if 0
- if (base == trailing_dot) {
- base = strrchr(name, '/');
- base++;
- }
- base[-1] = '\0';
- (void)Dir_AddDir(path, name);
- base[-1] = '/';
-
- bigmisses++;
- ln = Lst_Last(path);
- if (ln == NULL) {
- return NULL;
- } else {
- dir = LstNode_Datum(ln);
- }
-
- if (Hash_FindEntry(&dir->files, base) != NULL) {
- return bmake_strdup(name);
- } else {
- return NULL;
- }
#else
- DIR_DEBUG1(" Looking for \"%s\" ...\n", name);
+ DIR_DEBUG1(" Looking for \"%s\" ...\n", name);
- bigmisses++;
- if (cached_stat(name, &cst) == 0) {
- return bmake_strdup(name);
- }
+ bigmisses++;
+ if (cached_stat(name, &cst) == 0) {
+ return bmake_strdup(name);
+ }
- DIR_DEBUG0(" failed. Returning NULL\n");
- return NULL;
+ DIR_DEBUG0(" failed. Returning NULL\n");
+ return NULL;
#endif
}
@@ -1210,54 +1218,54 @@ Dir_FindFile(const char *name, SearchPat
char *
Dir_FindHereOrAbove(const char *here, const char *search_path)
{
- struct cached_stat cst;
- char *dirbase, *dirbase_end;
- char *try, *try_end;
-
- /* copy out our starting point */
- dirbase = bmake_strdup(here);
- dirbase_end = dirbase + strlen(dirbase);
-
- /* loop until we determine a result */
- for (;;) {
-
- /* try and stat(2) it ... */
- try = str_concat3(dirbase, "/", search_path);
- if (cached_stat(try, &cst) != -1) {
- /*
- * success! if we found a file, chop off
- * the filename so we return a directory.
- */
- if ((cst.cst_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! */
- }
+ struct cached_stat cst;
+ char *dirbase, *dirbase_end;
+ char *try, *try_end;
+
+ /* copy out our starting point */
+ dirbase = bmake_strdup(here);
+ dirbase_end = dirbase + strlen(dirbase);
+
+ /* loop until we determine a result */
+ for (;;) {
+
+ /* try and stat(2) it ... */
+ try = str_concat3(dirbase, "/", search_path);
+ if (cached_stat(try, &cst) != -1) {
+ /*
+ * success! if we found a file, chop off
+ * the filename so we return a directory.
+ */
+ if ((cst.cst_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! */
+ }
- free(dirbase);
- return try;
- }
- free(try);
+ free(dirbase);
+ return try;
+ }
+ free(try);
- /*
- * nope, we didn't find it. if we used up dirbase we've
- * reached the root and failed.
- */
- if (dirbase_end == dirbase)
- break; /* failed! */
+ /*
+ * nope, we didn't find it. if we used up dirbase we've
+ * reached the root and failed.
+ */
+ if (dirbase_end == dirbase)
+ break; /* failed! */
- /*
- * truncate dirbase from the end to move up a dir
- */
- while (dirbase_end > dirbase && *dirbase_end != '/')
- dirbase_end--;
- *dirbase_end = '\0'; /* chop! */
- }
+ /*
+ * truncate dirbase from the end to move up a dir
+ */
+ while (dirbase_end > dirbase && *dirbase_end != '/')
+ dirbase_end--;
+ *dirbase_end = '\0'; /* chop! */
+ }
- free(dirbase);
- return NULL;
+ free(dirbase);
+ return NULL;
}
/* Search gn along dirSearchPath and store its modification time in gn->mtime.
@@ -1355,63 +1363,62 @@ Dir_UpdateMTime(GNode *gn, Boolean reche
CachedDir *
Dir_AddDir(SearchPath *path, const char *name)
{
- CachedDir *dir = NULL; /* the added directory */
- DIR *d;
- struct dirent *dp;
-
- if (path != NULL && strcmp(name, ".DOTLAST") == 0) {
- SearchPathNode *ln;
+ CachedDir *dir = NULL; /* the added directory */
+ DIR *d;
+ struct dirent *dp;
+
+ if (path != NULL && strcmp(name, ".DOTLAST") == 0) {
+ SearchPathNode *ln;
+
+ /* XXX: Linear search gets slow with thousands of entries. */
+ for (ln = path->first; ln != NULL; ln = ln->next) {
+ CachedDir *pathDir = ln->datum;
+ if (strcmp(pathDir->name, name) == 0)
+ return pathDir;
+ }
- /* XXX: Linear search gets slow with thousands of entries. */
- for (ln = path->first; ln != NULL; ln = ln->next) {
- CachedDir *pathDir = ln->datum;
- if (strcmp(pathDir->name, name) == 0)
- return pathDir;
+ dotLast->refCount++;
+ Lst_Prepend(path, dotLast);
}
- dotLast->refCount++;
- Lst_Prepend(path, dotLast);
- }
-
- if (path != NULL)
- dir = OpenDirs_Find(&openDirs, name);
- if (dir != NULL) {
- if (Lst_FindDatum(path, dir) == NULL) {
- dir->refCount++;
- Lst_Append(path, dir);
+ if (path != NULL)
+ dir = OpenDirs_Find(&openDirs, name);
+ if (dir != NULL) {
+ if (Lst_FindDatum(path, dir) == NULL) {
+ dir->refCount++;
+ Lst_Append(path, dir);
+ }
+ return dir;
}
- return dir;
- }
- DIR_DEBUG1("Caching %s ...", name);
+ DIR_DEBUG1("Caching %s ...", name);
- if ((d = opendir(name)) != NULL) {
- dir = bmake_malloc(sizeof *dir);
- dir->name = bmake_strdup(name);
- dir->hits = 0;
- dir->refCount = 1;
- HashSet_Init(&dir->files);
+ if ((d = opendir(name)) != NULL) {
+ dir = bmake_malloc(sizeof *dir);
+ dir->name = bmake_strdup(name);
+ dir->hits = 0;
+ dir->refCount = 1;
+ HashSet_Init(&dir->files);
- while ((dp = readdir(d)) != NULL) {
+ while ((dp = readdir(d)) != NULL) {
#if defined(sun) && defined(d_ino) /* d_ino is a sunos4 #define for d_fileno */
- /*
- * The sun directory library doesn't check for a 0 inode
- * (0-inode slots just take up space), so we have to do
- * it ourselves.
- */
- if (dp->d_fileno == 0) {
- continue;
- }
+ /*
+ * The sun directory library doesn't check for a 0 inode
+ * (0-inode slots just take up space), so we have to do
+ * it ourselves.
+ */
+ if (dp->d_fileno == 0)
+ continue;
#endif /* sun && d_ino */
- (void)HashSet_Add(&dir->files, dp->d_name);
+ (void)HashSet_Add(&dir->files, dp->d_name);
+ }
+ (void)closedir(d);
+ OpenDirs_Add(&openDirs, dir);
+ if (path != NULL)
+ Lst_Append(path, dir);
}
- (void)closedir(d);
- OpenDirs_Add(&openDirs, dir);
- if (path != NULL)
- Lst_Append(path, dir);
- }
- DIR_DEBUG0("done\n");
- return dir;
+ DIR_DEBUG0("done\n");
+ return dir;
}
/* Return a copy of dirSearchPath, incrementing the reference counts for
@@ -1419,14 +1426,14 @@ Dir_AddDir(SearchPath *path, const char
SearchPath *
Dir_CopyDirSearchPath(void)
{
- SearchPath *path = Lst_New();
- SearchPathNode *ln;
- for (ln = dirSearchPath->first; ln != NULL; ln = ln->next) {
- CachedDir *dir = ln->datum;
- dir->refCount++;
- Lst_Append(path, dir);
- }
- return path;
+ SearchPath *path = Lst_New();
+ SearchPathNode *ln;
+ for (ln = dirSearchPath->first; ln != NULL; ln = ln->next) {
+ CachedDir *dir = ln->datum;
+ dir->refCount++;
+ Lst_Append(path, dir);
+ }
+ return path;
}
/*-
@@ -1453,21 +1460,21 @@ Dir_CopyDirSearchPath(void)
char *
Dir_MakeFlags(const char *flag, SearchPath *path)
{
- Buffer buf;
- SearchPathNode *ln;
+ Buffer buf;
+ SearchPathNode *ln;
- Buf_Init(&buf);
+ Buf_Init(&buf);
- if (path != NULL) {
- for (ln = path->first; ln != NULL; ln = ln->next) {
- CachedDir *dir = ln->datum;
- Buf_AddStr(&buf, " ");
- Buf_AddStr(&buf, flag);
- Buf_AddStr(&buf, dir->name);
+ if (path != NULL) {
+ for (ln = path->first; ln != NULL; ln = ln->next) {
+ CachedDir *dir = ln->datum;
+ Buf_AddStr(&buf, " ");
+ Buf_AddStr(&buf, flag);
+ Buf_AddStr(&buf, dir->name);
+ }
}
- }
- return Buf_Destroy(&buf, FALSE);
+ return Buf_Destroy(&buf, FALSE);
}
/* Nuke a directory descriptor, if possible. Callback procedure for the
@@ -1479,16 +1486,16 @@ Dir_MakeFlags(const char *flag, SearchPa
void
Dir_Destroy(void *dirp)
{
- CachedDir *dir = dirp;
- dir->refCount--;
+ CachedDir *dir = dirp;
+ dir->refCount--;
- if (dir->refCount == 0) {
- OpenDirs_Remove(&openDirs, dir->name);
+ if (dir->refCount == 0) {
+ OpenDirs_Remove(&openDirs, dir->name);
- HashSet_Done(&dir->files);
- free(dir->name);
- free(dir);
- }
+ HashSet_Done(&dir->files);
+ free(dir->name);
+ free(dir);
+ }
}
/* Clear out all elements from the given search path.
@@ -1496,10 +1503,10 @@ Dir_Destroy(void *dirp)
void
Dir_ClearPath(SearchPath *path)
{
- while (!Lst_IsEmpty(path)) {
- CachedDir *dir = Lst_Dequeue(path);
- Dir_Destroy(dir);
- }
+ while (!Lst_IsEmpty(path)) {
+ CachedDir *dir = Lst_Dequeue(path);
+ Dir_Destroy(dir);
+ }
}
@@ -1508,48 +1515,49 @@ Dir_ClearPath(SearchPath *path)
void
Dir_Concat(SearchPath *dst, SearchPath *src)
{
- SearchPathNode *ln;
+ SearchPathNode *ln;
- for (ln = src->first; ln != NULL; ln = ln->next) {
- CachedDir *dir = ln->datum;
- if (Lst_FindDatum(dst, dir) == NULL) {
- dir->refCount++;
- Lst_Append(dst, dir);
+ for (ln = src->first; ln != NULL; ln = ln->next) {
+ CachedDir *dir = ln->datum;
+ if (Lst_FindDatum(dst, dir) == NULL) {
+ dir->refCount++;
+ Lst_Append(dst, dir);
+ }
}
- }
}
static int
percentage(int num, int den)
{
- return den != 0 ? num * 100 / den : 0;
+ return den != 0 ? num * 100 / den : 0;
}
/********** DEBUG INFO **********/
void
Dir_PrintDirectories(void)
{
- CachedDirListNode *ln;
+ CachedDirListNode *ln;
- debug_printf("#*** Directory Cache:\n");
- debug_printf("# Stats: %d hits %d misses %d near misses %d losers (%d%%)\n",
- hits, misses, nearmisses, bigmisses,
- percentage(hits, hits + bigmisses + nearmisses));
- debug_printf("# %-20s referenced\thits\n", "directory");
-
- for (ln = openDirs.list->first; ln != NULL; ln = ln->next) {
- CachedDir *dir = ln->datum;
- debug_printf("# %-20s %10d\t%4d\n", dir->name, dir->refCount,
- dir->hits);
- }
+ debug_printf("#*** Directory Cache:\n");
+ debug_printf(
+ "# Stats: %d hits %d misses %d near misses %d losers (%d%%)\n",
+ hits, misses, nearmisses, bigmisses,
+ percentage(hits, hits + bigmisses + nearmisses));
+ debug_printf("# %-20s referenced\thits\n", "directory");
+
+ for (ln = openDirs.list->first; ln != NULL; ln = ln->next) {
+ CachedDir *dir = ln->datum;
+ debug_printf("# %-20s %10d\t%4d\n",
+ dir->name, dir->refCount, dir->hits);
+ }
}
void
Dir_PrintPath(SearchPath *path)
{
- SearchPathNode *node;
- for (node = path->first; node != NULL; node = node->next) {
- const CachedDir *dir = node->datum;
- debug_printf("%s ", dir->name);
- }
+ SearchPathNode *node;
+ for (node = path->first; node != NULL; node = node->next) {
+ const CachedDir *dir = node->datum;
+ debug_printf("%s ", dir->name);
+ }
}