]> diplodocus.org Git - nmh/blobdiff - uip/sortm.c
Clean up argument handling to fmttest, as a precursor to actually getting
[nmh] / uip / sortm.c
index cfad3d3c35617dfe0398f3f96f0f5f32a1cfec52..429f75f9708c7884978a161500079ea920fd6b34 100644 (file)
 #include <h/tws.h>
 #include <h/utils.h>
 
-static struct swit switches[] = {
-#define DATESW                 0
-     { "datefield field", 0 },
-#define        TEXTSW                 1
-     { "textfield field", 0 },
-#define        NSUBJSW                2
-     { "notextfield", 0 },
-#define SUBJSW                 3
-     { "subject", -3 },                   /* backward-compatibility */
-#define LIMSW                  4
-     { "limit days", 0 },
-#define        NLIMSW                 5
-     { "nolimit", 0 },
-#define VERBSW                 6
-     { "verbose", 0 },
-#define NVERBSW                7
-     { "noverbose", 0 },
-#define VERSIONSW              8
-     { "version", 0 },
-#define HELPSW                 9
-     { "help", 0 },
-     { NULL, 0 }
-};
+#define SORTM_SWITCHES \
+    X("datefield field", 0, DATESW) \
+    X("textfield field", 0, TEXTSW) \
+    X("notextfield", 0, NSUBJSW) \
+    X("subject", -3, SUBJSW) /* backward-compatibility */ \
+    X("limit days", 0, LIMSW) \
+    X("nolimit", 0, NLIMSW) \
+    X("verbose", 0, VERBSW) \
+    X("noverbose", 0, NVERBSW) \
+    X("all", 0, ALLMSGS) \
+    X("noall", 0, NALLMSGS) \
+    X("check", 0, CHECKSW) \
+    X("nocheck", 0, NCHECKSW) \
+    X("version", 0, VERSIONSW) \
+    X("help", 0, HELPSW) \
+
+#define X(sw, minchars, id) id,
+DEFINE_SWITCH_ENUM(SORTM);
+#undef X
+
+#define X(sw, minchars, id) { sw, minchars, id },
+DEFINE_SWITCH_ARRAY(SORTM, switches);
+#undef X
 
 struct smsg {
     int s_msg;
@@ -45,9 +45,11 @@ 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;
+int check_failed = 0;
 
 /* This keeps compiler happy on calls to qsort */
 typedef int (*qsort_comp) (const void *, const void *);
@@ -75,6 +77,7 @@ main (int argc, char **argv)
     struct msgs_array msgs = { 0, 0, NULL };
     struct msgs *mp;
     struct smsg **dlist;
+    int checksw = 0;
 
 #ifdef LOCALE
     setlocale(LC_ALL, "");
@@ -103,10 +106,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)
@@ -153,6 +156,20 @@ main (int argc, char **argv)
            case NVERBSW:
                verbose = 0;
                continue;
+
+           case ALLMSGS:
+               allmsgs = 1;
+               continue;
+           case NALLMSGS:
+               allmsgs = 0;
+               continue;
+
+           case CHECKSW:
+               checksw = 1;
+               continue;
+           case NCHECKSW:
+               checksw = 0;
+               continue;
            }
        }
        if (*cp == '+' || *cp == '@') {
@@ -166,8 +183,13 @@ main (int argc, char **argv)
 
     if (!context_find ("path"))
        free (path ("./", TFOLDER));
-    if (!msgs.size)
-       app_msgarg(&msgs, "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)
@@ -194,6 +216,10 @@ main (int argc, char **argv)
     if ((nmsgs = read_hdrs (mp, datesw)) <= 0)
        adios (NULL, "no messages to sort");
 
+    if (checksw  &&  check_failed) {
+       adios (NULL, "errors found, no messages sorted");
+    }
+
     /*
      * sort a list of pointers to our "messages to be sorted".
      */
@@ -204,9 +230,10 @@ main (int argc, char **argv)
 
     if (verbose) {     /* announce what we're doing */
        if (subjsort)
-           printf ("sorting by %s-major %s-minor\n",
-               submajor ? subjsort : datesw,
-               submajor ? datesw : subjsort);
+           if (submajor)
+               printf ("sorting by %s\n", subjsort);
+           else
+               printf ("sorting by %s-major %s-minor\n", subjsort, datesw);
        else
            printf ("sorting by datefield %s\n", datesw);
     }
@@ -371,9 +398,11 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
 
        case LENERR:
        case FMTERR:
-           if (state == LENERR || state == FMTERR)
+           if (state == LENERR || state == FMTERR) {
                admonish (NULL, "format error in message %d (header #%d)",
                      msg, compnum);
+               check_failed = 1;
+           }
            if (datecomp)
                free (datecomp);
            if (subjcomp)
@@ -397,6 +426,7 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
        admonish (NULL, "can't parse %s field in message %d", datesw, msg);
        fstat (fileno (in), &st);
        smsg->s_clock = st.st_mtime;
+       check_failed = 1;
     } else {
        smsg->s_clock = dmktime (tw);
     }
@@ -492,7 +522,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 */
@@ -530,7 +560,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));