add free_field as standard for struct field
[mmh] / sbr / readconfig.c
index 9cd128e..645a9ef 100644 (file)
-
 /*
- * readconfig.c -- base routine to read nmh configuration files
- *              -- such as nmh profile, context file, or mhn.defaults.
- *
- * $Id$
- */
+** readconfig.c -- base routine to read nmh configuration files
+**              -- such as nmh profile, context file, or mhn.defaults.
+**
+** 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 <sysexits.h>
 #include <h/mh.h>
+#include <h/utils.h>
 
 struct procstr {
-    char *procname;
-    char **procnaddr;
+       char *procname;
+       char **procnaddr;
 };
 
 static struct procstr procs[] = {
-    { "context",       &context },
-    { "mh-sequences",  &mh_seq },
-    { "buildmimeproc", &buildmimeproc },
-    { "faceproc",      &faceproc },
-    { "fileproc",      &fileproc },
-    { "incproc",       &incproc },
-    { "installproc",   &installproc },
-    { "lproc",         &lproc },
-    { "mailproc",      &mailproc },
-    { "mhlproc",       &mhlproc },
-    { "moreproc",      &moreproc },
-    { "mshproc",       &mshproc },
-    { "packproc",      &packproc },
-    { "postproc",      &postproc },
-    { "rmfproc",       &rmfproc },
-    { "rmmproc",       &rmmproc },
-    { "sendproc",      &sendproc },
-    { "showmimeproc",  &showmimeproc },
-    { "showproc",      &showproc },
-    { "vmhproc",       &vmhproc },
-    { "whatnowproc",   &whatnowproc },
-    { "whomproc",      &whomproc },
-    { NULL,            NULL }
+       { "attachment-header",  &attach_hdr },
+       { "sign-header",   &sign_hdr },
+       { "enc-header",    &enc_hdr },
+       { "context",       &context },
+       { "mh-sequences",  &mh_seq },
+       { "draft-folder",  &draftfolder },
+       { "listproc",      &listproc },
+       { "sendmail",      &sendmail },
+       { "trash-folder",  &trashfolder },
+       { "whatnowproc",   &whatnowproc },
+       { NULL, NULL }
 };
 
 static struct node **opp = NULL;
 
 
 void
-readconfig (struct node **npp, FILE *ib, char *file, int ctx)
+readconfig(struct node **npp, FILE *ib, char *file, int ctx)
 {
-    register int state;
-    register char *cp;
-    char name[NAMESZ], field[BUFSIZ];
-    register struct node *np;
-    register struct procstr *ps;
+       enum state state;
+       struct field f = free_field;
+       struct node *np;
+       struct procstr *ps;
 
-    if (npp == NULL && (npp = opp) == NULL) {
-       admonish (NULL, "bug: readconfig called but pump not primed");
-       return;
-    }
+       if (npp == NULL && (npp = opp) == NULL) {
+               admonish(NULL, "bug: readconfig called but pump not primed");
+               return;
+       }
 
-    for (state = FLD;;) {
-       switch (state = m_getfld (state, name, field, sizeof(field), ib)) {
-           case FLD:
-           case FLDPLUS:
-           case FLDEOF:
-               if (!(np = (struct node *) malloc (sizeof(*np))))
-                   adios (NULL, "unable to allocate profile storage");
-               *npp = np;
-               *(npp = &np->n_next) = NULL;
-               np->n_name = getcpy (name);
-               if (state == FLDPLUS) {
-                   cp = getcpy (field);
-                   while (state == FLDPLUS) {
-                       state = m_getfld (state, name, field, sizeof(field), ib);
-                       cp = add (field, cp);
-                   }
-                   np->n_field = trimcpy (cp);
-                   free (cp);
-               } else {
-                   np->n_field = trimcpy (field);
-               }
-               np->n_context = ctx;
+       for (state = FLD2;;) {
+               switch (state = m_getfld2(state, &f, ib)) {
+               case FLD2:
+                       np = (struct node *) mh_xmalloc(sizeof(*np));
+                       *npp = np;
+                       *(npp = &np->n_next) = NULL;
+                       np->n_name = getcpy(f.name);
+                       np->n_field = trimcpy(f.value);
+                       np->n_context = ctx;
 
-               /*
-                * Now scan the list of `procs' and link in the
-                * field value to the global variable.
-                */
-               for (ps = procs; ps->procname; ps++)
-                   if (strcmp (np->n_name, ps->procname) == 0) {
-                       *ps->procnaddr = np->n_field;
-                       break;
-                   }
-               if (state == FLDEOF)
-                   break;
-               continue;
+                       /*
+                       ** Now scan the list of `procs' and link in
+                       ** the field value to the global variable.
+                       */
+                       for (ps = procs; ps->procname; ps++) {
+                               if (mh_strcasecmp(np->n_name,
+                                               ps->procname) == 0) {
+                                       *ps->procnaddr = np->n_field;
+                                       break;
+                               }
+                       }
+                       continue;
 
-           case BODY:
-           case BODYEOF:
-               adios (NULL, "no blank lines are permitted in %s", file);
+               case BODY2:
+                       adios(EX_CONFIG, NULL, "no blank lines are permitted in %s",
+                                       file);
 
-           case FILEEOF:
-               break;
+               case FILEEOF2:
+                       break;
 
-           default:
-               adios (NULL, "%s is poorly formatted", file);
+               default:
+                       adios(EX_CONFIG, NULL, "%s is poorly formatted", file);
+               }
+               break;
        }
-       break;
-    }
 
-    opp = npp;
+       opp = npp;
 }