diff options
Diffstat (limited to 'drivers/zorro/gen-devlist.c')
-rw-r--r-- | drivers/zorro/gen-devlist.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/drivers/zorro/gen-devlist.c b/drivers/zorro/gen-devlist.c new file mode 100644 index 0000000..16fe206 --- /dev/null +++ b/drivers/zorro/gen-devlist.c @@ -0,0 +1,107 @@ +/* + * 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; +} |