root/drivers/zorro/gen-devlist.c
// 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;
}