-static void
-addir (char *name)
-{
- char *prefix, *child;
- struct stat st;
- struct dirent *dp;
- DIR * dd;
- int child_is_folder;
-
- if (!(dd = opendir (name))) {
- admonish (name, "unable to read directory ");
- return;
- }
-
- if (strcmp (name, ".") == 0) {
- prefix = getcpy ("");
- } else {
- prefix = concat (name, "/", (void *)NULL);
- }
-
- while ((dp = readdir (dd))) {
- /* If the system supports it, try to skip processing of children we
- * know are not directories or symlinks. */
- child_is_folder = -1;
-#if defined(HAVE_STRUCT_DIRENT_D_TYPE)
- if (dp->d_type == DT_DIR) {
- child_is_folder = 1;
- } else if (dp->d_type != DT_LNK && dp->d_type != DT_UNKNOWN) {
- continue;
- }
-#endif
- if (!strcmp (dp->d_name, ".") || !strcmp (dp->d_name, "..")) {
- continue;
- }
- child = concat (prefix, dp->d_name, (void *)NULL);
- /* If we have no d_type or d_type is DT_LNK or DT_UNKNOWN, stat the
- * child to see what it is. */
- if (child_is_folder == -1) {
- child_is_folder = (stat (child, &st) != -1 && S_ISDIR(st.st_mode));
- }
- if (child_is_folder) {
- /* addfold saves child in the list, don't free it */
- addfold (child);
- } else {
- free (child);
- }
- }
-
- closedir (dd);
- free(prefix);
-}
-
-/*
- * Add the folder name into the
- * list in a sorted fashion.
- */
-
-static void
-addfold (char *fold)
-{
- register int i, j;
-
- /* if necessary, reallocate the space for folder names */
- if (foldp >= maxfolders) {
- maxfolders += NUMFOLDERS;
- folds = mh_xrealloc (folds, maxfolders * sizeof(char *));
- }
-
- for (i = start; i < foldp; i++)
- if (compare (fold, folds[i]) < 0) {
- for (j = foldp - 1; j >= i; j--)
- folds[j + 1] = folds[j];
- foldp++;
- folds[i] = fold;
- return;
- }
-
- folds[foldp++] = fold;
-}
-
-
-static int
-compare (char *s1, char *s2)
-{
- register int i;
-
- while (*s1 || *s2)
- if ((i = *s1++ - *s2++))
- return i;
-
- return 0;
-}
-