/* Lisp functions */
:dword std_set(dword count, args)
{
	dword name = 0;
	dword value = 0;
	WHILE(count > 0)
	{
		name = DSDWORD[args];
		args += 4;
		value = DSDWORD[args];
		args += 4;
		variables.set(name, value);
		count -= 2;
	}
}

:dword std_get(dword count, args)
{
	IF(!count) RETURN 0;
	RETURN variables.get(DSDWORD[args]);
}

:dword std_str(dword count, args)
{
	dword tmp = 0;
	IF(!count) RETURN "";
	tmp = malloc(15);
	itoa_(tmp,DSDWORD[args]);
	RETURN tmp;
}

/* Math functions */
:dword std_add(dword count, args)
{
	dword ret = 0;
	WHILE(count)
	{
		ret += DSDWORD[args];
		args+=4;
		count--;
	}
	RETURN ret;
}

:dword std_sub(dword count, args)
{
	dword ret = 0;
	IF(count)
	{ 
		ret = DSDWORD[args];
		count--;
		args+=4;
	}
	WHILE(count)
	{
		ret -= DSDWORD[args];
		args += 4;
		count--;
	}
	RETURN ret;
}

/* Console functions */
:dword std_print(dword count, args)
{
	dword ret = 0;
	WHILE(count)
	{
		con_printf stdcall (DSDWORD[args]);
		args+=4;
		count--;
	}
	RETURN ret;
}

:dword std_input(dword count, args)
{
	dword buf = 0;
	buf = malloc(100);
	WHILE(count)
	{
		con_printf stdcall (DSDWORD[args]);
		args+=4;
		count--;
	}
	con_gets stdcall(buf, 100);
	RETURN EAX;
}

void Init()
{
	functions.init(100);
	
	/* Console functions */
	functions.set("print", #std_print);
	functions.set("input", #std_input);
	
	/* String functions */
	functions.set("str", #std_str);
	
	/* System functions */
	functions.set("exit", #ExitProcess);
	
	/* Math functions */
	functions.set("+", #std_add);
	functions.set("-", #std_sub);
	
	/* Lisp functions */
	functions.set("set", #std_set);
	functions.set("get", #std_get);
	
	variables.init(100);
}

dword StdCall(dword count, name, args)
{
	functions.get(name);
	IF(EAX) RETURN EAX(count, args);
	RETURN 0;
}