Module Name: othersrc Committed By: dholland Date: Sat Mar 23 19:29:31 UTC 2013
Modified Files: othersrc/usr.bin/dholland-make2: dir.c Log Message: Remove another linked list. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 othersrc/usr.bin/dholland-make2/dir.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: othersrc/usr.bin/dholland-make2/dir.c diff -u othersrc/usr.bin/dholland-make2/dir.c:1.5 othersrc/usr.bin/dholland-make2/dir.c:1.6 --- othersrc/usr.bin/dholland-make2/dir.c:1.5 Tue Mar 5 03:32:08 2013 +++ othersrc/usr.bin/dholland-make2/dir.c Sat Mar 23 19:29:30 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: dir.c,v 1.5 2013/03/05 03:32:08 dholland Exp $ */ +/* $NetBSD: dir.c,v 1.6 2013/03/23 19:29:30 dholland Exp $ */ /* * Copyright (c) 1988, 1989, 1990 The Regents of the University of California. @@ -137,7 +137,7 @@ #include "hash.h" #include "dir.h" -__RCSID("$NetBSD: dir.c,v 1.5 2013/03/05 03:32:08 dholland Exp $"); +__RCSID("$NetBSD: dir.c,v 1.6 2013/03/23 19:29:30 dholland Exp $"); /* * A search path consists of a list of Path structures. A Path structure @@ -209,9 +209,11 @@ __RCSID("$NetBSD: dir.c,v 1.5 2013/03/05 * in a cache for when Dir_MTime was actually called. */ -struct patharray dirSearchPath; /* main search path */ +/* main search path */ +struct patharray dirSearchPath; -static Lst openDirectories; /* the list of all open directories */ +/* all open directories */ +static struct patharray openDirectories; /* * Variables for gathering statistics on the efficiency of the hashing @@ -258,7 +260,7 @@ void Dir_Init(const char *cdname) { patharray_init(&dirSearchPath); - openDirectories = Lst_Init(FALSE); + patharray_init(&openDirectories); Hash_InitTable(&mtimes, 0); Dir_InitCur(cdname); @@ -313,11 +315,8 @@ void Dir_InitDot(void) { if (dot != NULL) { - LstNode ln; - /* Remove old entry from openDirectories, but do not destroy. */ - ln = Lst_Member(openDirectories, dot); - (void)Lst_Remove(openDirectories, ln); + patharray_removeval(&openDirectories, dot); } dot = Dir_AddDir(NULL, "."); @@ -359,10 +358,10 @@ Dir_End(void) dotLast->refCount -= 1; Dir_Destroy(dotLast); Dir_Destroy(dot); - Dir_ClearPath(dirSearchPath); - Lst_Destroy(dirSearchPath, NULL); - Dir_ClearPath(openDirectories); - Lst_Destroy(openDirectories, NULL); + Dir_ClearPath(&dirSearchPath); + patharray_cleanup(&dirSearchPath); + Dir_ClearPath(&openDirectories); + patharray_cleanup(&openDirectories); Hash_DeleteTable(&mtimes); #endif } @@ -415,30 +414,9 @@ Dir_SetPATH(void) } } -/*- - *----------------------------------------------------------------------- - * DirFindName -- - * See if the Path structure describes the same directory as the - * given one by comparing their names. Called from Dir_AddDir via - * Lst_Find when searching the list of open directories. - * - * Input: - * p Current name - * dname Desired name - * - * Results: - * 0 if it is the same. Non-zero otherwise - * - * Side Effects: - * None - *----------------------------------------------------------------------- +/* + * Look up a Path structure by name in an array of them. */ -static int -DirFindName(const void *p, const void *dname) -{ - return (strcmp(((const Path *)p)->name, dname)); -} - static Path * DirFind(const struct patharray *path, const char *name) { @@ -1506,9 +1484,7 @@ Dir_MTime(GNode *gn, Boolean recheck) /*- *----------------------------------------------------------------------- * Dir_AddDir -- - * Add the given name to the end of the given path. The order of - * the arguments is backwards so ParseDoDependency can do a - * Lst_ForEach of its list of paths... + * Add the given name to the end of the given path. * * Input: * path the path to which the directory should be @@ -1526,7 +1502,6 @@ Dir_MTime(GNode *gn, Boolean recheck) Path * Dir_AddDir(struct patharray *path, const char *name) { - LstNode ln = NULL; /* node in case Path structure is found */ Path *p; /* pointer to new Path structure */ DIR *d; /* for reading directory */ struct dirent *dp; /* entry in directory */ @@ -1542,12 +1517,9 @@ Dir_AddDir(struct patharray *path, const } } - p = NULL; + p = (path == NULL) ? NULL : DirFind(&openDirectories, name); - if (path) - ln = Lst_Find(openDirectories, name, DirFindName); - if (ln != NULL) { - p = (Path *)Lst_Datum(ln); + if (p != NULL) { if (path && !patharray_contains(path, p)) { p->refCount += 1; patharray_add(path, p, NULL); @@ -1578,7 +1550,7 @@ Dir_AddDir(struct patharray *path, const (void)Hash_CreateEntry(&p->files, dp->d_name, NULL); } (void)closedir(d); - (void)Lst_AtEnd(openDirectories, p); + patharray_add(&openDirectories, p, NULL); if (path != NULL) patharray_add(path, p, NULL); } @@ -1677,11 +1649,7 @@ Dir_Destroy(Path *p) p->refCount -= 1; if (p->refCount == 0) { - LstNode ln; - - ln = Lst_Member(openDirectories, p); - (void)Lst_Remove(openDirectories, ln); - + patharray_removeval(&openDirectories, p); Hash_DeleteTable(&p->files); free(p->name); free(p); @@ -1756,8 +1724,8 @@ Dir_Concat(struct patharray *path1, cons void Dir_PrintDirectories(void) { - LstNode ln; Path *p; + unsigned i, num; fprintf(debug_file, "#*** Directory Cache:\n"); fprintf(debug_file, "# Stats: %d hits %d misses %d near misses %d losers (%d%%)\n", @@ -1765,12 +1733,11 @@ Dir_PrintDirectories(void) (hits+bigmisses+nearmisses ? hits * 100 / (hits + bigmisses + nearmisses) : 0)); fprintf(debug_file, "# %-20s referenced\thits\n", "directory"); - if (Lst_Open(openDirectories) == SUCCESS) { - while ((ln = Lst_Next(openDirectories)) != NULL) { - p = (Path *)Lst_Datum(ln); - fprintf(debug_file, "# %-20s %10d\t%4d\n", p->name, p->refCount, p->hits); - } - Lst_Close(openDirectories); + num = patharray_num(&openDirectories); + for (i=0; i<num; i++) { + p = patharray_get(&openDirectories, i); + fprintf(debug_file, "# %-20s %10d\t%4d\n", + p->name, p->refCount, p->hits); } }