123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- /*
- * 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;
- }
|