1: /* m_readefs.c - read a profile/context file */ 2: 3: #include "../h/mh.h" 4: #include <stdio.h> 5: 6: 7: static struct procs { 8: char *procname; 9: char **procnaddr; 10: } procs [] = { 11: { "context", &context }, 12: { "mh-sequences", 13: &mh_seq }, 14: { "fileproc", &fileproc }, 15: { "incproc", &incproc }, 16: { "installproc",&installproc }, 17: { "lproc", &lproc }, 18: { "mailproc", &mailproc }, 19: { "mhlproc", &mhlproc }, 20: { "moreproc", &moreproc }, 21: { "mshproc", &mshproc }, 22: { "packproc", &packproc }, 23: { "postproc", &postproc }, 24: { "rmfproc", &rmfproc }, 25: { "rmmproc", &rmmproc }, 26: { "sendproc", &sendproc }, 27: { "showproc", &showproc }, 28: { "slocalproc", &slocalproc }, 29: { "vmhproc", &vmhproc }, 30: { "whatnowproc", 31: &whatnowproc }, 32: { "whomproc", &whomproc }, 33: { NULL, NULL } 34: }; 35: 36: static struct node **opp = NULL; 37: 38: 39: void m_readefs (npp, ib, file, ctx) 40: register struct node **npp; 41: register FILE *ib; 42: register char *file; 43: register int ctx; 44: { 45: register int state; 46: register char *cp; 47: char name[NAMESZ], 48: field[BUFSIZ]; 49: register struct node *np; 50: register struct procs *ps; 51: 52: if (npp == NULL && (npp = opp) == NULL) { 53: admonish (NULLCP, "bug: m_readefs called but pump not primed"); 54: return; 55: } 56: 57: for (state = FLD;;) { 58: switch (state = m_getfld (state, name, field, sizeof field, ib)) { 59: case FLD: 60: case FLDPLUS: 61: case FLDEOF: 62: np = (struct node *) malloc (sizeof *np); 63: if (np == NULL) 64: adios (NULLCP, "unable to allocate profile storage"); 65: *npp = np; 66: *(npp = &np -> n_next) = NULL; 67: np -> n_name = getcpy (name); 68: if (state == FLDPLUS) { 69: cp = getcpy (field); 70: while (state == FLDPLUS) { 71: state = m_getfld 72: (state, name, field, sizeof field, ib); 73: cp = add (field, cp); 74: } 75: np -> n_field = trimcpy (cp); 76: free (cp); 77: } 78: else 79: np -> n_field = trimcpy (field); 80: np -> n_context = ctx; 81: for (ps = procs; ps -> procname; ps++) 82: if (strcmp (np -> n_name, ps -> procname) == 0) { 83: *ps -> procnaddr = np -> n_field; 84: break; 85: } 86: if (state == FLDEOF) 87: break; 88: continue; 89: 90: case BODY: 91: case BODYEOF: 92: adios (NULLCP, "no blank lines are permitted in %s", file); 93: 94: case FILEEOF: 95: break; 96: 97: default: 98: adios (NULLCP, "%s is poorly formatted", file); 99: } 100: break; 101: } 102: 103: opp = npp; 104: }