-
-/*
- * scan.c -- display a one-line "scan" listing of folder or messages
+/* scan.c -- display a one-line "scan" listing of folder or messages
*
* This code is Copyright (c) 2002, 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/fmt_scan.h>
-#include <h/scansbr.h>
-#include <h/tws.h>
-#include <h/mts.h>
-#include <h/utils.h>
+#include "h/mh.h"
+#include "sbr/fmt_new.h"
+#include "sbr/dtime.h"
+#include "scansbr.h"
+#include "sbr/m_name.h"
+#include "sbr/getarguments.h"
+#include "sbr/seq_setprev.h"
+#include "sbr/seq_save.h"
+#include "sbr/smatch.h"
+#include "sbr/m_convert.h"
+#include "sbr/getfolder.h"
+#include "sbr/folder_read.h"
+#include "sbr/folder_free.h"
+#include "sbr/context_save.h"
+#include "sbr/context_replace.h"
+#include "sbr/context_find.h"
+#include "sbr/brkstring.h"
+#include "sbr/ambigsw.h"
+#include "sbr/path.h"
+#include "sbr/print_version.h"
+#include "sbr/print_help.h"
+#include "sbr/seq_getnum.h"
+#include "sbr/error.h"
+#include "h/fmt_scan.h"
+#include "h/tws.h"
+#include "h/mts.h"
+#include "h/done.h"
+#include "h/utils.h"
+#include "sbr/m_maildir.h"
+#include "sbr/terminal.h"
#define SCAN_SWITCHES \
X("clear", 0, CLRSW) \
int
main (int argc, char **argv)
{
- int clearflag = 0, hdrflag = 0, ontty;
- int width = 0, revflag = 0;
+ bool clearflag = false;
+ bool hdrflag = false;
+ int ontty;
+ int width = -1;
+ bool revflag = false;
int i, state, msgnum;
ivector_t seqnum = ivector_create (0);
- int unseen, num_unseen_seq = 0;
+ bool unseen;
+ int num_unseen_seq = 0;
char *cp, *maildir, *file = NULL, *folder = NULL;
char *form = NULL, *format = NULL, buf[BUFSIZ];
char **argp, *nfs, **arguments;
struct msgs_array msgs = { 0, 0, NULL };
struct msgs *mp;
+ charstring_t scanl = NULL;
FILE *in;
-#ifdef LOCALE
- setlocale(LC_ALL, "");
-#endif
- invo_name = r1bindex (argv[0], '/');
-
- /* read user profile/context */
- context_read();
+ if (nmh_init(argv[0], true, true)) { return 1; }
- mts_init (invo_name);
+ mts_init ();
arguments = getarguments (invo_name, argc, argv, 1);
argp = arguments;
ambigsw (cp, switches);
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 CLRSW:
- clearflag++;
+ clearflag = true;
continue;
case NCLRSW:
- clearflag = 0;
+ clearflag = false;
continue;
case FORMSW:
if (!(form = *argp++) || *form == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
format = NULL;
continue;
case FMTSW:
if (!(format = *argp++) || *format == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
form = NULL;
continue;
case HEADSW:
- hdrflag++;
+ hdrflag = true;
continue;
case NHEADSW:
- hdrflag = 0;
+ hdrflag = false;
continue;
case WIDTHSW:
if (!(cp = *argp++) || *cp == '-')
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
width = atoi (cp);
continue;
case REVSW:
- revflag++;
+ revflag = true;
continue;
case NREVSW:
- revflag = 0;
+ revflag = false;
continue;
case FILESW:
if (!(cp = *argp++) || (cp[0] == '-' && cp[1]))
- adios (NULL, "missing argument to %s", argp[-2]);
+ die("missing argument to %s", argp[-2]);
if (strcmp (file = cp, "-"))
file = path (cp, TFILE);
continue;
}
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);
+ app_msgarg(&msgs, cp);
}
if (!context_find ("path"))
*/
if (file) {
if (msgs.size)
- adios (NULL, "\"msgs\" not allowed with -file");
+ die("\"msgs\" not allowed with -file");
if (folder)
- adios (NULL, "\"+folder\" not allowed with -file");
+ die("\"+folder\" not allowed with -file");
/* check if "file" is really stdin */
if (strcmp (file, "-") == 0) {
scan_detect_mbox_style (in);
for (msgnum = 1; ; ++msgnum) {
state = scan (in, msgnum, -1, nfs, width, 0, 0,
- hdrflag ? file : NULL, 0L, 1);
+ hdrflag ? file : NULL, 0L, 1, &scanl);
+ if (scanl)
+ charstring_clear(scanl);
if (state != SCNMSG && state != SCNENC)
break;
}
+ charstring_free (scanl);
scan_finished ();
fclose (in);
done (0);
/* read folder and create message structure */
if (!(mp = folder_read (folder, 1)))
- 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++)
if ((cp = context_find (usequence)) && *cp) {
char **ap, *dp;
- dp = getcpy(cp);
+ dp = mh_xstrdup(cp);
ap = brkstring (dp, " ", "\n");
for (i = 0; ap && *ap; i++, ap++)
ivector_push_back (seqnum, seq_getnum (mp, *ap));
num_unseen_seq = i;
- if (dp)
- free(dp);
+ free(dp);
}
ontty = isatty (fileno (stdout));
(revflag ? msgnum >= mp->lowsel : msgnum <= mp->hghsel);
msgnum += (revflag ? -1 : 1)) {
if (is_selected(mp, msgnum)) {
+
if ((in = fopen (cp = m_name (msgnum), "r")) == NULL) {
admonish (cp, "unable to open message");
continue;
* Check if message is in any sequence given
* by Unseen-Sequence profile entry.
*/
- unseen = 0;
+ unseen = false;
for (i = 0; i < num_unseen_seq; i++) {
if (in_sequence(mp, ivector_at (seqnum, i), msgnum)) {
- unseen = 1;
+ unseen = true;
break;
}
}
switch (state = scan (in, msgnum, 0, nfs, width,
msgnum == mp->curmsg, unseen,
- folder, 0L, 1)) {
+ folder, 0L, 1, &scanl)) {
case SCNMSG:
case SCNENC:
case SCNERR:
break;
default:
- adios (NULL, "scan() botch (%d)", state);
+ die("scan() botch (%d)", state);
case SCNEOF:
- advise (NULL, "message %d: empty", msgnum);
+ inform("message %d: empty", msgnum);
break;
}
+ if (scanl)
+ charstring_clear(scanl);
scan_finished ();
- hdrflag = 0;
+ hdrflag = false;
fclose (in);
if (ontty)
fflush (stdout);
}
}
+ charstring_free (scanl);
ivector_free (seqnum);
folder_free (mp); /* free folder/message structure */