refile: Never change the current folder
[mmh] / uip / new.c
index 1ee95ff..5bc7136 100644 (file)
--- a/uip/new.c
+++ b/uip/new.c
 ** Inspired by Luke Mewburn's new: http://www.mewburn.net/luke/src/new
 */
 
+#include <h/mh.h>
+#include <h/crawl_folders.h>
+#include <h/utils.h>
 #include <sys/types.h>
-
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-
-#include <h/mh.h>
-#include <h/crawl_folders.h>
-#include <h/utils.h>
+#include <unistd.h>
+#include <locale.h>
+#include <sysexits.h>
 
 static struct swit switches[] = {
 #define MODESW 0
@@ -54,7 +55,7 @@ count_messages(char *field)
        int j, k;
        char *cp, **ap;
 
-       field = getcpy(field);
+       field = mh_xstrdup(field);
 
        /* copied from seq_read.c:seq_init */
        for (ap = brkstring(field, " ", "\n"); *ap; ap++) {
@@ -67,7 +68,7 @@ count_messages(char *field)
                }
        }
 
-       free(field);
+       mh_free0(&field);
 
        return total;
 }
@@ -112,9 +113,8 @@ get_msgnums(char *folder, char *sequences[])
                                fp)) {
                case FLD:
                case FLDPLUS:
-               case FLDEOF:
                        if (state == FLDPLUS) {
-                               cp = getcpy(field);
+                               cp = mh_xstrdup(field);
                                while (state == FLDPLUS) {
                                        state = m_getfld(state, name, field,
                                                        sizeof(field), fp);
@@ -134,11 +134,11 @@ get_msgnums(char *folder, char *sequences[])
                                        } else {
                                                old_msgnums = msgnums;
                                                msgnums = concat(old_msgnums, " ", this_msgnums, (void *)NULL);
-                                               free(old_msgnums);
-                                               free(this_msgnums);
+                                               mh_free0(&old_msgnums);
+                                               mh_free0(&this_msgnums);
                                        }
                                }
-                               free(cp);
+                               mh_free0(&cp);
                        } else {
                                /* and here */
                                if (seq_in_list(name, sequences)) {
@@ -148,19 +148,16 @@ get_msgnums(char *folder, char *sequences[])
                                        } else {
                                                old_msgnums = msgnums;
                                                msgnums = concat(old_msgnums, " ", this_msgnums, (void *)NULL);
-                                               free(old_msgnums);
-                                               free(this_msgnums);
+                                               mh_free0(&old_msgnums);
+                                               mh_free0(&this_msgnums);
                                        }
                                }
                        }
 
-                       if (state == FLDEOF)
-                               break;
                        continue;
 
                case BODY:
-               case BODYEOF:
-                       adios(NULL, "no blank lines are permitted in %s",
+                       adios(EX_DATAERR, NULL, "no blank lines are permitted in %s",
                                        seqfile);
                        /* fall */
 
@@ -168,7 +165,7 @@ get_msgnums(char *folder, char *sequences[])
                        break;
 
                default:
-                       adios(NULL, "%s is poorly formatted", seqfile);
+                       adios(EX_SOFTWARE, NULL, "%s is poorly formatted", seqfile);
                }
                break;  /* break from for loop */
        }
@@ -190,9 +187,9 @@ check_folder(char *folder, size_t len, struct list_state *b)
 
        if (is_cur || msgnums != NULL) {
                if (*b->first == NULL) {
-                       *b->first = b->node = mh_xmalloc(sizeof(*b->node));
+                       *b->first = b->node = mh_xcalloc(1, sizeof(*b->node));
                } else {
-                       b->node->n_next = mh_xmalloc(sizeof(*b->node));
+                       b->node->n_next = mh_xcalloc(1, sizeof(*b->node));
                        b->node = b->node->n_next;
                }
                b->node->n_name = folder;
@@ -256,12 +253,12 @@ check_folders(struct node **first, struct node **last,
        } else {
                fp = fopen(folders, "r");
                if (fp  == NULL) {
-                       adios(NULL, "failed to read %s", folders);
+                       adios(EX_IOERR, NULL, "failed to read %s", folders);
                }
                while (vfgets(fp, &line) == OK) {
                        len = strlen(line) - 1;
                        line[len] = '\0';
-                       check_folder(getcpy(line), len, &b);
+                       check_folder(mh_xstrdup(line), len, &b);
                }
                fclose(fp);
        }
@@ -283,7 +280,7 @@ join_sequences(char *sequences[])
        for (i = 0; sequences[i] != NULL; i++) {
                len += strlen(sequences[i]) + 1;
        }
-       result = mh_xmalloc(len + 1);
+       result = mh_xcalloc(len + 1, sizeof(char));
 
        for (i = 0, cp = result; sequences[i] != NULL; i++, cp += len + 1) {
                len = strlen(sequences[i]);
@@ -457,28 +454,28 @@ main(int argc, char **argv)
                        switch (smatch(++cp, switches)) {
                        case AMBIGSW:
                                ambigsw(cp, switches);
-                               done(1);
+                               exit(EX_USAGE);
                        case UNKWNSW:
-                               adios(NULL, "-%s unknown", cp);
+                               adios(EX_USAGE, NULL, "-%s unknown", cp);
 
                        case HELPSW:
                                snprintf(help, sizeof(help),
                                                "%s [switches] [sequences]",
                                                invo_name);
                                print_help(help, switches, 1);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
                        case VERSIONSW:
                                print_version(invo_name);
-                               done(1);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
 
                        case FOLDERSSW:
                                if (!(folders = *argp++) || *folders == '-')
-                                       adios(NULL, "missing argument to %s",
+                                       adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
                                continue;
                        case MODESW:
                                if (!(invo_name = *argp++) || *invo_name == '-')
-                                       adios(NULL, "missing argument to %s",
+                                       adios(EX_USAGE, NULL, "missing argument to %s",
                                                        argp[-2]);
                                invo_name = mhbasename(invo_name);
                                continue;
@@ -512,12 +509,12 @@ main(int argc, char **argv)
                /* no sequence arguments; use unseen */
                if ((unseen = context_find(usequence))) {
                        if (!*unseen) {
-                               adios(NULL, "profile entry %s set, but empty, and no sequences given", usequence);
+                               adios(EX_CONFIG, NULL, "profile entry %s set, but empty, and no sequences given", usequence);
                        }
                } else {
                        unseen = seq_unseen;  /* use default */
                }
-               dp = getcpy(unseen);
+               dp = mh_xstrdup(unseen);
                for (ap = brkstring(dp, " ", "\n"); *ap; ap++) {
                        sequences[i++] = *ap;
                }
@@ -526,7 +523,7 @@ main(int argc, char **argv)
 
        folder = doit(context_find(curfolder), folders, sequences);
        if (folder == NULL) {
-               done(0);
+               exit(EX_OK);
                return 1;
        }
 
@@ -550,6 +547,5 @@ main(int argc, char **argv)
 
        context_save();
 
-       done(0);
-       return 1;
+       return 0;
 }