1
2
3
4
5
6
7
8
9
10
11
12#include <stdio.h>
13#include <string.h>
14
15#define MAX_NAME_SIZE 63
16
17static void
18pq(FILE *f, const char *c)
19{
20 while (*c) {
21 if (*c == '"')
22 fprintf(f, "\\\"");
23 else
24 fputc(*c, f);
25 c++;
26 }
27}
28
29int
30main(void)
31{
32 char line[1024], *c, *bra, manuf[8];
33 int manufs = 0;
34 int mode = 0;
35 int lino = 0;
36 int manuf_len = 0;
37 FILE *devf;
38
39 devf = fopen("devlist.h", "w");
40 if (!devf) {
41 fprintf(stderr, "Cannot create output file!\n");
42 return 1;
43 }
44
45 while (fgets(line, sizeof(line)-1, stdin)) {
46 lino++;
47 if ((c = strchr(line, '\n')))
48 *c = 0;
49 if (!line[0] || line[0] == '#')
50 continue;
51 if (line[0] == '\t') {
52 switch (mode) {
53 case 1:
54 if (strlen(line) > 5 && line[5] == ' ') {
55 c = line + 5;
56 while (*c == ' ')
57 *c++ = 0;
58 if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
59
60 bra = strchr(c, '[');
61 if (bra && bra > c && bra[-1] == ' ')
62 bra[-1] = 0;
63 if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
64 fprintf(stderr, "Line %d: Product name too long\n", lino);
65 return 1;
66 }
67 }
68 fprintf(devf, "\tPRODUCT(%s,%s,\"", manuf, line+1);
69 pq(devf, c);
70 fputs("\")\n", devf);
71 } else goto err;
72 break;
73 default:
74 goto err;
75 }
76 } else if (strlen(line) > 4 && line[4] == ' ') {
77 c = line + 4;
78 while (*c == ' ')
79 *c++ = 0;
80 if (manufs)
81 fputs("ENDMANUF()\n\n", devf);
82 manufs++;
83 strcpy(manuf, line);
84 manuf_len = strlen(c);
85 if (manuf_len + 24 > MAX_NAME_SIZE) {
86 fprintf(stderr, "Line %d: manufacturer name too long\n", lino);
87 return 1;
88 }
89 fprintf(devf, "MANUF(%s,\"", manuf);
90 pq(devf, c);
91 fputs("\")\n", devf);
92 mode = 1;
93 } else {
94 err:
95 fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
96 return 1;
97 }
98 }
99 fputs("ENDMANUF()\n\
100\n\
101#undef MANUF\n\
102#undef PRODUCT\n\
103#undef ENDMANUF\n", devf);
104
105 fclose(devf);
106
107 return 0;
108}
109