xref: /freebsd/usr.sbin/config/mkheaders.c (revision f71c01cc52475d4d03347c3019afa928ae46edb1)
1dea673e9SRodney W. Grimes /*
2dea673e9SRodney W. Grimes  * Copyright (c) 1980, 1993
3dea673e9SRodney W. Grimes  *	The Regents of the University of California.  All rights reserved.
4dea673e9SRodney W. Grimes  *
5dea673e9SRodney W. Grimes  * Redistribution and use in source and binary forms, with or without
6dea673e9SRodney W. Grimes  * modification, are permitted provided that the following conditions
7dea673e9SRodney W. Grimes  * are met:
8dea673e9SRodney W. Grimes  * 1. Redistributions of source code must retain the above copyright
9dea673e9SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer.
10dea673e9SRodney W. Grimes  * 2. Redistributions in binary form must reproduce the above copyright
11dea673e9SRodney W. Grimes  *    notice, this list of conditions and the following disclaimer in the
12dea673e9SRodney W. Grimes  *    documentation and/or other materials provided with the distribution.
13dea673e9SRodney W. Grimes  * 3. All advertising materials mentioning features or use of this software
14dea673e9SRodney W. Grimes  *    must display the following acknowledgement:
15dea673e9SRodney W. Grimes  *	This product includes software developed by the University of
16dea673e9SRodney W. Grimes  *	California, Berkeley and its contributors.
17dea673e9SRodney W. Grimes  * 4. Neither the name of the University nor the names of its contributors
18dea673e9SRodney W. Grimes  *    may be used to endorse or promote products derived from this software
19dea673e9SRodney W. Grimes  *    without specific prior written permission.
20dea673e9SRodney W. Grimes  *
21dea673e9SRodney W. Grimes  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22dea673e9SRodney W. Grimes  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23dea673e9SRodney W. Grimes  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24dea673e9SRodney W. Grimes  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25dea673e9SRodney W. Grimes  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26dea673e9SRodney W. Grimes  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27dea673e9SRodney W. Grimes  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28dea673e9SRodney W. Grimes  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29dea673e9SRodney W. Grimes  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30dea673e9SRodney W. Grimes  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31dea673e9SRodney W. Grimes  * SUCH DAMAGE.
32dea673e9SRodney W. Grimes  */
33dea673e9SRodney W. Grimes 
34dea673e9SRodney W. Grimes #ifndef lint
35d5831691SPhilippe Charnier #if 0
36dea673e9SRodney W. Grimes static char sccsid[] = "@(#)mkheaders.c	8.1 (Berkeley) 6/6/93";
37d5831691SPhilippe Charnier #endif
38d5831691SPhilippe Charnier static const char rcsid[] =
3997d92980SPeter Wemm   "$FreeBSD$";
40dea673e9SRodney W. Grimes #endif /* not lint */
41dea673e9SRodney W. Grimes 
42dea673e9SRodney W. Grimes /*
43dea673e9SRodney W. Grimes  * Make all the .h files for the optional entries
44dea673e9SRodney W. Grimes  */
45dea673e9SRodney W. Grimes 
46d5831691SPhilippe Charnier #include <ctype.h>
47d5831691SPhilippe Charnier #include <err.h>
48dea673e9SRodney W. Grimes #include <stdio.h>
495bd7b809SJoerg Wunsch #include <string.h>
50dea673e9SRodney W. Grimes #include "config.h"
511d95dc91SPoul-Henning Kamp #include "y.tab.h"
52dea673e9SRodney W. Grimes 
53f71c01ccSPeter Wemm static void do_header(char *, int);
54f71c01ccSPeter Wemm static void do_count(char *);
55f71c01ccSPeter Wemm static char *toheader(char *);
56f71c01ccSPeter Wemm static char *tomacro(char *);
57d5831691SPhilippe Charnier 
58d5831691SPhilippe Charnier void
59f71c01ccSPeter Wemm headers(void)
60dea673e9SRodney W. Grimes {
61f71c01ccSPeter Wemm 	struct file_list *fl;
62cea24a2bSJoerg Wunsch 	struct device *dp;
63dea673e9SRodney W. Grimes 
643f664fc6SPeter Wemm 	for (fl = ftab; fl != 0; fl = fl->f_next) {
653f664fc6SPeter Wemm 		if (fl->f_needs != 0) {
663f664fc6SPeter Wemm 			for (dp = dtab; dp != 0; dp = dp->d_next) {
673f664fc6SPeter Wemm 				if (eq(dp->d_name, fl->f_needs)) {
68f71c01ccSPeter Wemm 					if ((dp->d_type & TYPEMASK) == DEVICE)
693f664fc6SPeter Wemm 						dp->d_type |= DEVDONE;
703f664fc6SPeter Wemm 				}
713f664fc6SPeter Wemm 			}
723f664fc6SPeter Wemm 			if (fl->f_flags & NEED_COUNT)
733f664fc6SPeter Wemm 				do_count(fl->f_needs);
743f664fc6SPeter Wemm 		}
753f664fc6SPeter Wemm 	}
76ed7e72e6SPeter Wemm 	for (dp = dtab; dp != 0; dp = dp->d_next) {
77ed7e72e6SPeter Wemm 		if ((dp->d_type & TYPEMASK) == DEVICE) {
78ed7e72e6SPeter Wemm 			if (!(dp->d_type & DEVDONE))
79ed7e72e6SPeter Wemm 				printf("Warning: device \"%s\" is unknown\n",
80ed7e72e6SPeter Wemm 				       dp->d_name);
81952017beSPeter Wemm 		}
82ed7e72e6SPeter Wemm 	}
83dea673e9SRodney W. Grimes }
84dea673e9SRodney W. Grimes 
85dea673e9SRodney W. Grimes /*
86dea673e9SRodney W. Grimes  * count all the devices of a certain type and recurse to count
87dea673e9SRodney W. Grimes  * whatever the device is connected to
88dea673e9SRodney W. Grimes  */
89188334f6SPeter Wemm static void
90f71c01ccSPeter Wemm do_count(char *dev)
91dea673e9SRodney W. Grimes {
92f71c01ccSPeter Wemm 	struct device *dp;
93f71c01ccSPeter Wemm 	int count, hicount;
94dea673e9SRodney W. Grimes 
95dea673e9SRodney W. Grimes 	/*
96dea673e9SRodney W. Grimes 	 * After this loop, "count" will be the actual number of units,
97dea673e9SRodney W. Grimes 	 * and "hicount" will be the highest unit declared.  do_header()
98dea673e9SRodney W. Grimes 	 * must use this higher of these values.
99dea673e9SRodney W. Grimes 	 */
10094142695SPeter Wemm 	for (hicount = count = 0, dp = dtab; dp != 0; dp = dp->d_next) {
101f71c01ccSPeter Wemm 		if (eq(dp->d_name, dev)) {
102dea673e9SRodney W. Grimes 			count =
1031c56dc36SPeter Wemm 			    dp->d_count != UNKNOWN ? dp->d_count : 1;
104dea673e9SRodney W. Grimes 			break;
105dea673e9SRodney W. Grimes 		}
106dea673e9SRodney W. Grimes 	}
107f71c01ccSPeter Wemm 	do_header(dev, count);
108dea673e9SRodney W. Grimes }
109dea673e9SRodney W. Grimes 
110188334f6SPeter Wemm static void
111f71c01ccSPeter Wemm do_header(char *dev, int count)
112dea673e9SRodney W. Grimes {
113188334f6SPeter Wemm 	char *file, *name, *inw;
114dea673e9SRodney W. Grimes 	struct file_list *fl, *fl_head, *tflp;
115dea673e9SRodney W. Grimes 	FILE *inf, *outf;
116dea673e9SRodney W. Grimes 	int inc, oldcount;
117dea673e9SRodney W. Grimes 
1183f664fc6SPeter Wemm 	file = toheader(dev);
119dea673e9SRodney W. Grimes 	name = tomacro(dev);
120dea673e9SRodney W. Grimes 	inf = fopen(file, "r");
121dea673e9SRodney W. Grimes 	oldcount = -1;
122dea673e9SRodney W. Grimes 	if (inf == 0) {
123dea673e9SRodney W. Grimes 		outf = fopen(file, "w");
124d5831691SPhilippe Charnier 		if (outf == 0)
125d5831691SPhilippe Charnier 			err(1, "%s", file);
126dea673e9SRodney W. Grimes 		fprintf(outf, "#define %s %d\n", name, count);
127dea673e9SRodney W. Grimes 		(void) fclose(outf);
128dea673e9SRodney W. Grimes 		return;
129dea673e9SRodney W. Grimes 	}
130dea673e9SRodney W. Grimes 	fl_head = NULL;
131dea673e9SRodney W. Grimes 	for (;;) {
132dea673e9SRodney W. Grimes 		char *cp;
133dea673e9SRodney W. Grimes 		if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
134dea673e9SRodney W. Grimes 			break;
135dea673e9SRodney W. Grimes 		if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
136dea673e9SRodney W. Grimes 			break;
137dea673e9SRodney W. Grimes 		inw = ns(inw);
138dea673e9SRodney W. Grimes 		cp = get_word(inf);
139dea673e9SRodney W. Grimes 		if (cp == 0 || cp == (char *)EOF)
140dea673e9SRodney W. Grimes 			break;
141dea673e9SRodney W. Grimes 		inc = atoi(cp);
142dea673e9SRodney W. Grimes 		if (eq(inw, name)) {
143dea673e9SRodney W. Grimes 			oldcount = inc;
144dea673e9SRodney W. Grimes 			inc = count;
145dea673e9SRodney W. Grimes 		}
146dea673e9SRodney W. Grimes 		cp = get_word(inf);
147dea673e9SRodney W. Grimes 		if (cp == (char *)EOF)
148dea673e9SRodney W. Grimes 			break;
149dea673e9SRodney W. Grimes 		fl = (struct file_list *) malloc(sizeof *fl);
150dea673e9SRodney W. Grimes 		bzero(fl, sizeof(*fl));
1516d41b96fSPeter Wemm 		fl->f_fn = inw;		/* malloced */
152dea673e9SRodney W. Grimes 		fl->f_type = inc;
153dea673e9SRodney W. Grimes 		fl->f_next = fl_head;
154dea673e9SRodney W. Grimes 		fl_head = fl;
155dea673e9SRodney W. Grimes 	}
156dea673e9SRodney W. Grimes 	(void) fclose(inf);
157dea673e9SRodney W. Grimes 	if (count == oldcount) {
158dea673e9SRodney W. Grimes 		for (fl = fl_head; fl != NULL; fl = tflp) {
159dea673e9SRodney W. Grimes 			tflp = fl->f_next;
1606d41b96fSPeter Wemm 			free(fl->f_fn);
161dea673e9SRodney W. Grimes 			free(fl);
162dea673e9SRodney W. Grimes 		}
163dea673e9SRodney W. Grimes 		return;
164dea673e9SRodney W. Grimes 	}
165dea673e9SRodney W. Grimes 	if (oldcount == -1) {
166dea673e9SRodney W. Grimes 		fl = (struct file_list *) malloc(sizeof *fl);
167dea673e9SRodney W. Grimes 		bzero(fl, sizeof(*fl));
1685bd7b809SJoerg Wunsch 		fl->f_fn = ns(name);
169dea673e9SRodney W. Grimes 		fl->f_type = count;
170dea673e9SRodney W. Grimes 		fl->f_next = fl_head;
171dea673e9SRodney W. Grimes 		fl_head = fl;
172dea673e9SRodney W. Grimes 	}
173dea673e9SRodney W. Grimes 	outf = fopen(file, "w");
174d5831691SPhilippe Charnier 	if (outf == 0)
175d5831691SPhilippe Charnier 		err(1, "%s", file);
176dea673e9SRodney W. Grimes 	for (fl = fl_head; fl != NULL; fl = tflp) {
177dea673e9SRodney W. Grimes 		fprintf(outf,
178dea673e9SRodney W. Grimes 		    "#define %s %u\n", fl->f_fn, count ? fl->f_type : 0);
179dea673e9SRodney W. Grimes 		tflp = fl->f_next;
1806d41b96fSPeter Wemm 		free(fl->f_fn);
181dea673e9SRodney W. Grimes 		free(fl);
182dea673e9SRodney W. Grimes 	}
183dea673e9SRodney W. Grimes 	(void) fclose(outf);
184dea673e9SRodney W. Grimes }
185dea673e9SRodney W. Grimes 
186dea673e9SRodney W. Grimes /*
187dea673e9SRodney W. Grimes  * convert a dev name to a .h file name
188dea673e9SRodney W. Grimes  */
189188334f6SPeter Wemm static char *
190f71c01ccSPeter Wemm toheader(char *dev)
191dea673e9SRodney W. Grimes {
192dea673e9SRodney W. Grimes 	static char hbuf[80];
193dea673e9SRodney W. Grimes 
194dea673e9SRodney W. Grimes 	(void) strcpy(hbuf, path(dev));
195dea673e9SRodney W. Grimes 	(void) strcat(hbuf, ".h");
196dea673e9SRodney W. Grimes 	return (hbuf);
197dea673e9SRodney W. Grimes }
198dea673e9SRodney W. Grimes 
199dea673e9SRodney W. Grimes /*
200dea673e9SRodney W. Grimes  * convert a dev name to a macro name
201dea673e9SRodney W. Grimes  */
202188334f6SPeter Wemm static char *
203f71c01ccSPeter Wemm tomacro(char *dev)
204dea673e9SRodney W. Grimes {
205dea673e9SRodney W. Grimes 	static char mbuf[20];
206f71c01ccSPeter Wemm 	char *cp;
207dea673e9SRodney W. Grimes 
208dea673e9SRodney W. Grimes 	cp = mbuf;
209dea673e9SRodney W. Grimes 	*cp++ = 'N';
210dea673e9SRodney W. Grimes 	while (*dev)
211dea673e9SRodney W. Grimes 		*cp++ = islower(*dev) ? toupper(*dev++) : *dev++;
212dea673e9SRodney W. Grimes 	*cp++ = 0;
213dea673e9SRodney W. Grimes 	return (mbuf);
214dea673e9SRodney W. Grimes }
215