Changed msg_style and msg_delim to be file static to m_getfld.c
[mmh] / uip / flist.c
index 408f608..b4aff9c 100644 (file)
  * control laws. This software is made available AS IS, and Xerox Corporation
  * makes no warranty about the software, its performance or its conformity to
  * any specification.
- *
- *  $Id$
  */
 
 #include <h/mh.h>
+#include <h/utils.h>
 
 #define FALSE   0
 #define TRUE    1
@@ -75,7 +74,7 @@ static struct Folder *orders = NULL;
 static int nOrders = 0;
 static int nOrdersAlloced = 0;
 static struct Folder *folders = NULL;
-static int nFolders = 0;
+static unsigned int nFolders = 0;
 static int nFoldersAlloced = 0;
 
 /* info on folders to search */
@@ -85,7 +84,7 @@ static int maxfolders;
 
 /* info on sequences to search for */
 static char *sequencesToDo[NUMATTRS];
-static int numsequences;
+static unsigned int numsequences;
 
 static int all        = FALSE;  /* scan all folders in top level?           */
 static int alphaOrder = FALSE; /* want alphabetical order only             */
@@ -113,7 +112,6 @@ int AddFolder(char *, int);
 void BuildFolderList(char *, int);
 void BuildFolderListRecurse(char *, struct stat *, int);
 void PrintFolders(void);
-static int num_digits (int);
 void AllocFolders(struct Folder **, int *, int);
 int AssignPriority(char *);
 static void do_readonly_folders(void);
@@ -148,8 +146,7 @@ main(int argc, char **argv)
     /* allocate the initial space to record the folder names */
     numfolders = 0;
     maxfolders = MAXFOLDERS;
-    if (!(foldersToDo = (char **) malloc ((size_t) (maxfolders * sizeof(*foldersToDo)))))
-       adios (NULL, "unable to allocate folder storage");
+    foldersToDo = (char **) mh_xmalloc ((size_t) (maxfolders * sizeof(*foldersToDo)));
 
     /* no sequences yet */
     numsequences = 0;
@@ -168,10 +165,10 @@ main(int argc, char **argv)
                snprintf(buf, sizeof(buf), "%s [+folder1 [+folder2 ...]][switches]",
                        invo_name);
                print_help(buf, switches, 1);
-               done(1);
+               done(0);
            case VERSIONSW:
                print_version(invo_name);
-               done (1);
+               done (0);
 
            case SEQSW:
                if (!(cp = *argp++) || *cp == '-')
@@ -228,13 +225,12 @@ main(int argc, char **argv)
             */
            if (numfolders >= maxfolders) {
                maxfolders += MAXFOLDERS;
-               if (!(foldersToDo = (char **) realloc (foldersToDo,
-                       (size_t) (maxfolders * sizeof(*foldersToDo)))))
-                   adios (NULL, "unable to reallocate folder name storage");
+               foldersToDo = (char **) mh_xrealloc (foldersToDo,
+                   (size_t) (maxfolders * sizeof(*foldersToDo)));
            }
            if (*cp == '+' || *cp == '@') {
                foldersToDo[numfolders++] =
-                   path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
+                   pluspath (cp);
            } else
                foldersToDo[numfolders++] = cp;
        }
@@ -278,7 +274,8 @@ main(int argc, char **argv)
     ScanFolders();
     qsort(folders, nFolders, sizeof(struct Folder), (qsort_comp) CompareFolders);
     PrintFolders();
-    return done (0);
+    done (0);
+    return 1;
 }
 
 /*
@@ -289,7 +286,7 @@ main(int argc, char **argv)
 void
 GetFolderOrder(void)
 {
-    char *p, *s;
+    unsigned char *p, *s;
     int priority = 1;
     struct Folder *o;
 
@@ -306,7 +303,7 @@ GetFolderOrder(void)
            AllocFolders(&orders, &nOrdersAlloced, nOrders + 1);
            o = &orders[nOrders++];
            o->priority = priority++;
-           o->name = (char *) malloc(p - s + 1);
+           o->name = (char *) mh_xmalloc(p - s + 1);
            strncpy(o->name, s, p - s);
            o->name[p - s] = 0;
        } else
@@ -401,7 +398,8 @@ BuildFolderList(char *dirName, int searchdepth)
 void
 BuildFolderListRecurse(char *dirName, struct stat *s, int searchdepth)
 {
-    char *base, *n, name[PATH_MAX];
+    char *base, name[PATH_MAX];
+    unsigned char *n;
     int nlinks;
     DIR *dir;
     struct dirent *dp;
@@ -415,6 +413,12 @@ BuildFolderListRecurse(char *dirName, struct stat *s, int searchdepth)
      * stat them.  But that shouldn't generally be a problem.
      */
     nlinks = s->st_nlink;
+    if (nlinks == 1) {
+      /* Disable the optimization under conditions where st_nlink
+         is set to 1.  That happens on Cygwin, for example:
+         http://cygwin.com/ml/cygwin-apps/2008-08/msg00264.html */
+      nlinks = INT_MAX;
+    }
 
     if (!(dir = opendir(dirName)))
        adios(dirName, "can't open directory");
@@ -466,7 +470,8 @@ BuildFolderListRecurse(char *dirName, struct stat *s, int searchdepth)
 int
 AddFolder(char *name, int force)
 {
-    int i, msgnum, nonzero;
+    unsigned int i;
+    int msgnum, nonzero;
     int seqnum[NUMATTRS], nSeq[NUMATTRS];
     struct Folder *f;
     struct msgs *mp;
@@ -536,8 +541,8 @@ void
 PrintFolders(void)
 {
     char tmpname[BUFSIZ];
-    int i, j, len, has_private = 0;
-    int maxfolderlen = 0, maxseqlen = 0;
+    unsigned int i, j, len, has_private = 0;
+    unsigned int maxfolderlen = 0, maxseqlen = 0;
     int maxnum = 0, maxseq = 0;
 
     if (!Total) {
@@ -606,29 +611,6 @@ PrintFolders(void)
 }
 
 /*
- * Calculate the number of digits in a nonnegative integer
- */
-static 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;
-}
-
-/*
  * Put them in priority order.
  */
 
@@ -652,10 +634,10 @@ AllocFolders(struct Folder **f, int *nfa, int n)
        return;
     if (*f == NULL) {
        *nfa = 10;
-       *f = (struct Folder *) malloc (*nfa * (sizeof(struct Folder)));
+       *f = (struct Folder *) mh_xmalloc (*nfa * (sizeof(struct Folder)));
     } else {
        *nfa *= 2;
-       *f = (struct Folder *) realloc (*f, *nfa * (sizeof(struct Folder)));
+       *f = (struct Folder *) mh_xrealloc (*f, *nfa * (sizeof(struct Folder)));
     }
 }