Root/drivers/zorro/gen-devlist.c

1/*
2 * Generate devlist.h from the Zorro ID file.
3 *
4 * (c) 2000 Geert Uytterhoeven <geert@linux-m68k.org>
5 *
6 * Based on the PCI version:
7 *
8 * (c) 1999--2000 Martin Mares <mj@ucw.cz>
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                        /* Too long, try cutting off long description */
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

Archive Download this file



interactive