157491Storek /*
2*61818Sbostic * Copyright (c) 1992, 1993
3*61818Sbostic * The Regents of the University of California. All rights reserved.
457491Storek *
557491Storek * This software was developed by the Computer Systems Engineering group
657491Storek * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
757491Storek * contributed to Berkeley.
857491Storek *
957491Storek * All advertising materials mentioning features or use of this software
1057491Storek * must display the following acknowledgement:
1157491Storek * This product includes software developed by the University of
1257491Storek * California, Lawrence Berkeley Laboratories.
1357491Storek *
1457491Storek * %sccs.include.redist.c%
1557491Storek *
16*61818Sbostic * @(#)mkheaders.c 8.1 (Berkeley) 06/06/93
1757491Storek */
1857491Storek
1957491Storek #include <sys/param.h>
2057491Storek #include <ctype.h>
2157491Storek #include <errno.h>
2257491Storek #include <stdio.h>
2357491Storek #include <stdlib.h>
2457491Storek #include <string.h>
2557491Storek #include "config.h"
2657491Storek
2757491Storek static int emitcnt __P((struct nvlist *));
2857491Storek static int err __P((const char *, char *, FILE *));
2957491Storek static char *cntname __P((const char *));
3057491Storek
3157491Storek /*
3257491Storek * Make headers containing counts, as needed.
3357491Storek */
3457491Storek int
mkheaders()3557491Storek mkheaders()
3657491Storek {
3757491Storek register struct files *fi;
3857491Storek
3957491Storek for (fi = allfiles; fi != NULL; fi = fi->fi_next) {
4057491Storek if (fi->fi_flags & FI_HIDDEN)
4157491Storek continue;
4257491Storek if (fi->fi_flags & (FI_NEEDSCOUNT | FI_NEEDSFLAG) &&
4357491Storek emitcnt(fi->fi_opt))
4457491Storek return (1);
4557491Storek }
4657491Storek return (0);
4757491Storek }
4857491Storek
4957491Storek static int
emitcnt(head)5057491Storek emitcnt(head)
5157491Storek register struct nvlist *head;
5257491Storek {
5357491Storek register struct nvlist *nv;
5457491Storek register FILE *fp;
5557491Storek register char *fname;
5657491Storek int cnt;
5757491Storek char nam[100];
5857491Storek char buf[BUFSIZ];
5957491Storek
6057491Storek (void)sprintf(buf, "%s.h", head->nv_name);
6157491Storek fname = path(buf);
6257491Storek if ((fp = fopen(fname, "r")) == NULL)
6357491Storek goto writeit;
6457491Storek nv = head;
6557491Storek while (fgets(buf, sizeof(buf), fp) != NULL) {
6657491Storek if (nv == NULL)
6757491Storek goto writeit;
6857491Storek if (sscanf(buf, "#define %s %d", nam, &cnt) != 2 ||
6957491Storek strcmp(nam, cntname(nv->nv_name)) != 0 ||
7057491Storek cnt != nv->nv_int)
7157491Storek goto writeit;
7257491Storek nv = nv->nv_next;
7357491Storek }
7457491Storek if (ferror(fp))
7557491Storek return (err("read", fname, fp));
7657491Storek (void)fclose(fp);
7757491Storek if (nv == NULL)
7857491Storek return (0);
7957491Storek writeit:
8057491Storek if ((fp = fopen(fname, "w")) == NULL) {
8157491Storek (void)fprintf(stderr, "config: cannot write %s: %s\n",
8257491Storek fname, strerror(errno));
8357491Storek return (1);
8457491Storek }
8557491Storek for (nv = head; nv != NULL; nv = nv->nv_next)
8657491Storek if (fprintf(fp, "#define\t%s\t%d\n",
8757491Storek cntname(nv->nv_name), nv->nv_int) < 0)
8857491Storek return (err("writ", fname, fp));
8957491Storek if (fclose(fp))
9057491Storek return (err("writ", fname, NULL));
9157491Storek return (0);
9257491Storek }
9357491Storek
9457491Storek static int
err(what,fname,fp)9557491Storek err(what, fname, fp)
9657491Storek const char *what;
9757491Storek char *fname;
9857491Storek FILE *fp;
9957491Storek {
10057491Storek
10157491Storek (void)fprintf(stderr, "config: error %sing %s: %s\n",
10257491Storek what, fname, strerror(errno));
10357491Storek if (fp)
10457491Storek (void)fclose(fp);
10557491Storek free(fname);
10657491Storek return (1);
10757491Storek }
10857491Storek
10957491Storek static char *
cntname(src)11057491Storek cntname(src)
11157491Storek register const char *src;
11257491Storek {
11357491Storek register char *dst, c;
11457491Storek static char buf[100];
11557491Storek
11657491Storek dst = buf;
11757491Storek *dst++ = 'N';
11857491Storek while ((c = *src++) != 0)
11957491Storek *dst++ = islower(c) ? toupper(c) : c;
12057491Storek *dst = 0;
12157491Storek return (buf);
12257491Storek }
123