patch-2.3.31 linux/drivers/pci/gen-devlist.c

Next file: linux/drivers/pci/names.c
Previous file: linux/drivers/pci/Makefile
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.3.30/linux/drivers/pci/gen-devlist.c linux/drivers/pci/gen-devlist.c
@@ -1,5 +1,5 @@
 /*
- *	Generate devlist.h from the PCI ID file.
+ *	Generate devlist.h and classlist.h from the PCI ID file.
  *
  *	(c) 1999 Martin Mares <mj@suse.cz>
  */
@@ -8,13 +8,13 @@
 #include <string.h>
 
 static void
-pq(char *c)
+pq(FILE *f, char *c)
 {
 	while (*c) {
 		if (*c == '"')
-			printf("\\\"");
+			fprintf(f, "\\\"");
 		else
-			putchar(*c);
+			fputc(*c, f);
 		c++;
 	}
 }
@@ -24,6 +24,15 @@
 {
 	char line[1024], *c, vend[8];
 	int vendors = 0;
+	int mode = 0;
+	FILE *devf, *clsf;
+
+	devf = fopen("devlist.h", "w");
+	clsf = fopen("classlist.h", "w");
+	if (!devf || !clsf) {
+		fprintf(stderr, "Cannot create output file!\n");
+		return 1;
+	}
 
 	while (fgets(line, sizeof(line)-1, stdin)) {
 		if ((c = strchr(line, '\n')))
@@ -31,36 +40,65 @@
 		if (!line[0] || line[0] == '#')
 			continue;
 		if (line[1] == ' ') {
-			vend[0] = 0;
-			continue;
+			if (line[0] == 'C' && strlen(line) > 4 && line[4] == ' ') {
+				vend[0] = line[2];
+				vend[1] = line[3];
+				vend[2] = 0;
+				mode = 2;
+			} else goto err;
 		}
-		if (line[0] == '\t') {
-			if (vend[0] && strlen(line) > 5 && line[5] == ' ') {
-				c = line + 5;
-				while (*c == ' ')
-					*c++ = 0;
-				printf("\tDEVICE(%s,%s,\"", vend, line+1);
-				pq(c);
-				puts("\")");
+		else if (line[0] == '\t') {
+			if (line[1] == '\t')
+				continue;
+			switch (mode) {
+			case 1:
+				if (strlen(line) > 5 && line[5] == ' ') {
+					c = line + 5;
+					while (*c == ' ')
+						*c++ = 0;
+					fprintf(devf, "\tDEVICE(%s,%s,\"", vend, line+1);
+					pq(devf, c);
+					fputs("\")\n", devf);
+				} else goto err;
+				break;
+			case 2:
+				if (strlen(line) > 3 && line[3] == ' ') {
+					c = line + 3;
+					while (*c == ' ')
+						*c++ = 0;
+					fprintf(clsf, "CLASS(%s%s, \"%s\")\n", vend, line+1, c);
+				} else goto err;
+				break;
+			default:
+				goto err;
 			}
 		} else if (strlen(line) > 4 && line[4] == ' ') {
 			c = line + 4;
 			while (*c == ' ')
 				*c++ = 0;
 			if (vendors)
-				puts("ENDVENDOR()\n");
+				fputs("ENDVENDOR()\n\n", devf);
 			vendors++;
 			strcpy(vend, line);
-			printf("VENDOR(%s,\"", vend);
-			pq(c);
-			puts("\")");
+			fprintf(devf, "VENDOR(%s,\"", vend);
+			pq(devf, c);
+			fputs("\")\n", devf);
+			mode = 1;
+		} else {
+		err:
+			fprintf(stderr, "Syntax error in mode %d: %s\n", mode, line);
+			return 1;
 		}
 	}
-	puts("ENDVENDOR()\n\
+	fputs("ENDVENDOR()\n\
 \n\
 #undef VENDOR\n\
 #undef DEVICE\n\
-#undef ENDVENDOR");
+#undef ENDVENDOR\n", devf);
+	fputs("\n#undef CLASS", clsf);
+
+	fclose(devf);
+	fclose(clsf);
 
 	return 0;
 }

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)