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