/* m_readefs.c - read a profile/context file */ #include "../h/mh.h" #include static struct procs { char *procname; char **procnaddr; } procs [] = { { "context", &context }, { "mh-sequences", &mh_seq }, { "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 }, { "showproc", &showproc }, { "slocalproc", &slocalproc }, { "vmhproc", &vmhproc }, { "whatnowproc", &whatnowproc }, { "whomproc", &whomproc }, { NULL, NULL } }; static struct node **opp = NULL; void m_readefs (npp, ib, file, ctx) register struct node **npp; register FILE *ib; register char *file; register int ctx; { register int state; register char *cp; char name[NAMESZ], field[BUFSIZ]; register struct node *np; register struct procs *ps; if (npp == NULL && (npp = opp) == NULL) { admonish (NULLCP, "bug: m_readefs 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: np = (struct node *) malloc (sizeof *np); if (np == NULL) adios (NULLCP, "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 (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 (NULLCP, "no blank lines are permitted in %s", file); case FILEEOF: break; default: adios (NULLCP, "%s is poorly formatted", file); } break; } opp = npp; }