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