1 /*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)mkheaders.c 8.1 (Berkeley) 06/06/93";
10 #endif /* not lint */
11
12 /*
13 * Make all the .h files for the optional entries
14 */
15
16 #include <stdio.h>
17 #include <ctype.h>
18 #include "config.h"
19 #include "y.tab.h"
20
headers()21 headers()
22 {
23 register struct file_list *fl;
24
25 for (fl = ftab; fl != 0; fl = fl->f_next)
26 if (fl->f_needs != 0)
27 do_count(fl->f_needs, fl->f_needs, 1);
28 }
29
30 /*
31 * count all the devices of a certain type and recurse to count
32 * whatever the device is connected to
33 */
do_count(dev,hname,search)34 do_count(dev, hname, search)
35 register char *dev, *hname;
36 int search;
37 {
38 register struct device *dp, *mp;
39 register int count, hicount;
40
41 /*
42 * After this loop, "count" will be the actual number of units,
43 * and "hicount" will be the highest unit declared. do_header()
44 * must use this higher of these values.
45 */
46 for (hicount = count = 0, dp = dtab; dp != 0; dp = dp->d_next)
47 if (dp->d_unit != -1 && eq(dp->d_name, dev)) {
48 if (dp->d_type == PSEUDO_DEVICE) {
49 count =
50 dp->d_slave != UNKNOWN ? dp->d_slave : 1;
51 break;
52 }
53 count++;
54 /*
55 * Allow holes in unit numbering,
56 * assumption is unit numbering starts
57 * at zero.
58 */
59 if (dp->d_unit + 1 > hicount)
60 hicount = dp->d_unit + 1;
61 if (search) {
62 mp = dp->d_conn;
63 if (mp != 0 && mp != TO_NEXUS &&
64 mp->d_conn != 0 && mp->d_conn != TO_NEXUS) {
65 do_count(mp->d_name, hname, 0);
66 search = 0;
67 }
68 }
69 }
70 do_header(dev, hname, count > hicount ? count : hicount);
71 }
72
do_header(dev,hname,count)73 do_header(dev, hname, count)
74 char *dev, *hname;
75 int count;
76 {
77 char *file, *name, *inw, *toheader(), *tomacro();
78 struct file_list *fl, *fl_head, *tflp;
79 FILE *inf, *outf;
80 int inc, oldcount;
81
82 file = toheader(hname);
83 name = tomacro(dev);
84 inf = fopen(file, "r");
85 oldcount = -1;
86 if (inf == 0) {
87 outf = fopen(file, "w");
88 if (outf == 0) {
89 perror(file);
90 exit(1);
91 }
92 fprintf(outf, "#define %s %d\n", name, count);
93 (void) fclose(outf);
94 return;
95 }
96 fl_head = NULL;
97 for (;;) {
98 char *cp;
99 if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
100 break;
101 if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
102 break;
103 inw = ns(inw);
104 cp = get_word(inf);
105 if (cp == 0 || cp == (char *)EOF)
106 break;
107 inc = atoi(cp);
108 if (eq(inw, name)) {
109 oldcount = inc;
110 inc = count;
111 }
112 cp = get_word(inf);
113 if (cp == (char *)EOF)
114 break;
115 fl = (struct file_list *) malloc(sizeof *fl);
116 bzero(fl, sizeof(*fl));
117 fl->f_fn = inw;
118 fl->f_type = inc;
119 fl->f_next = fl_head;
120 fl_head = fl;
121 }
122 (void) fclose(inf);
123 if (count == oldcount) {
124 for (fl = fl_head; fl != NULL; fl = tflp) {
125 tflp = fl->f_next;
126 free(fl);
127 }
128 return;
129 }
130 if (oldcount == -1) {
131 fl = (struct file_list *) malloc(sizeof *fl);
132 bzero(fl, sizeof(*fl));
133 fl->f_fn = name;
134 fl->f_type = count;
135 fl->f_next = fl_head;
136 fl_head = fl;
137 }
138 outf = fopen(file, "w");
139 if (outf == 0) {
140 perror(file);
141 exit(1);
142 }
143 for (fl = fl_head; fl != NULL; fl = tflp) {
144 fprintf(outf,
145 "#define %s %u\n", fl->f_fn, count ? fl->f_type : 0);
146 tflp = fl->f_next;
147 free(fl);
148 }
149 (void) fclose(outf);
150 }
151
152 /*
153 * convert a dev name to a .h file name
154 */
155 char *
toheader(dev)156 toheader(dev)
157 char *dev;
158 {
159 static char hbuf[80];
160
161 (void) strcpy(hbuf, path(dev));
162 (void) strcat(hbuf, ".h");
163 return (hbuf);
164 }
165
166 /*
167 * convert a dev name to a macro name
168 */
tomacro(dev)169 char *tomacro(dev)
170 register char *dev;
171 {
172 static char mbuf[20];
173 register char *cp;
174
175 cp = mbuf;
176 *cp++ = 'N';
177 while (*dev)
178 *cp++ = islower(*dev) ? toupper(*dev++) : *dev++;
179 *cp++ = 0;
180 return (mbuf);
181 }
182