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