cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gen-devlist.c (2170B)


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