Fix unreproducible build
[mmh] / sbr / seq_read.c
index 448f9ef..041f632 100644 (file)
@@ -7,15 +7,16 @@
 ** complete copyright information.
 */
 
+#include <sysexits.h>
 #include <h/mh.h>
 #include <h/utils.h>
 
 /*
 ** static prototypes
 */
-static int seq_init (struct msgs *, char *, char *);
-static void seq_public (struct msgs *);
-static void seq_private (struct msgs *);
+static int seq_init(struct msgs *, char *, char *);
+static void seq_public(struct msgs *);
+static void seq_private(struct msgs *);
 
 
 /*
@@ -25,25 +26,25 @@ static void seq_private (struct msgs *);
 */
 
 void
-seq_read (struct msgs *mp)
+seq_read(struct msgs *mp)
 {
        /*
        ** Initialize the list of sequence names.  Go ahead and
-       ** add the "cur" sequence to the list of sequences.
+       ** add the cur sequence to the list of sequences.
        */
-       mp->msgattrs[0] = getcpy (current);
+       mp->msgattrs[0] = mh_xstrdup(seq_cur);
        mp->msgattrs[1] = NULL;
-       make_all_public (mp);  /* initially, make all public */
+       make_all_public(mp);  /* initially, make all public */
 
        /* If folder is empty, don't scan for sequence information */
        if (mp->nummsg == 0)
                return;
 
        /* Initialize the public sequences */
-       seq_public (mp);
+       seq_public(mp);
 
        /* Initialize the private sequences */
-       seq_private (mp);
+       seq_private(mp);
 }
 
 
@@ -52,64 +53,51 @@ seq_read (struct msgs *mp)
 */
 
 static void
-seq_public (struct msgs *mp)
+seq_public(struct msgs *mp)
 {
-       int state;
-       char *cp, seqfile[PATH_MAX];
-       char name[NAMESZ], field[BUFSIZ];
+       enum state state;
+       struct field f = {{0}};
+       char seqfile[PATH_MAX];
        FILE *fp;
 
        /*
-       ** If mh_seq == NULL (such as if nmh been compiled with
-       ** NOPUBLICSEQ), or if *mh_seq == '\0' (the user has defined
-       ** the "mh-sequences" profile entry, but left it empty),
-       ** then just return, and do not initialize any public sequences.
+       ** If public sequences are disabled (e.g. the user has defined
+       ** an empty `Mh-Sequences' profile entry), then just return.
        */
        if (mh_seq == NULL || *mh_seq == '\0')
                return;
 
        /* get filename of sequence file */
-       snprintf (seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq);
+       snprintf(seqfile, sizeof(seqfile), "%s/%s", mp->foldpath, mh_seq);
 
-       if ((fp = lkfopen (seqfile, "r")) == NULL)
+       if ((fp = lkfopen(seqfile, "r")) == NULL)
                return;
 
        /* Use m_getfld to scan sequence file */
-       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);
-                                       }
-                                       seq_init (mp, getcpy (name), trimcpy (cp));
-                                       free (cp);
-                               } else {
-                                       seq_init (mp, getcpy (name), trimcpy (field));
-                               }
-                               if (state == FLDEOF)
-                                       break;
-                               continue;
-
-                       case BODY:
-                       case BODYEOF:
-                               adios (NULL, "no blank lines are permitted in %s", seqfile);
-                               /* fall */
-
-                       case FILEEOF:
-                               break;
-
-                       default:
-                               adios (NULL, "%s is poorly formatted", seqfile);
+       for (state = FLD2;;) {
+               switch (state = m_getfld2(state, &f, fp)) {
+               case LENERR2:
+                       state = FLD2;
+                       /* FALL */
+               case FLD2:
+                       seq_init(mp, mh_xstrdup(f.name), trimcpy(f.value));
+                       continue;
+
+               case BODY2:
+                       adios(EX_CONFIG, NULL, "no blank lines are permitted in %s",
+                                       seqfile);
+                       /* FALL */
+
+               case FILEEOF2:
+                       break;
+
+               default:
+                       adios(EX_CONFIG, NULL, "%s is poorly formatted", seqfile);
                }
-               break;  /* break from for loop */
+               break;
        }
 
-       lkfclose (fp, seqfile);
+       lkfclose(fp, seqfile);
 }
 
 
@@ -121,24 +109,24 @@ seq_public (struct msgs *mp)
 */
 
 static void
-seq_private (struct msgs *mp)
+seq_private(struct msgs *mp)
 {
        int i, j, alen, plen;
        char *cp;
        struct node *np;
 
-       alen = strlen ("atr-");
-       plen = strlen (mp->foldpath) + 1;
+       alen = strlen("atr-");
+       plen = strlen(mp->foldpath) + 1;
 
        for (np = m_defs; np; np = np->n_next) {
-               if (ssequal ("atr-", np->n_name)
-                       && (j = strlen (np->n_name) - plen) > alen
-                       && *(np->n_name + j) == '-'
-                       && strcmp (mp->foldpath, np->n_name + j + 1) == 0) {
-                       cp = getcpy (np->n_name + alen);
+               if (strncmp(np->n_name, "atr-", alen)==0 &&
+                               (j = strlen(np->n_name) - plen) > alen &&
+                               *(np->n_name + j) == '-' &&
+                               strcmp(mp->foldpath, np->n_name + j + 1)==0) {
+                       cp = mh_xstrdup(np->n_name + alen);
                        *(cp + j - alen) = '\0';
-                       if ((i = seq_init (mp, cp, getcpy (np->n_field))) != -1)
-                               make_seq_private (mp, i);
+                       if ((i = seq_init(mp, cp, mh_xstrdup(np->n_field))) != -1)
+                               make_seq_private(mp, i);
                }
        }
 }
@@ -155,16 +143,17 @@ seq_private (struct msgs *mp)
 */
 
 static int
-seq_init (struct msgs *mp, char *name, char *field)
+seq_init(struct msgs *mp, char *name, char *field)
 {
-       int i, j, k, is_current;
+       unsigned int i;
+       int j, k, is_current;
        char *cp, **ap;
 
        /*
-       ** Check if this is "cur" sequence,
+       ** Check if this is the cur sequence,
        ** so we can do some special things.
        */
-       is_current = !strcmp (current, name);
+       is_current = (strcmp(seq_cur, name)==0);
 
        /*
        ** Search for this sequence name to see if we've seen
@@ -173,17 +162,17 @@ seq_init (struct msgs *mp, char *name, char *field)
        ** mesages in this folder.
        */
        for (i = 0; mp->msgattrs[i]; i++) {
-               if (!strcmp (mp->msgattrs[i], name)) {
+               if (strcmp(mp->msgattrs[i], name)==0) {
                        for (j = mp->lowmsg; j <= mp->hghmsg; j++)
-                               clear_sequence (mp, i, j);
+                               clear_sequence(mp, i, j);
                        break;
                }
        }
 
        /* Return error, if too many sequences */
        if (i >= NUMATTRS) {
-               free (name);
-               free (field);
+               mh_free0(&name);
+               mh_free0(&field);
                return -1;
        }
 
@@ -192,7 +181,7 @@ seq_init (struct msgs *mp, char *name, char *field)
        ** name string.  Else add it to the list of sequence names.
        */
        if (mp->msgattrs[i]) {
-               free (name);
+               mh_free0(&name);
        } else {
                mp->msgattrs[i] = name;
                mp->msgattrs[i + 1] = NULL;
@@ -201,14 +190,14 @@ seq_init (struct msgs *mp, char *name, char *field)
        /*
        ** Split up the different message ranges at whitespace
        */
-       for (ap = brkstring (field, " ", "\n"); *ap; ap++) {
+       for (ap = brkstring(field, " ", "\n"); *ap; ap++) {
                if ((cp = strchr(*ap, '-')))
                        *cp++ = '\0';
-               if ((j = m_atoi (*ap)) > 0) {
-                       k = cp ? m_atoi (cp) : j;
+               if ((j = m_atoi(*ap)) > 0) {
+                       k = cp ? m_atoi(cp) : j;
 
                        /*
-                       ** Keep mp->curmsg and "cur" sequence in synch.  Unlike
+                       ** Keep mp->curmsg and cur sequence in sync.  Unlike
                        ** other sequences, this message doesn't need to exist.
                        ** Think about the series of command (rmm; next) to
                        ** understand why this can be the case.  But if it does
@@ -222,12 +211,13 @@ seq_init (struct msgs *mp, char *name, char *field)
                        ** and flip on bit for this sequence.
                        */
                        for (; j <= k; j++) {
-                               if (j >= mp->lowmsg && j <= mp->hghmsg && does_exist(mp, j))
-                                       add_sequence (mp, i, j);
+                               if (j >= mp->lowmsg && j <= mp->hghmsg &&
+                                               does_exist(mp, j))
+                                       add_sequence(mp, i, j);
                        }
                }
        }
 
-       free (field);  /* free string containing message ranges */
+       mh_free0(&field);  /* free string containing message ranges */
        return i;
 }