/*
 * Set up arguments for main() and prepare environment variables
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Library General Public License version 2.
 */

#include "libcflat.h"
#include "ctype.h"
#include "argv.h"
#include "auxinfo.h"

int __argc;
const char *__args;
char *__argv[100];
char *__environ[200];

char **environ = __environ;

static char args_copy[1000];
static char *copy_ptr = args_copy;

static const char *skip_blanks(const char *p)
{
	while (isblank(*p))
		++p;
	return p;
}

void __setup_args(void)
{
	const char *args = __args;
	char **argv = __argv + __argc;

	while (*(args = skip_blanks(args)) != '\0') {
		*argv++ = copy_ptr;
		while (*args != '\0' && !isblank(*args))
			*copy_ptr++ = *args++;
		*copy_ptr++ = '\0';
	}
	__argc = argv - __argv;
}

void setup_args(const char *args)
{
	if (!args)
		return;

	__args = args;
	__setup_args();
}

void add_setup_arg(const char *arg)
{
	__argv[__argc] = copy_ptr;
	strcpy(__argv[__argc], arg);
	copy_ptr += strlen(arg) + 1;
	++__argc;
}

void setup_args_progname(const char *args)
{
	add_setup_arg(auxinfo.progname);
	setup_args(args);
}

static char *env_eol(char *env)
{
	while (*env && *env != '\n')
		++env;
	return env;
}

static char *env_invalid_eol(char *env)
{
	char *eol = env_eol(env);
	char eol_old = *eol;

	*eol = '\0';
	printf("Invalid environment variable: %s\n", env);
	*eol = eol_old;
	return eol;
}

static char *env_next(char *env)
{
	char *p;

	if (!*env)
		return env;

	if (isalpha(*env) || *env == '_') {
		bool invalid = false;

		p = env + 1;
		while (*p && *p != '=' && *p != '\n') {
			if (!(isalnum(*p) || *p == '_'))
				invalid = true;
			++p;
		}

		if (*p != '=')
			invalid = true;

		if (invalid) {
			env = env_invalid_eol(env);
			return *env ? env_next(env + 1) : env;
		}
		return env;
	}

	p = env;
	while (isblank(*p))
		++p;

	if (*p == '\n')
		return env_next(p + 1);

	if (*p == '#')
		env = env_eol(env);
	else
		env = env_invalid_eol(env);

	return *env ? env_next(env + 1) : env;
}

void setup_env(char *env, int size)
{
	char *eof = env + size, *p = env;
	bool newline = false;
	int i = 0;

	while (*p)
		++p;
	if (p == eof)
		newline = true;

	while (env < eof) {
		if (newline)
			env = env_next(env);
		if (!*env || env >= eof)
			break;
		__environ[i++] = env;
		while (env < eof && *env && !(newline && *env == '\n'))
			++env;
		*env++ = '\0';
	}
}
