xref: /linux/drivers/zorro/gen-devlist.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
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