Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
428 | giacomo | 1 | /* |
2 | * Generate devlist.h and classlist.h from the PCI ID file. |
||
3 | * |
||
4 | * (c) 1999--2002 Martin Mares <mj@ucw.cz> |
||
5 | */ |
||
6 | |||
7 | #include <stdio.h> |
||
8 | #include <string.h> |
||
9 | |||
10 | #define MAX_NAME_SIZE 79 |
||
11 | |||
12 | static void |
||
13 | pq(FILE *f, const char *c) |
||
14 | { |
||
15 | while (*c) { |
||
16 | if (*c == '"') |
||
17 | fprintf(f, "\\\""); |
||
18 | else { |
||
19 | fputc(*c, f); |
||
20 | if (*c == '?' && c[1] == '?') { |
||
21 | /* Avoid trigraphs */ |
||
22 | fprintf(f, "\" \""); |
||
23 | } |
||
24 | } |
||
25 | c++; |
||
26 | } |
||
27 | } |
||
28 | |||
29 | int |
||
30 | main(void) |
||
31 | { |
||
32 | char line[1024], *c, *bra, vend[8]; |
||
33 | int vendors = 0; |
||
34 | int mode = 0; |
||
35 | int lino = 0; |
||
36 | int vendor_len = 0; |
||
37 | FILE *devf, *clsf; |
||
38 | |||
39 | devf = fopen("devlist.h", "w"); |
||
40 | clsf = fopen("classlist.h", "w"); |
||
41 | if (!devf || !clsf) { |
||
42 | fprintf(stderr, "Cannot create output file!\n"); |
||
43 | return 1; |
||
44 | } |
||
45 | |||
46 | while (fgets(line, sizeof(line)-1, stdin)) { |
||
47 | lino++; |
||
48 | if ((c = strchr(line, '\n'))) |
||
49 | *c = 0; |
||
50 | if (!line[0] || line[0] == '#') |
||
51 | continue; |
||
52 | if (line[1] == ' ') { |
||
53 | if (line[0] == 'C' && strlen(line) > 4 && line[4] == ' ') { |
||
54 | vend[0] = line[2]; |
||
55 | vend[1] = line[3]; |
||
56 | vend[2] = 0; |
||
57 | mode = 2; |
||
58 | } else goto err; |
||
59 | } |
||
60 | else if (line[0] == '\t') { |
||
61 | if (line[1] == '\t') |
||
62 | continue; |
||
63 | switch (mode) { |
||
64 | case 1: |
||
65 | if (strlen(line) > 5 && line[5] == ' ') { |
||
66 | c = line + 5; |
||
67 | while (*c == ' ') |
||
68 | *c++ = 0; |
||
69 | if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) { |
||
70 | /* Too long, try cutting off long description */ |
||
71 | bra = strchr(c, '['); |
||
72 | if (bra && bra > c && bra[-1] == ' ') |
||
73 | bra[-1] = 0; |
||
74 | if (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) { |
||
75 | fprintf(stderr, "Line %d: Device name too long\n", lino); |
||
76 | fprintf(stderr, "%s\n", c); |
||
77 | return 1; |
||
78 | } |
||
79 | } |
||
80 | fprintf(devf, "\tDEVICE(%s,%s,\"", vend, line+1); |
||
81 | pq(devf, c); |
||
82 | fputs("\")\n", devf); |
||
83 | } else goto err; |
||
84 | break; |
||
85 | case 2: |
||
86 | if (strlen(line) > 3 && line[3] == ' ') { |
||
87 | c = line + 3; |
||
88 | while (*c == ' ') |
||
89 | *c++ = 0; |
||
90 | fprintf(clsf, "CLASS(%s%s, \"%s\")\n", vend, line+1, c); |
||
91 | } else goto err; |
||
92 | break; |
||
93 | default: |
||
94 | goto err; |
||
95 | } |
||
96 | } else if (strlen(line) > 4 && line[4] == ' ') { |
||
97 | c = line + 4; |
||
98 | while (*c == ' ') |
||
99 | *c++ = 0; |
||
100 | if (vendors) |
||
101 | fputs("ENDVENDOR()\n\n", devf); |
||
102 | vendors++; |
||
103 | strcpy(vend, line); |
||
104 | vendor_len = strlen(c); |
||
105 | if (vendor_len + 24 > MAX_NAME_SIZE) { |
||
106 | fprintf(stderr, "Line %d: Vendor name too long\n", lino); |
||
107 | return 1; |
||
108 | } |
||
109 | fprintf(devf, "VENDOR(%s,\"", vend); |
||
110 | pq(devf, c); |
||
111 | fputs("\")\n", devf); |
||
112 | mode = 1; |
||
113 | } else { |
||
114 | err: |
||
115 | fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line); |
||
116 | return 1; |
||
117 | } |
||
118 | } |
||
119 | fputs("ENDVENDOR()\n\ |
||
120 | \n\ |
||
121 | #undef VENDOR\n\ |
||
122 | #undef DEVICE\n\ |
||
123 | #undef ENDVENDOR\n", devf); |
||
124 | fputs("\n#undef CLASS\n", clsf); |
||
125 | |||
126 | fclose(devf); |
||
127 | fclose(clsf); |
||
128 | |||
129 | return 0; |
||
130 | } |