1/*
2 *	Generate devlist.h from the Zorro ID file.
3 *
4 *	(c) 2000 Geert Uytterhoeven <geert@linux-m68k.org>
5 *
6 *	Based on the PCI version:
7 *
8 *	(c) 1999--2000 Martin Mares <mj@ucw.cz>
9 */
10
11#include <stdio.h>
12#include <string.h>
13
14#define MAX_NAME_SIZE 63
15
16static void
17pq(FILE *f, const char *c)
18{
19	while (*c) {
20		if (*c == '"')
21			fprintf(f, "\\\"");
22		else
23			fputc(*c, f);
24		c++;
25	}
26}
27
28int
29main(void)
30{
31	char line[1024], *c, *bra, manuf[8];
32	int manufs = 0;
33	int mode = 0;
34	int lino = 0;
35	int manuf_len = 0;
36	FILE *devf;
37
38	devf = fopen("devlist.h", "w");
39	if (!devf) {
40		fprintf(stderr, "Cannot create output file!\n");
41		return 1;
42	}
43
44	while (fgets(line, sizeof(line)-1, stdin)) {
45		lino++;
46		if ((c = strchr(line, '\n')))
47			*c = 0;
48		if (!line[0] || line[0] == '#')
49			continue;
50		if (line[0] == '\t') {
51			switch (mode) {
52			case 1:
53				if (strlen(line) > 5 && line[5] == ' ') {
54					c = line + 5;
55					while (*c == ' ')
56						*c++ = 0;
57					if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
58						/* Too long, try cutting off long description */
59						bra = strchr(c, '[');
60						if (bra && bra > c && bra[-1] == ' ')
61							bra[-1] = 0;
62						if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
63							fprintf(stderr, "Line %d: Product name too long\n", lino);
64							return 1;
65						}
66					}
67					fprintf(devf, "\tPRODUCT(%s,%s,\"", manuf, line+1);
68					pq(devf, c);
69					fputs("\")\n", devf);
70				} else goto err;
71				break;
72			default:
73				goto err;
74			}
75		} else if (strlen(line) > 4 && line[4] == ' ') {
76			c = line + 4;
77			while (*c == ' ')
78				*c++ = 0;
79			if (manufs)
80				fputs("ENDMANUF()\n\n", devf);
81			manufs++;
82			strcpy(manuf, line);
83			manuf_len = strlen(c);
84			if (manuf_len + 24 > MAX_NAME_SIZE) {
85				fprintf(stderr, "Line %d: manufacturer name too long\n", lino);
86				return 1;
87			}
88			fprintf(devf, "MANUF(%s,\"", manuf);
89			pq(devf, c);
90			fputs("\")\n", devf);
91			mode = 1;
92		} else {
93		err:
94			fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
95			return 1;
96		}
97	}
98	fputs("ENDMANUF()\n\
99\n\
100#undef MANUF\n\
101#undef PRODUCT\n\
102#undef ENDMANUF\n", devf);
103
104	fclose(devf);
105
106	return 0;
107}
108