view helpers/cfg-hdr-gen.c @ 640:16eb1b9640dc

target gtm900 renamed to gtm900mgc2 This change reflects the fact that the build target in question supports MGC2GSMT hardware only, and will NOT work on other hw that confusing bears the same end user name of GTM900, neither the LoCosto-based GTM900-C nor the Calypso-based MG01GSMT that has a different and incompatible RFFE. If we ever get our hands on a piece of MG01GSMT hw and add support for it, that other target will be named gtm900mg01.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 31 Jan 2020 00:46:07 +0000
parents b8b08c302ace
children
line wrap: on
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);
}