Added -noall/-all switches to sortm(1).
[mmh] / uip / sortm.c
index 9263c79..d2486ee 100644 (file)
@@ -2,8 +2,6 @@
 /*
  * sortm.c -- sort messages in a folder by date/time
  *
- * $Id$
- *
  * This code is Copyright (c) 2002, by the authors of nmh.  See the
  * COPYRIGHT file in the root directory of the nmh distribution for
  * complete copyright information.
 #include <h/tws.h>
 #include <h/utils.h>
 
-/*
- * We allocate space for messages (msgs array)
- * this number of elements at a time.
- */
-#define MAXMSGS  256
-
-
 static struct swit switches[] = {
 #define DATESW                 0
      { "datefield field", 0 },
@@ -37,9 +28,13 @@ static struct swit switches[] = {
      { "verbose", 0 },
 #define NVERBSW                7
      { "noverbose", 0 },
-#define VERSIONSW              8
+#define ALLMSGS                8
+     { "all", 0 },
+#define NALLMSGS               9
+     { "noall", 0 },
+#define VERSIONSW             10
      { "version", 0 },
-#define HELPSW                 9
+#define HELPSW                11
      { "help", 0 },
      { NULL, 0 }
 };
@@ -54,9 +49,10 @@ static struct smsg *smsgs;
 int nmsgs;
 
 char *subjsort = (char *) 0;    /* sort on subject if != 0 */
-unsigned long datelimit = 0;
+time_t datelimit = 0;
 int submajor = 0;              /* if true, sort on subject-major */
 int verbose;
+int allmsgs = 1;
 
 /* This keeps compiler happy on calls to qsort */
 typedef int (*qsort_comp) (const void *, const void *);
@@ -76,10 +72,12 @@ static void rename_msgs (struct msgs *, struct smsg **);
 int
 main (int argc, char **argv)
 {
-    int        nummsgs, maxmsgs, i, msgnum;
-    char *cp, *maildir, *datesw = NULL;
+    int        i, msgnum;
+    unsigned char *cp;
+    char *maildir, *datesw = NULL;
     char *folder = NULL, buf[BUFSIZ], **argp;
-    char **arguments, **msgs;
+    char **arguments;
+    struct msgs_array msgs = { 0, 0, NULL };
     struct msgs *mp;
     struct smsg **dlist;
 
@@ -95,14 +93,6 @@ main (int argc, char **argv)
     argp = arguments;
 
     /*
-     * Allocate the initial space to record message
-     * names and ranges.
-     */
-    nummsgs = 0;
-    maxmsgs = MAXMSGS;
-    msgs = (char **) mh_xmalloc ((size_t) (maxmsgs * sizeof(*msgs)));
-
-    /*
      * Parse arguments
      */
     while ((cp = *argp++)) {
@@ -118,10 +108,10 @@ main (int argc, char **argv)
                snprintf(buf, sizeof(buf), "%s [+folder] [msgs] [switches]",
                        invo_name);
                print_help (buf, switches, 1);
-               done (1);
+               done (0);
            case VERSIONSW:
                print_version(invo_name);
-               done (1);
+               done (0);
 
            case DATESW:
                if (datesw)
@@ -168,31 +158,33 @@ main (int argc, char **argv)
            case NVERBSW:
                verbose = 0;
                continue;
+
+           case ALLMSGS:
+               allmsgs = 1;
+               continue;
+           case NALLMSGS:
+               allmsgs = 0;
+               continue;
            }
        }
        if (*cp == '+' || *cp == '@') {
            if (folder)
                adios (NULL, "only one folder at a time!");
            else
-               folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
-       } else {
-           /*
-            * Check if we need to allocate more space
-            * for message names/ranges.
-            */
-           if (nummsgs >= maxmsgs) {
-               maxmsgs += MAXMSGS;
-               msgs = (char **) mh_xrealloc (msgs,
-                    (size_t) (maxmsgs * sizeof(*msgs)));
-           }
-           msgs[nummsgs++] = cp;
-       }
+               folder = pluspath (cp);
+       } else
+               app_msgarg(&msgs, cp);
     }
 
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
-    if (!nummsgs)
-       msgs[nummsgs++] = "all";
+    if (!msgs.size) {
+       if (allmsgs) {
+           app_msgarg(&msgs, "all");
+        } else {
+           adios (NULL, "must specify messages to sort with -noall");
+        }
+    }
     if (!datesw)
        datesw = "date";
     if (!folder)
@@ -211,8 +203,8 @@ main (int argc, char **argv)
        adios (NULL, "no messages in %s", folder);
 
     /* parse all the message ranges/sequences and set SELECTED */
-    for (msgnum = 0; msgnum < nummsgs; msgnum++)
-       if (!m_convert (mp, msgs[msgnum]))
+    for (msgnum = 0; msgnum < msgs.size; msgnum++)
+       if (!m_convert (mp, msgs.msgs[msgnum]))
            done (1);
     seq_setprev (mp);  /* set the previous sequence */
 
@@ -308,7 +300,8 @@ main (int argc, char **argv)
     seq_save (mp);                     /* synchronize message sequences */
     context_save ();                   /* save the context file         */
     folder_free (mp);                  /* free folder/message structure */
-    return done (0);
+    done (0);
+    return 1;
 }
 
 static int
@@ -432,7 +425,8 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
             * leading "re:", everything but letters & smash
             * letters to lower case.
             */
-           register char  *cp, *cp2, c;
+           register char  *cp, *cp2;
+           register unsigned char c;
 
            cp = subjcomp;
            cp2 = subjcomp;
@@ -515,7 +509,7 @@ rename_chain (struct msgs *mp, struct smsg **mlist, int msg, int endmsg)
 {
     int nxt, old, new;
     char *newname, oldname[BUFSIZ];
-    char newbuf[MAXPATHLEN + 1];
+    char newbuf[PATH_MAX + 1];
 
     for (;;) {
        nxt = mlist[msg] - smsgs;       /* mlist[msg] is a ptr into smsgs */
@@ -553,7 +547,7 @@ rename_msgs (struct msgs *mp, struct smsg **mlist)
     int i, j, old, new;
     seqset_t tmpset;
     char f1[BUFSIZ], tmpfil[BUFSIZ];
-    char newbuf[MAXPATHLEN + 1];
+    char newbuf[PATH_MAX + 1];
     struct smsg *sp;
 
     strncpy (tmpfil, m_name (mp->hghmsg + 1), sizeof(tmpfil));