1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
/*
* readconfig.c -- base routine to read nmh configuration files
* -- such as nmh profile, context file, or mhn.defaults.
*
* $Id: readconfig.c,v 1.1.1.1 1999/04/30 18:08:34 doug Exp $
*/
#include <h/mh.h>
struct procstr {
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 }
};
static struct node **opp = NULL;
void
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;
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;
/*
* 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;
case BODY:
case BODYEOF:
adios (NULL, "no blank lines are permitted in %s", file);
case FILEEOF:
break;
default:
adios (NULL, "%s is poorly formatted", file);
}
break;
}
opp = npp;
}
|