add free_field as standard for struct field
[mmh] / uip / new.c
index 1ea9010..60bb806 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
@@ -94,11 +95,10 @@ seq_in_list(char *name, char *sequences[])
 static char *
 get_msgnums(char *folder, char *sequences[])
 {
+       enum state state;
+       struct field f = free_field;
        char *seqfile = concat(toabsdir(folder), "/", mh_seq, (void *)NULL);
        FILE *fp = fopen(seqfile, "r");
-       int state;
-       char name[NAMESZ], field[BUFSIZ];
-       char *cp;
        char *msgnums = NULL, *this_msgnums, *old_msgnums;
 
        /* no sequences file -> no messages */
@@ -106,71 +106,39 @@ get_msgnums(char *folder, char *sequences[])
                return NULL;
        }
 
-       /* copied from seq_read.c:seq_public */
-       for (state = FLD;;) {
-               switch (state = m_getfld(state, name, field, sizeof(field),
-                               fp)) {
-               case FLD:
-               case FLDPLUS:
-               case FLDEOF:
-                       if (state == FLDPLUS) {
-                               cp = getcpy(field);
-                               while (state == FLDPLUS) {
-                                       state = m_getfld(state, name, field,
-                                                       sizeof(field), fp);
-                                       cp = add(field, cp);
-                               }
-
-                               /*
-                               ** Here's where we differ from
-                               ** seq_public: if it's in a
-                               ** sequence we want, save the list
-                               ** of messages.
-                               */
-                               if (seq_in_list(name, sequences)) {
-                                       this_msgnums = trimcpy(cp);
-                                       if (msgnums == NULL) {
-                                               msgnums = this_msgnums;
-                                       } else {
-                                               old_msgnums = msgnums;
-                                               msgnums = concat(old_msgnums, " ", this_msgnums, (void *)NULL);
-                                               free(old_msgnums);
-                                               free(this_msgnums);
-                                       }
-                               }
-                               free(cp);
-                       } else {
-                               /* and here */
-                               if (seq_in_list(name, sequences)) {
-                                       this_msgnums = trimcpy(field);
-                                       if (msgnums == NULL) {
-                                               msgnums = this_msgnums;
-                                       } else {
-                                               old_msgnums = msgnums;
-                                               msgnums = concat(old_msgnums, " ", this_msgnums, (void *)NULL);
-                                               free(old_msgnums);
-                                               free(this_msgnums);
-                                       }
+       for (state = FLD2;;) {
+               switch (state = m_getfld2(state, &f, fp)) {
+               case FLD2:
+                       /*
+                       ** if it's in a sequence we want,
+                       ** save the list of messages.
+                       */
+                       if (seq_in_list(f.name, sequences)) {
+                               this_msgnums = trimcpy(f.value);
+                               if (msgnums == NULL) {
+                                       msgnums = this_msgnums;
+                               } else {
+                                       old_msgnums = msgnums;
+                                       msgnums = concat(old_msgnums, " ",
+                                                       this_msgnums,
+                                                       (void *)NULL);
+                                       free(old_msgnums);
+                                       free(this_msgnums);
                                }
                        }
-
-                       if (state == FLDEOF)
-                               break;
                        continue;
 
-               case BODY:
-               case BODYEOF:
-                       adios(NULL, "no blank lines are permitted in %s",
-                                       seqfile);
-                       /* fall */
+               case BODY2:
+                       adios(EX_DATAERR, NULL, "no blank lines are permitted in %s", seqfile);
+                       /* FALL */
 
-               case FILEEOF:
+               case FILEEOF2:
                        break;
 
                default:
-                       adios(NULL, "%s is poorly formatted", seqfile);
+                       adios(EX_SOFTWARE, NULL, "%s is poorly formatted", seqfile);
                }
-               break;  /* break from for loop */
+               break;
        }
 
        fclose(fp);
@@ -256,7 +224,7 @@ 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;
@@ -314,7 +282,7 @@ doit(char *cur, char *folders, char *sequences[])
        char *sequences_s = NULL;
        int argc = 0;
        char *argv[MAXARGS];
-       char *cp;
+       char **seqp;
        char buf[BUFSIZ];
 
        if (cur == NULL || cur[0] == '\0') {
@@ -391,8 +359,8 @@ doit(char *cur, char *folders, char *sequences[])
                        argv[argc++] = "scan";
                        snprintf(buf, sizeof buf, "+%s", node->n_name);
                        argv[argc++] = buf;
-                       for (cp=*sequences; *cp; cp++) {
-                               argv[argc++] = cp;
+                       for (seqp=sequences; *seqp; seqp++) {
+                               argv[argc++] = *seqp;
                        }
                        argv[argc] = (char *)NULL;
                        execprog(*argv, argv);
@@ -457,28 +425,28 @@ main(int argc, char **argv)
                        switch (smatch(++cp, switches)) {
                        case AMBIGSW:
                                ambigsw(cp, switches);
-                               exit(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);
-                               exit(0);
+                               exit(argc == 2 ? EX_OK : EX_USAGE);
                        case VERSIONSW:
                                print_version(invo_name);
-                               exit(0);
+                               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,7 +480,7 @@ 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 */
@@ -526,7 +494,7 @@ main(int argc, char **argv)
 
        folder = doit(context_find(curfolder), folders, sequences);
        if (folder == NULL) {
-               exit(0);
+               exit(EX_OK);
                return 1;
        }