108 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			108 lines
		
	
	
	
		
			2.1 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  *	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; | ||
|  | } |