From: Peter Maydell Date: Tue, 5 Aug 2008 19:05:23 +0000 (+0000) Subject: Simplify dodir/addir/addfold (patch from Eric Gillespie) X-Git-Tag: PRE_POSIX_CONVERSION~41 X-Git-Url: http://git.marmaro.de/?a=commitdiff_plain;h=ef8679ef6af0ba01d8dc43df577c5962037f13bd;p=mmh Simplify dodir/addir/addfold (patch from Eric Gillespie) --- diff --git a/ChangeLog b/ChangeLog index 6afe9ad..ce6939b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2008-08-04 Eric Gillespie + + * uip/folder.c: Simplify dodir/addir/addfold. + 2008-08-03 Peter Maydell * test/setup-test: use 'set -e' so we stop on compile failure. diff --git a/uip/folder.c b/uip/folder.c index f50d3f5..a0821c2 100644 --- a/uip/folder.c +++ b/uip/folder.c @@ -419,7 +419,6 @@ dodir (char *dir) int i; int os = start; int of = foldp; - char buffer[BUFSIZ]; start = foldp; @@ -427,7 +426,7 @@ dodir (char *dir) if (chdir (nmhdir) == NOTOK) adios (nmhdir, "unable to change directory to"); - addir (strncpy (buffer, dir, sizeof(buffer))); + addir (dir); for (i = start; i < foldp; i++) { get_folder_info (folds[i], NULL); @@ -667,21 +666,11 @@ static void addir (char *name) { int nlink; - char *base, *cp; + char *prefix, *child; struct stat st; struct dirent *dp; DIR * dd; - cp = name + strlen (name); - *cp++ = '/'; - *cp = '\0'; - - /* - * A hack to skip over a leading - * "./" in folder names. - */ - base = strcmp (name, "./") ? name : name + 2; - /* short-cut to see if directory has any sub-directories */ if (stat (name, &st) != -1 && st.st_nlink == 2) return; @@ -691,6 +680,12 @@ addir (char *name) return; } + if (strcmp (name, ".") == 0) { + prefix = getcpy (""); + } else { + prefix = concat (name, "/", (void *)NULL); + } + /* * Keep track of the number of directories we've seen * so we can quit stat'ing early, if we've seen them all. @@ -702,22 +697,23 @@ addir (char *name) nlink--; continue; } - if (cp + NLENGTH(dp) + 2 >= name + BUFSIZ) - continue; - strcpy (cp, dp->d_name); - if (stat (name, &st) != -1 && S_ISDIR(st.st_mode)) { + child = concat (prefix, dp->d_name, (void *)NULL); + if (stat (child, &st) != -1 && S_ISDIR(st.st_mode)) { /* * Check if this was really a symbolic link pointing at * a directory. If not, then decrement link count. */ - if (lstat (name, &st) == -1) + if (lstat (child, &st) == -1) nlink--; - addfold (base); + /* addfold saves child in the list, don't free it */ + addfold (child); + } else { + free (child); } } closedir (dd); - *--cp = '\0'; + free(prefix); } /* @@ -729,7 +725,6 @@ static void addfold (char *fold) { register int i, j; - register char *cp; /* if necessary, reallocate the space for folder names */ if (foldp >= maxfolders) { @@ -737,17 +732,16 @@ addfold (char *fold) folds = mh_xrealloc (folds, maxfolders * sizeof(char *)); } - cp = getcpy (fold); for (i = start; i < foldp; i++) - if (compare (cp, folds[i]) < 0) { + if (compare (fold, folds[i]) < 0) { for (j = foldp - 1; j >= i; j--) folds[j + 1] = folds[j]; foldp++; - folds[i] = cp; + folds[i] = fold; return; } - folds[foldp++] = cp; + folds[foldp++] = fold; }