]> diplodocus.org Git - nmh/blobdiff - uip/scan.c
Add basic support for the STLS command in POP
[nmh] / uip / scan.c
index 1f487cdd9a77f1d97e441cc1784f06d07d9850e3..b999378bc4c6182195c7e8ad600daf21d233dad7 100644 (file)
@@ -1,18 +1,40 @@
-
-/*
- * 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) \
@@ -40,27 +62,26 @@ DEFINE_SWITCH_ARRAY(SCAN, switches);
 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;
 
@@ -74,7 +95,7 @@ main (int argc, char **argv)
                    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]",
@@ -86,45 +107,45 @@ main (int argc, char **argv)
                    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;
@@ -132,11 +153,10 @@ main (int argc, char **argv)
        }
        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"))
@@ -152,9 +172,9 @@ main (int argc, char **argv)
      */
     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) {
@@ -172,10 +192,13 @@ main (int argc, char **argv)
        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);
@@ -196,11 +219,11 @@ main (int argc, char **argv)
 
     /* 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++)
@@ -219,14 +242,13 @@ main (int argc, char **argv)
     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));
@@ -235,6 +257,7 @@ main (int argc, char **argv)
         (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;
@@ -248,36 +271,39 @@ main (int argc, char **argv)
             * 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 */