18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci *	Generate devlist.h from the Zorro ID file.
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci *	(c) 2000 Geert Uytterhoeven <geert@linux-m68k.org>
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci *	Based on the PCI version:
88c2ecf20Sopenharmony_ci *
98c2ecf20Sopenharmony_ci *	(c) 1999--2000 Martin Mares <mj@ucw.cz>
108c2ecf20Sopenharmony_ci */
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <stdio.h>
138c2ecf20Sopenharmony_ci#include <string.h>
148c2ecf20Sopenharmony_ci
158c2ecf20Sopenharmony_ci#define MAX_NAME_SIZE 63
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_cistatic void
188c2ecf20Sopenharmony_cipq(FILE *f, const char *c)
198c2ecf20Sopenharmony_ci{
208c2ecf20Sopenharmony_ci	while (*c) {
218c2ecf20Sopenharmony_ci		if (*c == '"')
228c2ecf20Sopenharmony_ci			fprintf(f, "\\\"");
238c2ecf20Sopenharmony_ci		else
248c2ecf20Sopenharmony_ci			fputc(*c, f);
258c2ecf20Sopenharmony_ci		c++;
268c2ecf20Sopenharmony_ci	}
278c2ecf20Sopenharmony_ci}
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ciint
308c2ecf20Sopenharmony_cimain(void)
318c2ecf20Sopenharmony_ci{
328c2ecf20Sopenharmony_ci	char line[1024], *c, *bra, manuf[8];
338c2ecf20Sopenharmony_ci	int manufs = 0;
348c2ecf20Sopenharmony_ci	int mode = 0;
358c2ecf20Sopenharmony_ci	int lino = 0;
368c2ecf20Sopenharmony_ci	int manuf_len = 0;
378c2ecf20Sopenharmony_ci	FILE *devf;
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci	devf = fopen("devlist.h", "w");
408c2ecf20Sopenharmony_ci	if (!devf) {
418c2ecf20Sopenharmony_ci		fprintf(stderr, "Cannot create output file!\n");
428c2ecf20Sopenharmony_ci		return 1;
438c2ecf20Sopenharmony_ci	}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci	while (fgets(line, sizeof(line)-1, stdin)) {
468c2ecf20Sopenharmony_ci		lino++;
478c2ecf20Sopenharmony_ci		if ((c = strchr(line, '\n')))
488c2ecf20Sopenharmony_ci			*c = 0;
498c2ecf20Sopenharmony_ci		if (!line[0] || line[0] == '#')
508c2ecf20Sopenharmony_ci			continue;
518c2ecf20Sopenharmony_ci		if (line[0] == '\t') {
528c2ecf20Sopenharmony_ci			switch (mode) {
538c2ecf20Sopenharmony_ci			case 1:
548c2ecf20Sopenharmony_ci				if (strlen(line) > 5 && line[5] == ' ') {
558c2ecf20Sopenharmony_ci					c = line + 5;
568c2ecf20Sopenharmony_ci					while (*c == ' ')
578c2ecf20Sopenharmony_ci						*c++ = 0;
588c2ecf20Sopenharmony_ci					if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
598c2ecf20Sopenharmony_ci						/* Too long, try cutting off long description */
608c2ecf20Sopenharmony_ci						bra = strchr(c, '[');
618c2ecf20Sopenharmony_ci						if (bra && bra > c && bra[-1] == ' ')
628c2ecf20Sopenharmony_ci							bra[-1] = 0;
638c2ecf20Sopenharmony_ci						if (manuf_len + strlen(c) + 1 > MAX_NAME_SIZE) {
648c2ecf20Sopenharmony_ci							fprintf(stderr, "Line %d: Product name too long\n", lino);
658c2ecf20Sopenharmony_ci							return 1;
668c2ecf20Sopenharmony_ci						}
678c2ecf20Sopenharmony_ci					}
688c2ecf20Sopenharmony_ci					fprintf(devf, "\tPRODUCT(%s,%s,\"", manuf, line+1);
698c2ecf20Sopenharmony_ci					pq(devf, c);
708c2ecf20Sopenharmony_ci					fputs("\")\n", devf);
718c2ecf20Sopenharmony_ci				} else goto err;
728c2ecf20Sopenharmony_ci				break;
738c2ecf20Sopenharmony_ci			default:
748c2ecf20Sopenharmony_ci				goto err;
758c2ecf20Sopenharmony_ci			}
768c2ecf20Sopenharmony_ci		} else if (strlen(line) > 4 && line[4] == ' ') {
778c2ecf20Sopenharmony_ci			c = line + 4;
788c2ecf20Sopenharmony_ci			while (*c == ' ')
798c2ecf20Sopenharmony_ci				*c++ = 0;
808c2ecf20Sopenharmony_ci			if (manufs)
818c2ecf20Sopenharmony_ci				fputs("ENDMANUF()\n\n", devf);
828c2ecf20Sopenharmony_ci			manufs++;
838c2ecf20Sopenharmony_ci			strcpy(manuf, line);
848c2ecf20Sopenharmony_ci			manuf_len = strlen(c);
858c2ecf20Sopenharmony_ci			if (manuf_len + 24 > MAX_NAME_SIZE) {
868c2ecf20Sopenharmony_ci				fprintf(stderr, "Line %d: manufacturer name too long\n", lino);
878c2ecf20Sopenharmony_ci				return 1;
888c2ecf20Sopenharmony_ci			}
898c2ecf20Sopenharmony_ci			fprintf(devf, "MANUF(%s,\"", manuf);
908c2ecf20Sopenharmony_ci			pq(devf, c);
918c2ecf20Sopenharmony_ci			fputs("\")\n", devf);
928c2ecf20Sopenharmony_ci			mode = 1;
938c2ecf20Sopenharmony_ci		} else {
948c2ecf20Sopenharmony_ci		err:
958c2ecf20Sopenharmony_ci			fprintf(stderr, "Line %d: Syntax error in mode %d: %s\n", lino, mode, line);
968c2ecf20Sopenharmony_ci			return 1;
978c2ecf20Sopenharmony_ci		}
988c2ecf20Sopenharmony_ci	}
998c2ecf20Sopenharmony_ci	fputs("ENDMANUF()\n\
1008c2ecf20Sopenharmony_ci\n\
1018c2ecf20Sopenharmony_ci#undef MANUF\n\
1028c2ecf20Sopenharmony_ci#undef PRODUCT\n\
1038c2ecf20Sopenharmony_ci#undef ENDMANUF\n", devf);
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	fclose(devf);
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ci	return 0;
1088c2ecf20Sopenharmony_ci}
109