-
-/*
- * pick.c -- search for messages by content
+/* pick.c -- search for messages by content
*
* This code is Copyright (c) 2002, 2008, by the authors of nmh. See the
* COPYRIGHT file in the root directory of the nmh distribution for
* complete copyright information.
*/
-#include <h/mh.h>
-#include <h/tws.h>
-#include <h/picksbr.h>
-#include <h/utils.h>
+#include "h/mh.h"
+#include "sbr/path.h"
+#include "sbr/print_version.h"
+#include "sbr/print_help.h"
+#include "sbr/seq_nameok.h"
+#include "sbr/seq_add.h"
+#include "sbr/error.h"
+#include "h/tws.h"
+#include "h/picksbr.h"
+#include "h/done.h"
+#include "h/utils.h"
+#include "sbr/m_maildir.h"
#define PICK_SWITCHES \
X("reverse", 0, REVSW) \
int
main (int argc, char **argv)
{
- int publicsw = -1, zerosw = 1, vecp = 0;
+ int publicsw = -1;
+ bool zerosw = true;
+ int vecp = 0;
size_t seqp = 0;
int msgnum;
char *maildir, *folder = NULL, buf[100];
struct msgs_array msgs = { 0, 0, NULL };
struct msgnum_array nums = { 0, 0, NULL };
struct msgs *mp, *mp2;
- register FILE *fp;
+ FILE *fp;
int debug = 0;
- int reverse = 0;
+ bool reverse = false;
int start, end, inc;
- if (nmh_init(argv[0], 1)) { return 1; }
-
- done=putzero_done;
+ if (nmh_init(argv[0], true, true)) { return 1; }
- /* Deprecated. Use -debug instead. */
- if ((cp = getenv ("MHPDEBUG")) && *cp)
- ++debug;
+ set_done(putzero_done);
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
listsw = 0; /* HACK */
done (1);
case UNKWNSW:
- adios (NULL, "-%s unknown", cp);
+ die("-%s unknown", cp);
case HELPSW:
snprintf (buf, sizeof(buf), "%s [+folder] [msgs] [switches]",
done (0);
case REVSW:
- reverse = 1;
+ reverse = true;
continue;
case CCSW:
vec[vecp++] = --cp;
pattern:
if (!(cp = *argp++))/* allow -xyz arguments */
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
vec[vecp++] = cp;
continue;
case OTHRSW:
- adios (NULL, "internal error!");
+ die("internal error!");
case ANDSW:
case ORSW:
case SEQSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
if (!seq_nameok (cp))
done (1);
publicsw = 0;
continue;
case ZEROSW:
- zerosw++;
+ zerosw = true;
continue;
case NZEROSW:
- zerosw = 0;
+ zerosw = false;
continue;
case LISTSW:
}
if (*cp == '+' || *cp == '@') {
if (folder)
- adios (NULL, "only one folder at a time!");
- else
- folder = pluspath (cp);
+ die("only one folder at a time!");
+ folder = pluspath (cp);
} else
app_msgarg(&msgs, cp);
}
/* read folder and create message structure */
if (!(mp = folder_read (folder, 0)))
- adios (NULL, "unable to read folder %s", folder);
+ die("unable to read folder %s", folder);
/* check for empty folder */
if (mp->nummsg == 0)
- adios (NULL, "no messages in %s", folder);
+ die("no messages in %s", folder);
/* parse all the message ranges/sequences and set SELECTED */
for (msgnum = 0; msgnum < msgs.size; msgnum++)
listsw = !seqp;
if (publicsw == 1 && is_readonly(mp))
- adios (NULL, "folder %s is read-only, so -public not allowed", folder);
+ die("folder %s is read-only, so -public not allowed", folder);
if (!pcompile (vec, NULL))
done (1);
admonish (cp, "unable to read message");
if (fp && pmatches (fp, msgnum, 0L, 0L, debug)) {
if (listsw)
- printf ("%s\n", m_name (msgnum));
+ puts(m_name (msgnum));
} else {
app_msgnum(&nums, msgnum);
}
}
if (nums.size >= mp->numsel)
- adios (NULL, "no messages match specification");
+ die("no messages match specification");
/*
* So, what's happening here?
*/
if (!(mp2 = folder_read (folder, 1)))
- adios (NULL, "unable to reread folder %s", folder);
+ die("unable to reread folder %s", folder);
for (msgnum = 0; msgnum < msgs.size; msgnum++)
if (!m_convert (mp2, msgs.msgs[msgnum]))
* Print total matched if not printing each matched message number.
*/
if (!listsw) {
- printf ("%d hit%s\n", mp2->numsel, mp2->numsel == 1 ? "" : "s");
+ printf ("%d hit%s\n", mp2->numsel, PLURALS(mp2->numsel));
}
svector_free (seqs);
}
-static void
+static void NORETURN
putzero_done (int status)
{
if (listsw && status && !isatty (fileno (stdout)))
- printf ("0\n");
+ puts("0");
exit (status);
}