Commit | Line | Data |
---|---|---|
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 |
12 | headers() |
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 | 25 | do_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 | ||
59 | do_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 |
136 | char * |
137 | toheader(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 | 150 | char *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 | } |