3cc8b7b0a66426c04492cc10edad66bc032ea2f3
[mmh] / sbr / readconfig.c
1 /*
2 ** readconfig.c -- base routine to read nmh configuration files
3 **              -- such as nmh profile, context file, or mhn.defaults.
4 **
5 ** This code is Copyright (c) 2002, by the authors of nmh.  See the
6 ** COPYRIGHT file in the root directory of the nmh distribution for
7 ** complete copyright information.
8 */
9
10 #include <h/mh.h>
11 #include <h/utils.h>
12
13 struct procstr {
14         char *procname;
15         char **procnaddr;
16 };
17
18 static struct procstr procs[] = {
19         { "context",       &context },
20         { "mh-sequences",  &mh_seq },
21         { "backup-prefix", &backup_prefix },
22         { "draft-folder",  &draftfolder },
23         { "altmsg-link",   &altmsglink },
24         { "buildmimeproc", &buildmimeproc },
25         { "faceproc",      &faceproc },
26         { "fileproc",      &fileproc },
27         { "incproc",       &incproc },
28         { "lproc",         &lproc },
29         { "mailproc",      &mailproc },
30         { "mhlproc",       &mhlproc },
31         { "moreproc",      &moreproc },
32         { "postproc",      &postproc },
33         { "rmmproc",       &rmmproc },
34         { "sendmail",      &sendmail },
35         { "sendproc",      &sendproc },
36         { "showmimeproc",  &showmimeproc },
37         { "showproc",      &showproc },
38         { "whatnowproc",   &whatnowproc },
39         { NULL, NULL }
40 };
41
42 static struct node **opp = NULL;
43
44
45 void
46 readconfig(struct node **npp, FILE *ib, char *file, int ctx)
47 {
48         register int state;
49         register char *cp;
50         char name[NAMESZ], field[BUFSIZ];
51         register struct node *np;
52         register struct procstr *ps;
53
54         if (npp == NULL && (npp = opp) == NULL) {
55                 admonish(NULL, "bug: readconfig called but pump not primed");
56                 return;
57         }
58
59         for (state = FLD;;) {
60                 switch (state = m_getfld(state, name, field, sizeof(field), ib)) {
61                         case FLD:
62                         case FLDPLUS:
63                         case FLDEOF:
64                                 np = (struct node *) mh_xmalloc(sizeof(*np));
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(state, name, field, sizeof(field), ib);
72                                                 cp = add(field, cp);
73                                         }
74                                         np->n_field = trimcpy(cp);
75                                         free(cp);
76                                 } else {
77                                         np->n_field = trimcpy(field);
78                                 }
79                                 np->n_context = ctx;
80
81                                 /*
82                                 ** Now scan the list of `procs' and link in
83                                 ** the field value to the global variable.
84                                 */
85                                 for (ps = procs; ps->procname; ps++)
86                                         if (mh_strcasecmp(np->n_name,
87                                                         ps->procname) == 0) {
88                                                 *ps->procnaddr = np->n_field;
89                                                 break;
90                                         }
91                                 if (state == FLDEOF)
92                                         break;
93                                 continue;
94
95                         case BODY:
96                         case BODYEOF:
97                                 adios(NULL, "no blank lines are permitted in %s", file);
98
99                         case FILEEOF:
100                                 break;
101
102                         default:
103                                 adios(NULL, "%s is poorly formatted", file);
104                 }
105                 break;
106         }
107
108         opp = npp;
109 }