X-Git-Url: http://git.marmaro.de/?a=blobdiff_plain;f=uip%2Ffolder.c;h=d4d98686dd55676aba995a90af73f5b6ba4dd968;hb=f7c1a8a53c452b75aa84ff4bf9de7f47af7b881c;hp=9d85e891f7952b28780e46616ed72d34cfe7798d;hpb=08aa8c17c3241bb5c6a997ed2e01e25a4d0089ce;p=mmh diff --git a/uip/folder.c b/uip/folder.c index 9d85e89..d4d9868 100644 --- a/uip/folder.c +++ b/uip/folder.c @@ -121,7 +121,6 @@ static int maxFolderInfo; static void dodir (char *); static int get_folder_info (char *, char *); static void print_folders (void); -static int num_digits (int); static int sfold (struct msgs *, char *); static void addir (char *); static void addfold (char *); @@ -136,7 +135,6 @@ main (int argc, char **argv) int pushsw = 0, popsw = 0; char *cp, *dp, *msg = NULL, *argfolder = NULL; char **ap, **argp, buf[BUFSIZ], **arguments; - struct stat st; #ifdef LOCALE setlocale(LC_ALL, ""); @@ -261,7 +259,7 @@ main (int argc, char **argv) if (argfolder) adios (NULL, "only one folder at a time!"); else - argfolder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF); + argfolder = pluspath (cp); } else { if (msg) adios (NULL, "only one (current) message at a time!"); @@ -407,7 +405,8 @@ main (int argc, char **argv) print_folders(); context_save (); /* save the context file */ - return done (0); + done (0); + return 1; } /* @@ -420,7 +419,6 @@ dodir (char *dir) int i; int os = start; int of = foldp; - char buffer[BUFSIZ]; start = foldp; @@ -428,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); @@ -641,29 +639,6 @@ print_folders (void) } /* - * Calculate the number of digits in a nonnegative integer - */ -int -num_digits (int n) -{ - int ndigits = 0; - - /* Sanity check */ - if (n < 0) - adios (NULL, "oops, num_digits called with negative value"); - - if (n == 0) - return 1; - - while (n) { - n /= 10; - ndigits++; - } - - return ndigits; -} - -/* * Set the current message and sychronize sequences */ @@ -690,58 +665,37 @@ sfold (struct msgs *mp, char *msg) 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; - if (!(dd = opendir (name))) { admonish (name, "unable to read directory "); return; } - /* - * Keep track of the number of directories we've seen - * so we can quit stat'ing early, if we've seen them all. - */ - nlink = st.st_nlink; + if (strcmp (name, ".") == 0) { + prefix = getcpy (""); + } else { + prefix = concat (name, "/", (void *)NULL); + } - while (nlink && (dp = readdir (dd))) { + while ((dp = readdir (dd))) { if (!strcmp (dp->d_name, ".") || !strcmp (dp->d_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)) { - /* - * Check if this was really a symbolic link pointing at - * a directory. If not, then decrement link count. - */ - if (lstat (name, &st) == -1) - nlink--; - addfold (base); + child = concat (prefix, dp->d_name, (void *)NULL); + if (stat (child, &st) != -1 && S_ISDIR(st.st_mode)) { + /* addfold saves child in the list, don't free it */ + addfold (child); + } else { + free (child); } } closedir (dd); - *--cp = '\0'; + free(prefix); } /* @@ -753,7 +707,6 @@ static void addfold (char *fold) { register int i, j; - register char *cp; /* if necessary, reallocate the space for folder names */ if (foldp >= maxfolders) { @@ -761,17 +714,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; }