]> diplodocus.org Git - nmh/blobdiff - uip/sortm.c
Migrated show_content_aux2() to argsplit().
[nmh] / uip / sortm.c
index b4e6d56e213a0f59b79bdd95809e91d7886450a5..3df188592fcb86026b6f7a5c821d44fecd59483d 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 };
@@ -87,13 +78,7 @@ main (int argc, char **argv)
     struct smsg **dlist;
     int checksw = 0;
 
-#ifdef LOCALE
-    setlocale(LC_ALL, "");
-#endif
-    invo_name = r1bindex (argv[0], '/');
-
-    /* read user profile/context */
-    context_read();
+    if (nmh_init(argv[0], 1)) { return 1; }
 
     arguments = getarguments (invo_name, argc, argv, 1);
     argp = arguments;
@@ -149,7 +134,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;
@@ -208,7 +193,7 @@ main (int argc, char **argv)
        adios (maildir, "unable to change directory to");
 
     /* read folder and create message structure */
-    if (!(mp = folder_read (folder)))
+    if (!(mp = folder_read (folder, 1)))
        adios (NULL, "unable to read folder %s", folder);
 
     /* check for empty folder */
@@ -365,31 +350,32 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
     register struct tws *tw;
     register char *datecomp = NULL, *subjcomp = NULL;
     register FILE *in;
+    m_getfld_state_t gstate = 0;
 
     if ((in = fopen (msgnam = m_name (msg), "r")) == NULL) {
        admonish (msgnam, "unable to read message");
        return (0);
     }
-    for (compnum = 1, state = FLD;;) {
+    for (compnum = 1;;) {
        int bufsz = sizeof buf;
-       switch (state = m_getfld (state, nam, buf, &bufsz, in)) {
+       switch (state = m_getfld (&gstate, nam, buf, &bufsz, in)) {
        case FLD:
        case FLDPLUS:
            compnum++;
-           if (!mh_strcasecmp (nam, datesw)) {
+           if (!strcasecmp (nam, datesw)) {
                datecomp = add (buf, datecomp);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
-                   state = m_getfld (state, nam, buf, &bufsz, in);
+                   state = m_getfld (&gstate, nam, buf, &bufsz, in);
                    datecomp = add (buf, datecomp);
                }
                if (!subjsort || subjcomp)
                    break;
-           } else if (subjsort && !mh_strcasecmp (nam, subjsort)) {
+           } else if (subjsort && !strcasecmp (nam, subjsort)) {
                subjcomp = add (buf, subjcomp);
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
-                   state = m_getfld (state, nam, buf, &bufsz, in);
+                   state = m_getfld (&gstate, nam, buf, &bufsz, in);
                    subjcomp = add (buf, subjcomp);
                }
                if (datecomp)
@@ -398,7 +384,7 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
                /* just flush this guy */
                while (state == FLDPLUS) {
                    bufsz = sizeof buf;
-                   state = m_getfld (state, nam, buf, &bufsz, in);
+                   state = m_getfld (&gstate, nam, buf, &bufsz, in);
                }
            }
            continue;
@@ -426,6 +412,7 @@ get_fields (char *datesw, int msg, struct smsg *smsg)
        }
        break;
     }
+    m_getfld_state_destroy (&gstate);
 
     /*
      * If no date component, then use the modification
@@ -434,7 +421,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;
@@ -449,14 +439,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
@@ -467,8 +456,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';
@@ -569,7 +559,7 @@ static void
 rename_msgs (struct msgs *mp, struct smsg **mlist)
 {
     int i, j, old, new;
-    seqset_t tmpset;
+    bvector_t tmpset = bvector_create (0);
     char f1[BUFSIZ], tmpfil[BUFSIZ];
     char newbuf[PATH_MAX + 1];
     struct smsg *sp;
@@ -609,7 +599,7 @@ rename_msgs (struct msgs *mp, struct smsg **mlist)
        if (rename (f1, tmpfil) == NOTOK)
            adios (tmpfil, "unable to rename %s to ", f1);
 
-       get_msg_flags (mp, &tmpset, old);
+       get_msg_flags (mp, tmpset, old);
 
        rename_chain (mp, mlist, j, i);
 
@@ -624,7 +614,9 @@ rename_msgs (struct msgs *mp, struct smsg **mlist)
        if (rename (tmpfil, m_name(new)) == NOTOK)
            adios (m_name(new), "unable to rename %s to", tmpfil);
 
-       set_msg_flags (mp, &tmpset, new);
+       set_msg_flags (mp, tmpset, new);
        mp->msgflags |= SEQMOD;
     }
+
+    bvector_free (tmpset);
 }