OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [pci/] [gen-devlist.c] - Rev 1774

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 *	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 79
 
static void
pq(FILE *f, const char *c)
{
	while (*c) {
		if (*c == '"')
			fprintf(f, "\\\"");
		else {
			fputc(*c, f);
			if (*c == '?' && c[1] == '?') {
				/* Avoid trigraphs */
				fprintf(f, "\" \"");
			}
		}
		c++;
	}
}
 
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\n", lino);
							fprintf(stderr, "%s\n", c);
							return 1;
						}
					}
					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)
				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);
			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;
}
 

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.