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