/*
 * (C) Copyright 2001
 * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

/*
 * Misc functions
 */
#include <common.h>
#include <command.h>

#if (CONFIG_COMMANDS & CFG_CMD_MISC)

int do_sleep (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	ulong delay;

	if (argc != 2) {
		printf ("Usage:\n%s\n", cmdtp->usage);
		return 1;
	}

	delay = simple_strtoul(argv[1], NULL, 10);

	while (delay) {
		int i;
		for (i=0; i<1000; ++i) {
			if (ctrlc ()) {
				return (-1);
			}
			udelay (1000);
		}
		--delay;
	}
	return 0;
}
/* Implemented in $(CPU)/interrupts.c */
#if (CONFIG_COMMANDS & CFG_CMD_IRQ)
int do_irqinfo (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);

U_BOOT_CMD(
	irqinfo,    1,    1,     do_irqinfo,
	"irqinfo - print information about IRQs\n",
	NULL
);
#endif  /* CONFIG_COMMANDS & CFG_CMD_IRQ */

U_BOOT_CMD(
	sleep ,    2,    2,     do_sleep,
	"sleep   - delay execution for some time\n",
	"N\n"
	"    - delay execution for N seconds (N is _decimal_ !!!)\n"
);

#endif	/* CFG_CMD_MISC */

#if defined(CONFIG_ENABLE_IF_CMD)

int do_if (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
	int val1, val2;
	int i;
	char command_buf[128];
	int  run_cmd = 0;

	memset(command_buf, 0, sizeof(command_buf));

	if (argc < 5) 
	{
		printf("Too few args\n");
		return -1;
	}

	/* Check if we're using env variables */
	if (argv[1][0] == '$') 
	{
		argv[1] = argv[1]++;
		val1 = simple_strtol(getenv(argv[1]), NULL, 10);
	}
	else
		val1 = simple_strtol(argv[1], NULL, 10);

    if (argv[3][0] == '$') 
	{
		argv[3] = argv[3]++;
		val2 = simple_strtoul(argv[3], NULL, 10);
	}
	else
		val2 = simple_strtoul(argv[3], NULL, 10);

	/* Build full command string */
	for (i=4; i<argc; i++) 
	{
		if ( argv[i] != NULL )
		{
			strncat(command_buf, argv[i], sizeof(command_buf)-1);
			strncat(command_buf, " ", sizeof(command_buf)-1);
		}
	}

	/* Check if operation is valid, and logic is true */
	if ( (!strcmp(argv[2],"-lt")) || (!strcmp(argv[2],"<")) )
	{
		if ( val1 < val2 )
			run_cmd = 1;
	}
	else if ( (!strcmp(argv[2],"-lte")) || (!strcmp(argv[2],"<=")) )
	{
		if ( val1 <= val2 )
			run_cmd = 1;
	}
	else if ( (!strcmp(argv[2],"-gte")) || (!strcmp(argv[2],">=")) )
	{
		if ( val1 >= val2 )
			run_cmd = 1;
	}
	else if ( (!strcmp(argv[2],"-gt")) || (!strcmp(argv[2],">")) )
	{
		if ( val1 > val2 )
			run_cmd = 1;
	}
	else if ( (!strcmp(argv[2],"-eq")) || (!strcmp(argv[2],"==")) )
	{
		if ( val1 == val2 )
			run_cmd = 1;
	}
	else
	{
		printf("Invalid operation\n");
		return -1;
	}

	if ( run_cmd)
		run_command(command_buf, 0);

	return 0;
}

U_BOOT_CMD (if, 20, 5, do_if,
	    "if - if logic is true, run command\n",
	    "if val1 [<=>] val2 command\n"
		"  use $ for env variables.\n"
		"i.e. if $? >= 0 bootoctlinux 0 coremask=ff\n");

#endif /* CONFIG_ENABLE_IF_CMD */
