162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci *	Generate devlist.h from the Zorro ID file.
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci *	(c) 2000 Geert Uytterhoeven <geert@linux-m68k.org>
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci *	Based on the PCI version:
862306a36Sopenharmony_ci *
962306a36Sopenharmony_ci *	(c) 1999--2000 Martin Mares <mj@ucw.cz>
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <stdio.h>
1362306a36Sopenharmony_ci#include <string.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define MAX_NAME_SIZE 63
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic void
1862306a36Sopenharmony_cipq(FILE *f, const char *c)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	while (*c) {
2162306a36Sopenharmony_ci		if (*c == '"')
2262306a36Sopenharmony_ci			fprintf(f, "\\\"");
2362306a36Sopenharmony_ci		else
2462306a36Sopenharmony_ci			fputc(*c, f);
2562306a36Sopenharmony_ci		c++;
2662306a36Sopenharmony_ci	}
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciint
3062306a36Sopenharmony_cimain(void)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	char line[1024], *c, *bra, manuf[8];
3362306a36Sopenharmony_ci	int manufs = 0;
3462306a36Sopenharmony_ci	int mode = 0;
3562306a36Sopenharmony_ci	int lino = 0;
3662306a36Sopenharmony_ci	int manuf_len = 0;
3762306a36Sopenharmony_ci	FILE *devf;
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	devf = fopen("devlist.h", "w");
4062306a36Sopenharmony_ci	if (!devf) {
4162306a36Sopenharmony_ci		fprintf(stderr, "Cannot create output file!\n");
4262306a36Sopenharmony_ci		return 1;
4362306a36Sopenharmony_ci	}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	while (fgets(line, sizeof(line)-1, stdin)) {
4662306a36Sopenharmony_ci		lino++;
4762306a36Sopenharmony_ci		if ((c = strchr(line, '\n')))
4862306a36Sopenharmony_ci			*c = 0;
4962306a36Sopenharmony_ci		if (!line[0] || line[0] == '#')
5062306a36Sopenharmony_ci			continue;
5162306a36Sopenharmony_ci		if (line[0] == '\t') {
5262306a36Sopenharmony_ci			switch (mode) {
5362306a36Sopenharmony_ci			case 1:
5462306a36Sopenharmony_ci				if (strlen(line) > 5 && line[5] == ' ') {
5562306a36Sopenharmony_ci					c = line + 5;
5662306a36Sopenharmony_ci					while (*c == ' ')
5762306a36Sopenharmony_ci						*c++ = 0;
5862306a36Sopenharmony_ci					if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
5962306a36Sopenharmony_ci						/* Too long, try cutting off long description */
6062306a36Sopenharmony_ci						bra = strchr(c, '[');
6162306a36Sopenharmony_ci						if (bra && bra > c && bra[-1] == ' ')
6262306a36Sopenharmony_ci							bra[-1] = 0;
6362306a36Sopenharmony_ci						if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
6462306a36Sopenharmony_ci							fprintf(stderr, "Line %d: Product name too long\n", lino);
6562306a36Sopenharmony_ci							return 1;
6662306a36Sopenharmony_ci						}
6762306a36Sopenharmony_ci					}
6862306a36Sopenharmony_ci					fprintf(devf, "\tPRODUCT(%s,%s,\"", manuf, line+1);
6962306a36Sopenharmony_ci					pq(devf, c);
7062306a36Sopenharmony_ci					fputs("\")\n", devf);
7162306a36Sopenharmony_ci				} else goto err;
7262306a36Sopenharmony_ci				break;
7362306a36Sopenharmony_ci			default:
7462306a36Sopenharmony_ci				goto err;
7562306a36Sopenharmony_ci			}
7662306a36Sopenharmony_ci		} else if (strlen(line) > 4 && line[4] == ' ') {
7762306a36Sopenharmony_ci			c = line + 4;
7862306a36Sopenharmony_ci			while (*c == ' ')
7962306a36Sopenharmony_ci				*c++ = 0;
8062306a36Sopenharmony_ci			if (manufs)
8162306a36Sopenharmony_ci				fputs("ENDMANUF()\n\n", devf);
8262306a36Sopenharmony_ci			manufs++;
8362306a36Sopenharmony_ci			strcpy(manuf, line);
8462306a36Sopenharmony_ci			manuf_len = strlen(c);
8562306a36Sopenharmony_ci			if (manuf_len + 24 > MAX_NAME_SIZE) {
8662306a36Sopenharmony_ci				fprintf(stderr, "Line %d: manufacturer name too long\n", lino);
8762306a36Sopenharmony_ci				return 1;
8862306a36Sopenharmony_ci			}
8962306a36Sopenharmony_ci			fprintf(devf, "MANUF(%s,\"", manuf);
9062306a36Sopenharmony_ci			pq(devf, c);
9162306a36Sopenharmony_ci			fputs("\")\n", devf);
9262306a36Sopenharmony_ci			mode = 1;
9362306a36Sopenharmony_ci		} else {
9462306a36Sopenharmony_ci		err:
9562306a36Sopenharmony_ci			fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
9662306a36Sopenharmony_ci			return 1;
9762306a36Sopenharmony_ci		}
9862306a36Sopenharmony_ci	}
9962306a36Sopenharmony_ci	fputs("ENDMANUF()\n\
10062306a36Sopenharmony_ci\n\
10162306a36Sopenharmony_ci#undef MANUF\n\
10262306a36Sopenharmony_ci#undef PRODUCT\n\
10362306a36Sopenharmony_ci#undef ENDMANUF\n", devf);
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	fclose(devf);
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	return 0;
10862306a36Sopenharmony_ci}
109