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