(no message)
[unix-history] / usr / src / usr.sbin / config / mkheaders.c
CommitLineData
73845e07 1/* mkheaders.c 1.13 82/12/09 */
e0a482d6 2
900ae8f5 3/*
1614283b 4 * Make all the .h files for the optional entries
900ae8f5
MT
5 */
6
7#include <stdio.h>
8#include <ctype.h>
9#include "config.h"
576264df 10#include "y.tab.h"
900ae8f5 11
900ae8f5
MT
12headers()
13{
e0a482d6 14 register struct file_list *fl;
1614283b 15
e0a482d6
BJ
16 for (fl = ftab; fl != 0; fl = fl->f_next)
17 if (fl->f_needs != 0)
821eeaae 18 do_count(fl->f_needs, fl->f_needs, 1);
1614283b
MT
19}
20
21/*
e0a482d6
BJ
22 * count all the devices of a certain type and recurse to count
23 * whatever the device is connected to
1614283b 24 */
1614283b 25do_count(dev, hname, search)
e0a482d6 26 register char *dev, *hname;
f025f13d 27 int search;
1614283b 28{
e0a482d6
BJ
29 register struct device *dp, *mp;
30 register int count;
900ae8f5 31
e0a482d6
BJ
32 for (count = 0,dp = dtab; dp != 0; dp = dp->d_next)
33 if (dp->d_unit != -1 && eq(dp->d_name, dev)) {
34 if (dp->d_type == PSEUDO_DEVICE) {
73845e07
SL
35 count =
36 dp->d_slave != UNKNOWN ? dp->d_slave : 1;
e0a482d6
BJ
37 break;
38 }
39 count++;
40 /*
41 * Allow holes in unit numbering,
42 * assumption is unit numbering starts
43 * at zero.
44 */
45 if (dp->d_unit + 1 > count)
46 count = dp->d_unit + 1;
47 if (search) {
48 mp = dp->d_conn;
22d68ad0
BJ
49 if (mp != 0 && mp != (struct device *)-1 &&
50 mp->d_conn != (struct device *)-1) {
821eeaae
BJ
51 do_count(mp->d_name, hname, 0);
52 search = 0;
e0a482d6
BJ
53 }
54 }
1614283b 55 }
e0a482d6 56 do_header(dev, hname, count);
1614283b
MT
57}
58
59do_header(dev, hname, count)
e0a482d6
BJ
60 char *dev, *hname;
61 int count;
1614283b 62{
e0a482d6
BJ
63 char *file, *name, *inw, *toheader(), *tomacro();
64 struct file_list *fl, *fl_head;
65 FILE *inf, *outf;
66 int inc, oldcount;
1614283b 67
e0a482d6
BJ
68 file = toheader(hname);
69 name = tomacro(dev);
70 inf = fopen(file, "r");
71 oldcount = -1;
72 if (inf == 0) {
73 outf = fopen(file, "w");
74 if (outf == 0) {
75 perror(file);
76 exit(1);
77 }
78 fprintf(outf, "#define %s %d\n", name, count);
22d68ad0 79 (void) fclose(outf);
e0a482d6
BJ
80 return;
81 }
82 fl_head = 0;
83 for (;;) {
84 char *cp;
22d68ad0 85 if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
e0a482d6 86 break;
22d68ad0 87 if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
e0a482d6
BJ
88 break;
89 inw = ns(inw);
90 cp = get_word(inf);
22d68ad0 91 if (cp == 0 || cp == (char *)EOF)
e0a482d6
BJ
92 break;
93 inc = atoi(cp);
94 if (eq(inw, name)) {
95 oldcount = inc;
96 inc = count;
97 }
98 cp = get_word(inf);
73845e07 99 if (cp == (char *)EOF)
e0a482d6
BJ
100 break;
101 fl = (struct file_list *) malloc(sizeof *fl);
102 fl->f_fn = inw;
103 fl->f_type = inc;
104 fl->f_next = fl_head;
105 fl_head = fl;
106 }
22d68ad0 107 (void) fclose(inf);
e0a482d6
BJ
108 if (count == oldcount) {
109 for (fl = fl_head; fl != 0; fl = fl->f_next)
22d68ad0 110 free((char *)fl);
e0a482d6
BJ
111 return;
112 }
113 if (oldcount == -1) {
114 fl = (struct file_list *) malloc(sizeof *fl);
115 fl->f_fn = name;
116 fl->f_type = count;
117 fl->f_next = fl_head;
118 fl_head = fl;
119 }
1614283b 120 outf = fopen(file, "w");
e0a482d6
BJ
121 if (outf == 0) {
122 perror(file);
123 exit(1);
cc03da8f 124 }
e0a482d6
BJ
125 for (fl = fl_head; fl != 0; fl = fl->f_next) {
126 fprintf(outf, "#define %s %d\n",
127 fl->f_fn, count ? fl->f_type : 0);
22d68ad0 128 free((char *)fl);
900ae8f5 129 }
22d68ad0 130 (void) fclose(outf);
900ae8f5
MT
131}
132
133/*
e0a482d6 134 * convert a dev name to a .h file name
900ae8f5 135 */
e0a482d6
BJ
136char *
137toheader(dev)
138 char *dev;
900ae8f5 139{
e0a482d6 140 static char hbuf[80];
900ae8f5 141
22d68ad0
BJ
142 (void) strcpy(hbuf, path(dev));
143 (void) strcat(hbuf, ".h");
f025f13d 144 return (hbuf);
900ae8f5
MT
145}
146
147/*
e0a482d6 148 * convert a dev name to a macro name
900ae8f5 149 */
1614283b 150char *tomacro(dev)
e0a482d6 151 register char *dev;
900ae8f5 152{
e0a482d6
BJ
153 static char mbuf[20];
154 register char *cp;
900ae8f5 155
e0a482d6
BJ
156 cp = mbuf;
157 *cp++ = 'N';
158 while (*dev)
159 *cp++ = toupper(*dev++);
160 *cp++ = 0;
f025f13d 161 return (mbuf);
900ae8f5 162}