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