/****************************************************************************
 * tools/mkconfig.c
 *
 *   Copyright (C) 2007-2013 Gregory Nutt. All rights reserved.
 *   Author: Gregory Nutt <gnutt@nuttx.org>
 *
 *   Modified by Denis Ciocca <denis.ciocca@st.com>
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 * 3. Neither the name NuttX nor the names of its contributors may be
 *    used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 *
 ****************************************************************************/

#include <string.h>
#include <stdlib.h>
#include <errno.h>

#include "cfgdefine.h"

#define DEFCONFIG ".config"

 static inline char *getfilepath(const char *name)
{
	snprintf(line, PATH_MAX, "%s/" DEFCONFIG, name);
	line[PATH_MAX] = '\0';
	return strdup(line);
}

static void show_usage(const char *progname)
{
	fprintf(stderr, "USAGE: %s <abs path to .config>\n", progname);
	exit(1);
}

int main(int argc, char **argv, char **envp)
{
	char *filepath;
	FILE *stream;

	if (argc != 2) {
		fprintf(stderr, "Unexpected number of arguments\n");
		show_usage(argv[0]);
	}

	filepath = getfilepath(argv[1]);
	if (!filepath) {
		fprintf(stderr, "getfilepath failed\n");
		exit(2);
	}

	stream = fopen(filepath, "r");
	if (!stream) {
		fprintf(stderr, "open %s failed: %s\n", filepath, strerror(errno));
		exit(3);
	}

	printf("/* configuration.h -- Autogenerated file! Do not edit. */\n\n");
	printf("#ifndef __ST_SENSOR_HAL_CONFIG_H\n");
	printf("#define __ST_SENSOR_HAL_CONFIG_H\n\n");
	generate_definitions(stream);
	printf("\n");
	printf("#endif /* __ST_SENSOR_HAL_CONFIG_H */\n");
	fclose(stream);

	return 0;
}
