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