]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/hwinfo/src/isdn/cdb/mk_isdnhwdb.c
Kleiner netter neuer Versuch.
[people/pmueller/ipfire-2.x.git] / src / hwinfo / src / isdn / cdb / mk_isdnhwdb.c
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 }