Merge tag 'topic/backlight_for_lag-2018-01-29' of git://anongit.freedesktop.org/drm...
[sfrench/cifs-2.6.git] / drivers / zorro / gen-devlist.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  *      Generate devlist.h from the Zorro ID file.
4  *
5  *      (c) 2000 Geert Uytterhoeven <geert@linux-m68k.org>
6  *
7  *      Based on the PCI version:
8  *
9  *      (c) 1999--2000 Martin Mares <mj@ucw.cz>
10  */
11
12 #include <stdio.h>
13 #include <string.h>
14
15 #define MAX_NAME_SIZE 63
16
17 static void
18 pq(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
29 int
30 main(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                                                 /* Too long, try cutting off long description */
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 }