1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Generate devlist.h from the Zorro ID file.
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * (c) 2000 Geert Uytterhoeven <geert@linux-m68k.org>
61da177e4SLinus Torvalds *
71da177e4SLinus Torvalds * Based on the PCI version:
81da177e4SLinus Torvalds *
91da177e4SLinus Torvalds * (c) 1999--2000 Martin Mares <mj@ucw.cz>
101da177e4SLinus Torvalds */
111da177e4SLinus Torvalds
121da177e4SLinus Torvalds #include <stdio.h>
131da177e4SLinus Torvalds #include <string.h>
141da177e4SLinus Torvalds
151da177e4SLinus Torvalds #define MAX_NAME_SIZE 63
161da177e4SLinus Torvalds
171da177e4SLinus Torvalds static void
pq(FILE * f,const char * c)181da177e4SLinus Torvalds pq(FILE *f, const char *c)
191da177e4SLinus Torvalds {
201da177e4SLinus Torvalds while (*c) {
211da177e4SLinus Torvalds if (*c == '"')
221da177e4SLinus Torvalds fprintf(f, "\\\"");
231da177e4SLinus Torvalds else
241da177e4SLinus Torvalds fputc(*c, f);
251da177e4SLinus Torvalds c++;
261da177e4SLinus Torvalds }
271da177e4SLinus Torvalds }
281da177e4SLinus Torvalds
291da177e4SLinus Torvalds int
main(void)301da177e4SLinus Torvalds main(void)
311da177e4SLinus Torvalds {
321da177e4SLinus Torvalds char line[1024], *c, *bra, manuf[8];
331da177e4SLinus Torvalds int manufs = 0;
341da177e4SLinus Torvalds int mode = 0;
351da177e4SLinus Torvalds int lino = 0;
361da177e4SLinus Torvalds int manuf_len = 0;
371da177e4SLinus Torvalds FILE *devf;
381da177e4SLinus Torvalds
391da177e4SLinus Torvalds devf = fopen("devlist.h", "w");
401da177e4SLinus Torvalds if (!devf) {
411da177e4SLinus Torvalds fprintf(stderr, "Cannot create output file!\n");
421da177e4SLinus Torvalds return 1;
431da177e4SLinus Torvalds }
441da177e4SLinus Torvalds
451da177e4SLinus Torvalds while (fgets(line, sizeof(line)-1, stdin)) {
461da177e4SLinus Torvalds lino++;
471da177e4SLinus Torvalds if ((c = strchr(line, '\n')))
481da177e4SLinus Torvalds *c = 0;
491da177e4SLinus Torvalds if (!line[0] || line[0] == '#')
501da177e4SLinus Torvalds continue;
511da177e4SLinus Torvalds if (line[0] == '\t') {
521da177e4SLinus Torvalds switch (mode) {
531da177e4SLinus Torvalds case 1:
541da177e4SLinus Torvalds if (strlen(line) > 5 && line[5] == ' ') {
551da177e4SLinus Torvalds c = line + 5;
561da177e4SLinus Torvalds while (*c == ' ')
571da177e4SLinus Torvalds *c++ = 0;
581da177e4SLinus Torvalds if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
591da177e4SLinus Torvalds /* Too long, try cutting off long description */
601da177e4SLinus Torvalds bra = strchr(c, '[');
611da177e4SLinus Torvalds if (bra && bra > c && bra[-1] == ' ')
621da177e4SLinus Torvalds bra[-1] = 0;
631da177e4SLinus Torvalds if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
641da177e4SLinus Torvalds fprintf(stderr, "Line %d: Product name too long\n", lino);
651da177e4SLinus Torvalds return 1;
661da177e4SLinus Torvalds }
671da177e4SLinus Torvalds }
681da177e4SLinus Torvalds fprintf(devf, "\tPRODUCT(%s,%s,\"", manuf, line+1);
691da177e4SLinus Torvalds pq(devf, c);
701da177e4SLinus Torvalds fputs("\")\n", devf);
711da177e4SLinus Torvalds } else goto err;
721da177e4SLinus Torvalds break;
731da177e4SLinus Torvalds default:
741da177e4SLinus Torvalds goto err;
751da177e4SLinus Torvalds }
761da177e4SLinus Torvalds } else if (strlen(line) > 4 && line[4] == ' ') {
771da177e4SLinus Torvalds c = line + 4;
781da177e4SLinus Torvalds while (*c == ' ')
791da177e4SLinus Torvalds *c++ = 0;
801da177e4SLinus Torvalds if (manufs)
811da177e4SLinus Torvalds fputs("ENDMANUF()\n\n", devf);
821da177e4SLinus Torvalds manufs++;
831da177e4SLinus Torvalds strcpy(manuf, line);
841da177e4SLinus Torvalds manuf_len = strlen(c);
851da177e4SLinus Torvalds if (manuf_len + 24 > MAX_NAME_SIZE) {
861da177e4SLinus Torvalds fprintf(stderr, "Line %d: manufacturer name too long\n", lino);
871da177e4SLinus Torvalds return 1;
881da177e4SLinus Torvalds }
891da177e4SLinus Torvalds fprintf(devf, "MANUF(%s,\"", manuf);
901da177e4SLinus Torvalds pq(devf, c);
911da177e4SLinus Torvalds fputs("\")\n", devf);
921da177e4SLinus Torvalds mode = 1;
931da177e4SLinus Torvalds } else {
941da177e4SLinus Torvalds err:
951da177e4SLinus Torvalds fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
961da177e4SLinus Torvalds return 1;
971da177e4SLinus Torvalds }
981da177e4SLinus Torvalds }
991da177e4SLinus Torvalds fputs("ENDMANUF()\n\
1001da177e4SLinus Torvalds \n\
1011da177e4SLinus Torvalds #undef MANUF\n\
1021da177e4SLinus Torvalds #undef PRODUCT\n\
1031da177e4SLinus Torvalds #undef ENDMANUF\n", devf);
1041da177e4SLinus Torvalds
1051da177e4SLinus Torvalds fclose(devf);
1061da177e4SLinus Torvalds
1071da177e4SLinus Torvalds return 0;
1081da177e4SLinus Torvalds }
109