109 lines · c
1// SPDX-License-Identifier: GPL-2.02/*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 6316 17static void18pq(FILE *f, const char *c)19{20 while (*c) {21 if (*c == '"')22 fprintf(f, "\\\"");23 else24 fputc(*c, f);25 c++;26 }27}28 29int30main(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