X-Git-Url: https://diplodocus.org/git/nmh/blobdiff_plain/c897634e1c28697a6df572de00e66579567ad2a6..8090b548231e5f9e0fa78166b5d7b4228b2ef608:/uip/sortm.c diff --git a/uip/sortm.c b/uip/sortm.c index 45e2b292..429f75f9 100644 --- a/uip/sortm.c +++ b/uip/sortm.c @@ -11,33 +11,29 @@ #include #include -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 VERSIONSW 10 - { "version", 0 }, -#define HELPSW 11 - { "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; @@ -53,6 +49,7 @@ 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 *); @@ -80,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, ""); @@ -165,6 +163,13 @@ main (int argc, char **argv) case NALLMSGS: allmsgs = 0; continue; + + case CHECKSW: + checksw = 1; + continue; + case NCHECKSW: + checksw = 0; + continue; } } if (*cp == '+' || *cp == '@') { @@ -211,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". */ @@ -389,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) @@ -415,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); }