1 /*
2  * Copyright (c) 1992, 1993
3  *	The Regents of the University of California.  All rights reserved.
4  *
5  * This software was developed by the Computer Systems Engineering group
6  * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
7  * contributed to Berkeley.
8  *
9  * All advertising materials mentioning features or use of this software
10  * must display the following acknowledgement:
11  *	This product includes software developed by the University of
12  *	California, Lawrence Berkeley Laboratories.
13  *
14  * %sccs.include.redist.c%
15  *
16  *	@(#)mkheaders.c	8.1 (Berkeley) 06/06/93
17  */
18 
19 #include <sys/param.h>
20 #include <ctype.h>
21 #include <errno.h>
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include "config.h"
26 
27 static int emitcnt __P((struct nvlist *));
28 static int err __P((const char *, char *, FILE *));
29 static char *cntname __P((const char *));
30 
31 /*
32  * Make headers containing counts, as needed.
33  */
34 int
35 mkheaders()
36 {
37 	register struct files *fi;
38 
39 	for (fi = allfiles; fi != NULL; fi = fi->fi_next) {
40 		if (fi->fi_flags & FI_HIDDEN)
41 			continue;
42 		if (fi->fi_flags & (FI_NEEDSCOUNT | FI_NEEDSFLAG) &&
43 		    emitcnt(fi->fi_opt))
44 			return (1);
45 	}
46 	return (0);
47 }
48 
49 static int
50 emitcnt(head)
51 	register struct nvlist *head;
52 {
53 	register struct nvlist *nv;
54 	register FILE *fp;
55 	register char *fname;
56 	int cnt;
57 	char nam[100];
58 	char buf[BUFSIZ];
59 
60 	(void)sprintf(buf, "%s.h", head->nv_name);
61 	fname = path(buf);
62 	if ((fp = fopen(fname, "r")) == NULL)
63 		goto writeit;
64 	nv = head;
65 	while (fgets(buf, sizeof(buf), fp) != NULL) {
66 		if (nv == NULL)
67 			goto writeit;
68 		if (sscanf(buf, "#define %s %d", nam, &cnt) != 2 ||
69 		    strcmp(nam, cntname(nv->nv_name)) != 0 ||
70 		    cnt != nv->nv_int)
71 			goto writeit;
72 		nv = nv->nv_next;
73 	}
74 	if (ferror(fp))
75 		return (err("read", fname, fp));
76 	(void)fclose(fp);
77 	if (nv == NULL)
78 		return (0);
79 writeit:
80 	if ((fp = fopen(fname, "w")) == NULL) {
81 		(void)fprintf(stderr, "config: cannot write %s: %s\n",
82 		    fname, strerror(errno));
83 		return (1);
84 	}
85 	for (nv = head; nv != NULL; nv = nv->nv_next)
86 		if (fprintf(fp, "#define\t%s\t%d\n",
87 		    cntname(nv->nv_name), nv->nv_int) < 0)
88 			return (err("writ", fname, fp));
89 	if (fclose(fp))
90 		return (err("writ", fname, NULL));
91 	return (0);
92 }
93 
94 static int
95 err(what, fname, fp)
96 	const char *what;
97 	char *fname;
98 	FILE *fp;
99 {
100 
101 	(void)fprintf(stderr, "config: error %sing %s: %s\n",
102 	    what, fname, strerror(errno));
103 	if (fp)
104 		(void)fclose(fp);
105 	free(fname);
106 	return (1);
107 }
108 
109 static char *
110 cntname(src)
111 	register const char *src;
112 {
113 	register char *dst, c;
114 	static char buf[100];
115 
116 	dst = buf;
117 	*dst++ = 'N';
118 	while ((c = *src++) != 0)
119 		*dst++ = islower(c) ? toupper(c) : c;
120 	*dst = 0;
121 	return (buf);
122 }
123