FreeCalypso > hg > fc-tourmaline
diff helpers/cfg-hdr-gen.c @ 9:1fb47f5b597a
helpers: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 07:01:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/helpers/cfg-hdr-gen.c Fri Oct 16 07:01:13 2020 +0000 @@ -0,0 +1,141 @@ +/* + * 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); +}