Linux-2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
This commit is contained in:
132
drivers/pci/gen-devlist.c
Normal file
132
drivers/pci/gen-devlist.c
Normal file
@@ -0,0 +1,132 @@
|
||||
/*
|
||||
* Generate devlist.h and classlist.h from the PCI ID file.
|
||||
*
|
||||
* (c) 1999--2002 Martin Mares <mj@ucw.cz>
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define MAX_NAME_SIZE 200
|
||||
|
||||
static void
|
||||
pq(FILE *f, const char *c, int len)
|
||||
{
|
||||
int i = 1;
|
||||
while (*c && i != len) {
|
||||
if (*c == '"')
|
||||
fprintf(f, "\\\"");
|
||||
else {
|
||||
fputc(*c, f);
|
||||
if (*c == '?' && c[1] == '?') {
|
||||
/* Avoid trigraphs */
|
||||
fprintf(f, "\" \"");
|
||||
}
|
||||
}
|
||||
c++;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
char line[1024], *c, *bra, vend[8];
|
||||
int vendors = 0;
|
||||
int mode = 0;
|
||||
int lino = 0;
|
||||
int vendor_len = 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)) {
|
||||
lino++;
|
||||
if ((c = strchr(line, '\n')))
|
||||
*c = 0;
|
||||
if (!line[0] || line[0] == '#')
|
||||
continue;
|
||||
if (line[1] == ' ') {
|
||||
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;
|
||||
}
|
||||
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;
|
||||
if (vendor_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 (vendor_len + strlen(c) + 1 > MAX_NAME_SIZE) {
|
||||
fprintf(stderr, "Line %d: Device name too long. Name truncated.\n", lino);
|
||||
fprintf(stderr, "%s\n", c);
|
||||
/*return 1;*/
|
||||
}
|
||||
}
|
||||
fprintf(devf, "\tDEVICE(%s,%s,\"", vend, line+1);
|
||||
pq(devf, c, MAX_NAME_SIZE - vendor_len - 1);
|
||||
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)
|
||||
fputs("ENDVENDOR()\n\n", devf);
|
||||
vendors++;
|
||||
strcpy(vend, line);
|
||||
vendor_len = strlen(c);
|
||||
if (vendor_len + 24 > MAX_NAME_SIZE) {
|
||||
fprintf(stderr, "Line %d: Vendor name too long\n", lino);
|
||||
return 1;
|
||||
}
|
||||
fprintf(devf, "VENDOR(%s,\"", vend);
|
||||
pq(devf, c, 0);
|
||||
fputs("\")\n", devf);
|
||||
mode = 1;
|
||||
} else {
|
||||
err:
|
||||
fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
fputs("ENDVENDOR()\n\
|
||||
\n\
|
||||
#undef VENDOR\n\
|
||||
#undef DEVICE\n\
|
||||
#undef ENDVENDOR\n", devf);
|
||||
fputs("\n#undef CLASS\n", clsf);
|
||||
|
||||
fclose(devf);
|
||||
fclose(clsf);
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user