Merged in three patches to cleanup the code by Harti.
authorMax Okumoto <okumoto@dragonflybsd.org>
Wed, 23 Feb 2005 10:02:27 +0000 (10:02 +0000)
committerMax Okumoto <okumoto@dragonflybsd.org>
Wed, 23 Feb 2005 10:02:27 +0000 (10:02 +0000)
o Invent the LST_FOREACH macro for looping through a list. In
  contrast to the Lst_ForEach function this macro reduces the number
  of function calls per invocation by N + 1 (where N is the number
  of list elements) and increases code locality thereby increasing
  readability and (maybe) performance.

o Use the new LST_FOREACH macro throughout the file and replace
  calls to Lst_ForEach and Lst_Find.

o Fix the prototypes by addings some constness.

Date: 2005/02/22 07:58:53
Date: 2005/02/22 08:00:06
Date: 2005/02/22 08:17:05
Author: harti
Taken-from: FreeBSD

usr.bin/make/dir.c
usr.bin/make/dir.h
usr.bin/make/lst.h

index 538b8fe..6cae360 100644 (file)
@@ -38,7 +38,7 @@
  *
  * @(#)dir.c   8.2 (Berkeley) 1/2/94
  * $FreeBSD: src/usr.bin/make/dir.c,v 1.47 2005/02/04 07:50:59 harti Exp $
- * $DragonFly: src/usr.bin/make/dir.c,v 1.31 2005/02/15 01:01:18 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/dir.c,v 1.32 2005/02/23 10:02:27 okumoto Exp $
  */
 
 /*-
@@ -199,9 +199,6 @@ static Path *dot;       /* contents of current directory */
  */
 static Hash_Table mtimes;
 
-static int DirPrintWord(void *, void *);
-static int DirPrintDir(void *, void *);
-
 /*-
  *-----------------------------------------------------------------------
  * Dir_Init --
@@ -250,27 +247,6 @@ Dir_InitDot(void)
        dot->refCount += 1;
 }
 
-/*-
- *-----------------------------------------------------------------------
- * 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.
- *
- * Results:
- *     0 if it is the same. Non-zero otherwise
- *
- * Side Effects:
- *     None
- *-----------------------------------------------------------------------
- */
-static int
-DirFindName(const void *p, const void *dname)
-{
-
-       return (strcmp(((const Path *)p)->name, dname));
-}
-
 /*-
  *-----------------------------------------------------------------------
  * Dir_HasWildcards  --
@@ -486,37 +462,14 @@ DirExpandCurly(const char *word, const char *brace, Lst *path, Lst *expansions)
  *-----------------------------------------------------------------------
  */
 static void
-DirExpandInt(const char *word, Lst *path, Lst *expansions)
+DirExpandInt(const char *word, const Lst *path, Lst *expansions)
 {
        LstNode *ln;        /* Current node */
 
-       for (ln = Lst_First(path); ln != NULL; ln = Lst_Succ(ln))
+       LST_FOREACH(ln, path)
                DirMatchFiles(word, (Path *)Lst_Datum(ln), expansions);
 }
 
-/*-
- *-----------------------------------------------------------------------
- * DirPrintWord --
- *     Print a word in the list of expansions. Callback for Dir_Expand
- *     when DEBUG(DIR), via Lst_ForEach.
- *
- * Results:
- *     === 0
- *
- * Side Effects:
- *     The passed word is printed, followed by a space.
- *
- *-----------------------------------------------------------------------
- */
-static int
-DirPrintWord(void *word, void *dummy __unused)
-{
-
-       DEBUGF(DIR, ("%s ", (char *)word));
-
-       return (0);
-}
-
 /*-
  *-----------------------------------------------------------------------
  * Dir_Expand  --
@@ -534,6 +487,7 @@ DirPrintWord(void *word, void *dummy __unused)
 void
 Dir_Expand(char *word, Lst *path, Lst *expansions)
 {
+       LstNode *ln;
        char *cp;
 
        DEBUGF(DIR, ("expanding \"%s\"...", word));
@@ -629,7 +583,8 @@ Dir_Expand(char *word, Lst *path, Lst *expansions)
                }
        }
        if (DEBUG(DIR)) {
-               Lst_ForEach(expansions, DirPrintWord, (void *)NULL);
+               LST_FOREACH(ln, expansions)
+                       DEBUGF(DIR, ("%s ", (const char *)Lst_Datum(ln)));
                DEBUGF(DIR, ("\n"));
        }
 }
@@ -701,7 +656,7 @@ Dir_FindFile(char *name, Lst *path)
         * and return the resulting string. If we don't find any such thing,
         * we go on to phase two...
         */
-       for (ln = Lst_First(path); ln != NULL; ln = Lst_Succ(ln)) {
+       LST_FOREACH(ln, path) {
                p = Lst_Datum(ln);
                DEBUGF(DIR, ("%s...", p->name));
                if (Hash_FindEntry(&p->files, cp) != NULL) {
@@ -780,7 +735,7 @@ Dir_FindFile(char *name, Lst *path)
                Boolean checkedDot = FALSE;
 
                DEBUGF(DIR, ("failed. Trying subdirectories..."));
-               for (ln = Lst_First(path); ln != NULL; ln = Lst_Succ(ln)) {
+               LST_FOREACH(ln, path) {
                        p = Lst_Datum(ln);
                        if (p != dot) {
                                file = str_concat(p->name, name, STR_ADDSLASH);
@@ -983,7 +938,9 @@ Dir_AddDir(Lst *path, const char *name)
        DIR *d;                 /* for reading directory */
        struct dirent *dp;      /* entry in directory */
 
-       ln = Lst_Find(&openDirectories, name, DirFindName);
+       LST_FOREACH(ln, &openDirectories)
+               if (strcmp(((const Path *)Lst_Datum(ln))->name, name) == 0)
+                       break;
        if (ln != NULL) {
                p = Lst_Datum(ln);
                if (Lst_Member(path, p) == NULL) {
@@ -1075,7 +1032,7 @@ Dir_CopyDir(void *p)
  *-----------------------------------------------------------------------
  */
 char *
-Dir_MakeFlags(const char *flag, Lst *path)
+Dir_MakeFlags(const char *flag, const Lst *path)
 {
        char *str;      /* the string which will be returned */
        char *tstr;     /* the current directory preceded by 'flag' */
@@ -1085,7 +1042,7 @@ Dir_MakeFlags(const char *flag, Lst *path)
 
        str = estrdup("");
 
-       for (ln = Lst_First(path); ln != NULL; ln = Lst_Succ(ln)) {
+       LST_FOREACH(ln, path) {
                p = Lst_Datum(ln);
                tstr = str_concat(flag, p->name, 0);
                nstr = str_concat(str, tstr, STR_ADDSPACE);
@@ -1177,7 +1134,7 @@ Dir_Concat(Lst *path1, Lst *path2)
        LstNode *ln;
        Path *p;
 
-       for (ln = Lst_First(path2); ln != NULL; ln = Lst_Succ(ln)) {
+       LST_FOREACH(ln, path2) {
                p = Lst_Datum(ln);
                if (Lst_Member(path1, p) == NULL) {
                        p->refCount += 1;
@@ -1190,8 +1147,8 @@ Dir_Concat(Lst *path1, Lst *path2)
 void
 Dir_PrintDirectories(void)
 {
-       LstNode *ln;
-       Path *p;
+       const LstNode *ln;
+       const Path *p;
 
        printf("#*** Directory Cache:\n");
        printf("# Stats: %d hits %d misses %d near misses %d losers (%d%%)\n",
@@ -1199,24 +1156,17 @@ Dir_PrintDirectories(void)
            (hits + bigmisses + nearmisses ?
            hits * 100 / (hits + bigmisses + nearmisses) : 0));
        printf("# %-20s referenced\thits\n", "directory");
-       for (ln = Lst_First(&openDirectories); ln != NULL; ln = Lst_Succ(ln)) {
+       LST_FOREACH(ln, &openDirectories) {
                p = Lst_Datum(ln);
                printf("# %-20s %10d\t%4d\n", p->name, p->refCount, p->hits);
        }
 }
 
-static int
-DirPrintDir(void *p, void *dummy __unused)
-{
-
-       printf("%s ", ((Path *)p)->name);
-
-       return (0);
-}
-
 void
-Dir_PrintPath(Lst *path)
+Dir_PrintPath(const Lst *path)
 {
+       const LstNode *ln;
 
-       Lst_ForEach(path, DirPrintDir, (void *)NULL);
+       LST_FOREACH(ln, path)
+               printf("%s ", ((const Path *)Lst_Datum(ln))->name);
 }
index 1a5a8b8..d3326e0 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     from: @(#)dir.h 8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/make/dir.h,v 1.18 2005/02/04 07:50:59 harti Exp $
- * $DragonFly: src/usr.bin/make/dir.h,v 1.15 2005/02/15 01:01:18 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/dir.h,v 1.16 2005/02/23 10:02:27 okumoto Exp $
  */
 
 #ifndef dir_h_6002e3b8
@@ -64,11 +64,11 @@ void Dir_Expand(char *, struct Lst *, struct Lst *);
 char *Dir_FindFile(char *, struct Lst *);
 int Dir_MTime(struct GNode *);
 void Dir_AddDir(struct Lst *, const char *);
-char *Dir_MakeFlags(const char *, struct Lst *);
+char *Dir_MakeFlags(const char *, const struct Lst *);
 void Dir_ClearPath(struct Lst *);
 void Dir_Concat(struct Lst *, struct Lst *);
 void Dir_PrintDirectories(void);
-void Dir_PrintPath(struct Lst *);
+void Dir_PrintPath(const struct Lst *);
 void Dir_Destroy(void *);
 void *Dir_CopyDir(void *);
 
index 4fb18f3..e42de78 100644 (file)
@@ -38,7 +38,7 @@
  *
  *     from: @(#)lst.h 8.1 (Berkeley) 6/6/93
  * $FreeBSD: src/usr.bin/make/lst.h,v 1.28 2005/02/10 14:25:12 harti Exp $
- * $DragonFly: src/usr.bin/make/lst.h,v 1.22 2005/02/15 01:01:18 okumoto Exp $
+ * $DragonFly: src/usr.bin/make/lst.h,v 1.23 2005/02/23 10:02:27 okumoto Exp $
  */
 
 #ifndef lst_h_38f3ead1
@@ -163,6 +163,10 @@ LstNode            *Lst_Member(Lst *, void *);
 void           Lst_ForEach(Lst *, DoProc *, void *);
 #define        Lst_ForEach(LST, FN, D) (Lst_ForEachFrom((LST), Lst_First(LST), \
                                    (FN), (D)))
+
+#define        LST_FOREACH(PTR, LST)                                           \
+       for ((PTR) = (LST)->firstPtr; (PTR) != NULL; (PTR) = (PTR)->nextPtr)
+
 /*
  * Apply a function to all elements of a lst starting from a certain point.
  * If the list is circular, the application will wrap around to the