]> diplodocus.org Git - nmh/blobdiff - uip/sortm.c
Document argsplit changes in mh-profile man page.
[nmh] / uip / sortm.c
index 05b6ed02eb59e0ea2ec92491cd112cecfea7c7cd..6e7a74919cf362d7bfd5144a75d48baac291250a 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 ALLMSGS                8
-     { "all", 0 },
-#define NALLMSGS               9
-     { "noall", 0 },
-#define CHECKSW               10
-     { "check", 0 },
-#define NCHECKSW              11
-     { "nocheck", 0 },
-#define VERSIONSW             12
-     { "version", 0 },
-#define HELPSW                13
-     { "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;
@@ -78,8 +70,7 @@ int
 main (int argc, char **argv)
 {
     int        i, msgnum;
-    unsigned char *cp;
-    char *maildir, *datesw = NULL;
+    char *cp, *maildir, *datesw = NULL;
     char *folder = NULL, buf[BUFSIZ], **argp;
     char **arguments;
     struct msgs_array msgs = { 0, 0, NULL };
@@ -149,7 +140,7 @@ main (int argc, char **argv)
                    submajor++;         /* sort subject-major */
                    continue;
                }
-               if (!isdigit(*cp) || !(datelimit = atoi(cp)))
+               if (!isdigit((unsigned char) *cp) || !(datelimit = atoi(cp)))
                    adios (NULL, "impossible limit %s", cp);
                datelimit *= 60*60*24;
                continue;
@@ -436,7 +427,10 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
     if (!datecomp || (tw = dparsetime (datecomp)) == NULL) {
        struct stat st;
 
-       admonish (NULL, "can't parse %s field in message %d", datesw, msg);
+       advise (NULL,
+               "can't parse %s field in message %d, "
+               "will use file modification time",
+               datesw, msg);
        fstat (fileno (in), &st);
        smsg->s_clock = st.st_mtime;
        check_failed = 1;
@@ -451,14 +445,13 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
             * leading "re:", everything but letters & smash
             * letters to lower case.
             */
-           register char  *cp, *cp2;
-           register unsigned char c;
+           register char  *cp, *cp2, c;
 
            cp = subjcomp;
            cp2 = subjcomp;
            if (strcmp (subjsort, "subject") == 0) {
                while ((c = *cp)) {
-                   if (! isspace(c)) {
+                   if (! isspace((unsigned char) c)) {
                        if(uprf(cp, "re:"))
                            cp += 2;
                        else
@@ -469,8 +462,9 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
            }
 
            while ((c = *cp++)) {
-               if (isalnum(c))
-                   *cp2++ = isupper(c) ? tolower(c) : c;
+               if (isascii((unsigned char) c) && isalnum((unsigned char) c))
+                   *cp2++ = isupper((unsigned char) c) ?
+                                       tolower((unsigned char) c) : c;
            }
 
            *cp2 = '\0';