forked from KolibriOS/kolibrios
5831d02aa5
git-svn-id: svn://kolibrios.org@7566 a494cfbc-eb01-0410-851d-a64ba20cac60
126 lines
1.8 KiB
C
126 lines
1.8 KiB
C
|
|
/* 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;
|
|
consoleInit();
|
|
WHILE(count)
|
|
{
|
|
IF(!DSDWORD[args]) con_printf stdcall ("nil");
|
|
ELSE con_printf stdcall (DSDWORD[args]);
|
|
args+=4;
|
|
count--;
|
|
}
|
|
RETURN ret;
|
|
}
|
|
|
|
:dword std_input(dword count, args)
|
|
{
|
|
dword buf = 0;
|
|
consoleInit();
|
|
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;
|
|
}
|
|
|