view helpers/cfg-hdr-gen.c @ 214:adfdbcd360fd

backlight evolution: API between Condat driver and MFW With this change, the API between the Condat backlight driver and its user in MFW now carries more abstract backlight state codes (fully off, fully on, in call, charging boot mode) instead of 0-255 levels. This change is needed in order to more properly support different hardware targets with different capabilities and approaches in terms of backlight handling.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 23 Apr 2021 23:52:02 +0000
parents 1fb47f5b597a
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);
}