view helpers/cfg-hdr-gen.c @ 702:9394305d4ff5
default tip
etm_audio.c: fix off-by-one error in auw of FIR coefficients
This fix was already made in FC Tourmaline a while back, but it is also
the kind of bugfix that deserves to be backported to Magnetite and
Selenite as well.
author
Mychaela Falconia <falcon@freecalypso.org>
date
Mon, 31 Oct 2022 00:14:44 +0000 (2022-10-31)
parents
b8b08c302ace
children
line source
+ − /*
+ − * This helper program generates the set of *.cfg header files, based on a
+ − * template file and environment variables for the non-constant settings.
+ − */
+ −
+ − #include <stdio.h>
+ − #include <stdlib.h>
+ − #include <unistd.h>
+ − #include <ctype.h>
+ − #include <string.h>
+ − #include <strings.h>
+ −
+ − char *infname;
+ − FILE *inf, *outf;
+ − char include_guard_symbol[32];
+ − char linebuf[256];
+ − int lineno;
+ −
+ − make_include_guard_symbol(fname)
+ − char *fname;
+ − {
+ − char *sp, *dp;
+ − int c;
+ −
+ − sp = fname;
+ − dp = include_guard_symbol;
+ − *dp++ = '_';
+ − *dp++ = '_';
+ − while (c = *sp++) {
+ − if (islower(c))
+ − c = toupper(c);
+ − else if (c == '.')
+ − c = '_';
+ − *dp++ = c;
+ − }
+ − *dp++ = '_';
+ − *dp++ = '_';
+ − *dp = '\0';
+ − }
+ −
+ − close_output()
+ − {
+ − if (outf) {
+ − fprintf(outf, "#endif /* %s */\n", include_guard_symbol);
+ − fclose(outf);
+ − outf = 0;
+ − }
+ − }
+ −
+ − bracket_line()
+ − {
+ − char *cp;
+ −
+ − close_output();
+ − cp = index(linebuf+1, ']');
+ − if (!cp) {
+ − fprintf(stderr, "%s line %d: unterminated bracket line\n",
+ − infname, lineno);
+ − exit(1);
+ − }
+ − *cp = '\0';
+ − outf = fopen(linebuf+1, "w");
+ − if (!outf) {
+ − perror(linebuf+1);
+ − exit(1);
+ − }
+ − make_include_guard_symbol(linebuf+1);
+ − fprintf(outf, "#ifndef %s\n", include_guard_symbol);
+ − fprintf(outf, "#define %s\n", include_guard_symbol);
+ − }
+ −
+ − process_line()
+ − {
+ − char *cp, *symbol, *value;
+ −
+ − if (linebuf[0] == '[')
+ − return bracket_line();
+ − for (cp = linebuf; isspace(*cp); cp++)
+ − ;
+ − if (*cp == '\0' || *cp == '#')
+ − return;
+ − for (symbol = cp; *cp && !isspace(*cp); cp++)
+ − ;
+ − if (!*cp) {
+ − inv: fprintf(stderr, "%s line %d: expected two fields\n",
+ − infname, lineno);
+ − exit(1);
+ − }
+ − *cp++ = '\0';
+ − while (isspace(*cp))
+ − cp++;
+ − if (*cp == '\0' || *cp == '#')
+ − goto inv;
+ − for (value = cp; *cp && !isspace(*cp); cp++)
+ − ;
+ − if (*cp)
+ − *cp++ = '\0';
+ − while (isspace(*cp))
+ − cp++;
+ − if (*cp != '\0' && *cp != '#')
+ − goto inv;
+ − if (!strcmp(value, "var")) {
+ − value = getenv(symbol);
+ − if (!value) {
+ − fprintf(stderr,
+ − "%s line %d: no environment variable named %s\n",
+ − infname, lineno, symbol);
+ − exit(1);
+ − }
+ − }
+ − if (!outf) {
+ − fprintf(stderr, "%s line %d: no open output file\n",
+ − infname, lineno);
+ − exit(1);
+ − }
+ − fprintf(outf, "#define %s %s\n", symbol, value);
+ − }
+ −
+ − main(argc, argv)
+ − char **argv;
+ − {
+ − if (argc != 3) {
+ − fprintf(stderr, "usage: %s template-file output-dir\n",
+ − argv[0]);
+ − exit(1);
+ − }
+ − infname = argv[1];
+ − inf = fopen(infname, "r");
+ − if (!inf) {
+ − perror(infname);
+ − exit(1);
+ − }
+ − if (chdir(argv[2]) < 0) {
+ − perror(argv[2]);
+ − exit(1);
+ − }
+ − for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++)
+ − process_line();
+ − close_output();
+ − exit(0);
+ − }