#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;
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 *);
struct msgs_array msgs = { 0, 0, NULL };
struct msgs *mp;
struct smsg **dlist;
+ int checksw = 0;
#ifdef LOCALE
setlocale(LC_ALL, "");
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)
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 == '@') {
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)
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".
*/
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);
}
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)
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);
}
{
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 */
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));