X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/c703902741e0f7ce55f87e48ef0d00901195f1bc..7711f3fc00259e55f630cfe6104eff3083dc9d77:/uip/sortm.c diff --git a/uip/sortm.c b/uip/sortm.c index 429f75f9..0b8e1853 100644 --- a/uip/sortm.c +++ b/uip/sortm.c @@ -70,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 }; @@ -79,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; @@ -141,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; @@ -200,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 */ @@ -260,7 +253,7 @@ main (int argc, char **argv) * the collection of messages with the same subj * given a message number. */ - il = (struct smsg ***) calloc (mp->hghsel+1, sizeof(*il)); + il = (struct smsg ***) mh_xcalloc (mp->hghsel+1, sizeof(*il)); if (! il) adios (NULL, "couldn't allocate msg list"); for (i = 0; i < nmsgs; i++) @@ -294,6 +287,7 @@ main (int argc, char **argv) } } *fp = 0; + free (il); free (slist); free (dlist); dlist = flist; @@ -324,7 +318,7 @@ read_hdrs (struct msgs *mp, char *datesw) twscopy (&tb, dlocaltimenow ()); smsgs = (struct smsg *) - calloc ((size_t) (mp->hghsel - mp->lowsel + 2), + mh_xcalloc ((size_t) (mp->hghsel - mp->lowsel + 2), sizeof(*smsgs)); if (smsgs == NULL) adios (NULL, "unable to allocate sort storage"); @@ -357,42 +351,46 @@ 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;;) { - switch (state = m_getfld (state, nam, buf, sizeof(buf), in)) { + for (compnum = 1;;) { + int bufsz = sizeof buf; + switch (state = m_getfld (&gstate, nam, buf, &bufsz, in)) { case FLD: - case FLDEOF: case FLDPLUS: compnum++; - if (!mh_strcasecmp (nam, datesw)) { + if (!strcasecmp (nam, datesw)) { datecomp = add (buf, datecomp); while (state == FLDPLUS) { - state = m_getfld (state, nam, buf, sizeof(buf), in); + bufsz = sizeof buf; + 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) { - state = m_getfld (state, nam, buf, sizeof(buf), in); + bufsz = sizeof buf; + state = m_getfld (&gstate, nam, buf, &bufsz, in); subjcomp = add (buf, subjcomp); } if (datecomp) break; } else { /* just flush this guy */ - while (state == FLDPLUS) - state = m_getfld (state, nam, buf, sizeof(buf), in); + while (state == FLDPLUS) { + bufsz = sizeof buf; + state = m_getfld (&gstate, nam, buf, &bufsz, in); + } } continue; case BODY: - case BODYEOF: case FILEEOF: break; @@ -415,6 +413,7 @@ get_fields (char *datesw, int msg, struct smsg *smsg) } break; } + m_getfld_state_destroy (&gstate); /* * If no date component, then use the modification @@ -423,7 +422,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; @@ -438,14 +440,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 @@ -456,8 +457,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'; @@ -558,7 +560,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; @@ -598,7 +600,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); @@ -613,7 +615,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); }