]>
Commit | Line | Data |
---|---|---|
93afd047 MT |
1 | #include <stdio.h> |
2 | #include <stdlib.h> | |
3 | #include <malloc.h> | |
4 | #include <string.h> | |
5 | #include <time.h> | |
6 | #include "lex.yy.c" | |
7 | #include "hd.h" | |
8 | #include "cdb_read.h" | |
9 | #include "cdb_hwdb.h" | |
10 | ||
11 | ||
12 | int yywrap(void) { | |
13 | return(1); | |
14 | } | |
15 | ||
16 | static int WriteNames(FILE *f) { | |
17 | char *p, *e; | |
18 | int l, nc=0; | |
19 | ||
20 | fprintf(f, "! name data\n"); | |
21 | fprintf(f, "$%02d %d\n", IWHREC_TYPE_NAME_SIZE, name_str_cnt); | |
22 | p = e = name_str; | |
23 | e += name_str_cnt; | |
24 | while (p < e) { | |
25 | l = strlen(p); | |
26 | fprintf(f, "$%02d %s\n", IWHREC_TYPE_NAME_DATA, p); | |
27 | p += l + 1; | |
28 | nc++; | |
29 | } | |
30 | fprintf(f, "$%02d %d\n", IWHREC_TYPE_NAME_COUNT, nc); | |
31 | return(0); | |
32 | } | |
33 | ||
34 | static int WriteVendors(FILE *f) { | |
35 | int i, nullidx, idx; | |
36 | ||
37 | fprintf(f, "! vendor database\n"); | |
38 | fprintf(f, "$%02d %d\n", IWHREC_TYPE_VENDOR_COUNT, ivendor_idx); | |
39 | nullidx = strlen(name_str); /* first 0 in string array */ | |
40 | for (i=0; i < ivendor_idx; i++) { | |
41 | fprintf(f,"$%02d ", IWHREC_TYPE_VENDOR_RECORD); | |
42 | if (vendors[i].name && vendors[i].name[0]) | |
43 | idx = vendors[i].name - name_str; | |
44 | else | |
45 | idx = nullidx; | |
46 | fprintf(f,"%x ", idx); | |
47 | if (vendors[i].shortname && vendors[i].shortname[0]) | |
48 | idx = vendors[i].shortname - name_str; | |
49 | else | |
50 | idx = nullidx; | |
51 | fprintf(f,"%x ", idx); | |
52 | fprintf(f,"%d ", vendors[i].vnr); | |
53 | fprintf(f,"%d\n",vendors[i].refcnt); | |
54 | } | |
55 | return(0); | |
56 | } | |
57 | ||
58 | static int WriteCards(FILE *f) { | |
59 | int i, nullidx, idx; | |
60 | ||
61 | fprintf(f, "! card database\n"); | |
62 | fprintf(f, "$%02d %d\n", IWHREC_TYPE_CARD_COUNT, ce_idx); | |
63 | nullidx = strlen(name_str); /* first 0 in string array */ | |
64 | ||
65 | for (i=0; i <= ce_idx; i++) { | |
66 | fprintf(f,"$%02d ", IWHREC_TYPE_CARD_RECORD); | |
67 | fprintf(f,"%d ",cards[i].handle); | |
68 | fprintf(f,"%d ",cards[i].vhandle); | |
69 | if (cards[i].name && cards[i].name[0]) | |
70 | idx = cards[i].name - name_str; | |
71 | else | |
72 | idx = nullidx; | |
73 | fprintf(f,"%x ", idx); | |
74 | if (cards[i].lname && cards[i].lname[0]) | |
75 | idx = cards[i].lname - name_str; | |
76 | else | |
77 | idx = nullidx; | |
78 | fprintf(f,"%x ", idx); | |
79 | if (cards[i].Class && cards[i].Class[0]) | |
80 | idx = cards[i].Class - name_str; | |
81 | else | |
82 | idx = nullidx; | |
83 | fprintf(f,"%x ", idx); | |
84 | if (cards[i].bus && cards[i].bus[0]) | |
85 | idx = cards[i].bus - name_str; | |
86 | else | |
87 | idx = nullidx; | |
88 | fprintf(f,"%x ", idx); | |
89 | fprintf(f,"%d ",cards[i].revision); | |
90 | fprintf(f,"%d ",cards[i].vendor); | |
91 | fprintf(f,"%d ",cards[i].device); | |
92 | fprintf(f,"%d ",cards[i].subvendor); | |
93 | fprintf(f,"%d ",cards[i].subdevice); | |
94 | fprintf(f,"%d ",cards[i].features); | |
95 | fprintf(f,"%d ",cards[i].line_cnt); | |
96 | fprintf(f,"%d ",cards[i].vario_cnt); | |
97 | fprintf(f,"%d\n",cards[i].vario); | |
98 | } | |
99 | for (i=0; i < ce_idx; i++) { | |
100 | fprintf(f,"$%02d %d\n", IWHREC_TYPE_CARD_IDSORTED, isdncard_id[i]); | |
101 | } | |
102 | return(0); | |
103 | } | |
104 | ||
105 | static int WriteVarios(FILE *f) { | |
106 | int i, nullidx, idx; | |
107 | ||
108 | fprintf(f, "! driver database\n"); | |
109 | fprintf(f, "$%02d %d\n", IWHREC_TYPE_VARIO_COUNT, vario_idx); | |
110 | nullidx = strlen(name_str); /* first 0 in string array */ | |
111 | ||
112 | for (i=0; i <= vario_idx; i++) { | |
113 | fprintf(f,"$%02d ", IWHREC_TYPE_VARIO_RECORD); | |
114 | fprintf(f,"%d ",varios[i].handle); | |
115 | fprintf(f,"%d ",varios[i].next_vario); | |
116 | fprintf(f,"%d ",varios[i].drvid); | |
117 | fprintf(f,"%d ",varios[i].typ); | |
118 | fprintf(f,"%d ",varios[i].subtyp); | |
119 | fprintf(f,"%d ",varios[i].smp); | |
120 | if (varios[i].mod_name && varios[i].mod_name[0]) | |
121 | idx = varios[i].mod_name - name_str; | |
122 | else | |
123 | idx = nullidx; | |
124 | fprintf(f,"%x ", idx); | |
125 | if (varios[i].para_str && varios[i].para_str[0]) | |
126 | idx = varios[i].para_str - name_str; | |
127 | else | |
128 | idx = nullidx; | |
129 | fprintf(f,"%x ", idx); | |
130 | if (varios[i].mod_preload && varios[i].mod_preload[0]) | |
131 | idx = varios[i].mod_preload - name_str; | |
132 | else | |
133 | idx = nullidx; | |
134 | fprintf(f,"%x ", idx); | |
135 | if (varios[i].cfg_prog && varios[i].cfg_prog[0]) | |
136 | idx = varios[i].cfg_prog - name_str; | |
137 | else | |
138 | idx = nullidx; | |
139 | fprintf(f,"%x ", idx); | |
140 | if (varios[i].firmware && varios[i].firmware[0]) | |
141 | idx = varios[i].firmware - name_str; | |
142 | else | |
143 | idx = nullidx; | |
144 | fprintf(f,"%x ", idx); | |
145 | if (varios[i].description && varios[i].description[0]) | |
146 | idx = varios[i].description - name_str; | |
147 | else | |
148 | idx = nullidx; | |
149 | fprintf(f,"%x ", idx); | |
150 | if (varios[i].need_pkg && varios[i].need_pkg[0]) | |
151 | idx = varios[i].need_pkg - name_str; | |
152 | else | |
153 | idx = nullidx; | |
154 | fprintf(f,"%x ", idx); | |
155 | if (varios[i].info && varios[i].info[0]) | |
156 | idx = varios[i].info - name_str; | |
157 | else | |
158 | idx = nullidx; | |
159 | fprintf(f,"%x ", idx); | |
160 | if (varios[i].protocol && varios[i].protocol[0]) | |
161 | idx = varios[i].protocol - name_str; | |
162 | else | |
163 | idx = nullidx; | |
164 | fprintf(f,"%x ", idx); | |
165 | if (varios[i].interface && varios[i].interface[0]) | |
166 | idx = varios[i].interface - name_str; | |
167 | else | |
168 | idx = nullidx; | |
169 | fprintf(f,"%x ", idx); | |
170 | if (varios[i].io && varios[i].io[0]) | |
171 | idx = varios[i].io - name_str; | |
172 | else | |
173 | idx = nullidx; | |
174 | fprintf(f,"%x ", idx); | |
175 | if (varios[i].irq && varios[i].irq[0]) | |
176 | idx = varios[i].irq - name_str; | |
177 | else | |
178 | idx = nullidx; | |
179 | fprintf(f,"%x ", idx); | |
180 | if (varios[i].membase && varios[i].membase[0]) | |
181 | idx = varios[i].membase - name_str; | |
182 | else | |
183 | idx = nullidx; | |
184 | fprintf(f,"%x ", idx); | |
185 | if (varios[i].features && varios[i].features[0]) | |
186 | idx = varios[i].features - name_str; | |
187 | else | |
188 | idx = nullidx; | |
189 | fprintf(f,"%x ", idx); | |
190 | fprintf(f,"%d ",varios[i].card_ref); | |
191 | if (varios[i].name && varios[i].name[0]) | |
192 | idx = varios[i].name - name_str; | |
193 | else | |
194 | idx = nullidx; | |
195 | fprintf(f,"%x\n", idx); | |
196 | } | |
197 | return(0); | |
198 | } | |
199 | ||
200 | int main(argc,argv) | |
201 | int argc; | |
202 | char **argv; | |
203 | { | |
204 | char line[256]; | |
205 | int l; | |
206 | time_t tim; | |
207 | if (argc<2) { | |
208 | if (!(stdin=freopen(CDBISDN_CDB_FILE,"rb", stdin))) { | |
209 | fprintf(stderr, "Cannot open %s as stdin\n", CDBISDN_CDB_FILE); | |
210 | exit(2); | |
211 | } | |
212 | } else { | |
213 | if (!(stdin=freopen(argv[1],"rb", stdin))) { | |
214 | fprintf(stderr, "Cannot open %s as stdin\n", argv[1]); | |
215 | exit(2); | |
216 | } | |
217 | } | |
218 | if (argc >2) { | |
219 | if (strcmp(argv[2], "-")) { /* - := stdout */ | |
220 | if (!(stdout=freopen(argv[2],"w", stdout))) { | |
221 | fprintf(stderr, "Cannot open %s as stdout\n", argv[2]); | |
222 | exit(3); | |
223 | } | |
224 | } | |
225 | } else { /* default: CDBISDN_HWDB_FILE */ | |
226 | if (!(stdout=freopen(CDBISDN_HWDB_FILE,"w", stdout))) { | |
227 | fprintf(stderr, "Cannot open %s as stdout\n", CDBISDN_HWDB_FILE); | |
228 | exit(3); | |
229 | } | |
230 | } | |
231 | cards = calloc(max_ce, sizeof(cdb_isdn_card)); | |
232 | if (!cards) { | |
233 | fprintf(stderr, "cannot alloc card\n"); | |
234 | fclose(stdin); | |
235 | exit(4); | |
236 | } | |
237 | varios = calloc(max_vario, sizeof(cdb_isdn_vario)); | |
238 | if (!varios) { | |
239 | fprintf(stderr, "cannot alloc vario\n"); | |
240 | fclose(stdin); | |
241 | free(cards); | |
242 | exit(5); | |
243 | } | |
244 | name_str = calloc(max_name_str_cnt, 1); | |
245 | if (!name_str) { | |
246 | fprintf(stderr, "cannot alloc name_str\n"); | |
247 | fclose(stdin); | |
248 | free(cards); | |
249 | free(varios); | |
250 | exit(6); | |
251 | } | |
252 | vendors = calloc(max_ivendor, sizeof(cdb_isdn_vendor)); | |
253 | if (!vendors) { | |
254 | fprintf(stderr, "cannot alloc vendors\n"); | |
255 | fclose(stdin); | |
256 | free(cards); | |
257 | free(varios); | |
258 | free(name_str); | |
259 | exit(7); | |
260 | } | |
261 | BEGIN Main; | |
262 | yylex(); | |
263 | ||
264 | SortVendors(); | |
265 | SortCards(); | |
266 | SortVarios(); | |
267 | ||
268 | fprintf(stdout, "! CDBISDN database version %x\n", CDB_DATAVERSION + 1); | |
269 | fprintf(stdout, "! file is build with mk_isdnhwdb\n"); | |
270 | fprintf(stdout, "! Do not change this file !!!\n"); | |
271 | fprintf(stdout,"$%02d %d\n", IWHREC_TYPE_VERSION, CDB_DATAVERSION + 1); | |
272 | time(&tim); | |
273 | strcpy(line,ctime(&tim)); | |
274 | l = strlen(line); | |
275 | if (l) | |
276 | line[l-1] = 0; | |
277 | fprintf(stdout,"$%02d %s\n", IWHREC_TYPE_DATE, line); | |
278 | WriteNames(stdout); | |
279 | WriteVendors(stdout); | |
280 | WriteCards(stdout); | |
281 | WriteVarios(stdout); | |
282 | ||
283 | fclose(stdin); | |
284 | free(cards); | |
285 | free(name_str); | |
286 | free(vendors); | |
287 | free(varios); | |
288 | fprintf(stderr, "used cards(%d/%d)\n", ce_idx, max_ce); | |
289 | fprintf(stderr, "used varios(%d/%d)\n", vario_idx, max_vario); | |
290 | fprintf(stderr, "used vendors(%d/%d)\n", ivendor_idx, max_ivendor); | |
291 | fprintf(stderr, "used name_str(%d/%d)\n",name_str_cnt, max_name_str_cnt); | |
292 | return(0); | |
293 | } |