linux/drivers/zorro/gen-devlist.c
<<
>>
Prefs
   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