linux/drivers/zorro/gen-devlist.c
<<
>>
Prefs
   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
  17static void
  18pq(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
  29int
  30main(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}
 109