view helpers/cfg-hdr-gen.c @ 540:f551ffdfe938
doc/Compiling: update for c155 target support and fc-host-tools-r9
author |
Mychaela Falconia <falcon@freecalypso.org> |
date |
Tue, 06 Nov 2018 05:03:55 +0000 (2018-11-06) |
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);
}