Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 7564 → Rev 7563

/programs/cmm/lisp/lisp.c
47,7 → 47,6
dword dataArgs = 0;
dword posArgs = 0;
dword ret = 0;
dword p = 0;
dataArgs = malloc(16*4);
posArgs = dataArgs;
name = malloc(100);
55,29 → 54,26
loop()
{
s = DSBYTE[code];
while(s == ' ')
{
code++;
s = DSBYTE[code];
}
if (!s) || (s==')')
{
code++;
break;
}
if (!args)
{
if (s != ')') // name function
if(s!=' ') && (s!=')') // name function
{
while (s != ' ') && (s != ')')
{
DSBYTE[pos] = s;
pos++;
code++;
s = DSBYTE[code];
pos++;
}
code--;
}
87,7 → 83,8
if(s == '(')
{
code++;
tmp = evalLisp();
DSDWORD[posArgs] = evalLisp();
posArgs += 4;
}
else if (s >= '0') && (s <= '9')
{
100,41 → 97,10
s = DSBYTE[code];
}
code--;
}
else if (s == '"')
{
tmp = malloc(100);
p = tmp;
code++;
s = DSBYTE[code];
while (s != '"') && (s)
{
DSBYTE[p] = s;
p++;
code++;
s = DSBYTE[code];
}
DSBYTE[p] = 0;
}
else if(s >= 'A') && (s <= 'z')
{
tmp = malloc(100);
p = tmp;
while (s >= 'A') && (s <= 'z')
{
DSBYTE[p] = s;
p++;
code++;
s = DSBYTE[code];
}
DSBYTE[p] = 0;
}
DSDWORD[posArgs] = tmp;
posArgs += 4;
}
}
code++;
args++;
}
149,7 → 115,7
{
dword brainFuckCode = 0;
word maxLoop = 1000;
dword txt = " (print 1)(print 2)";
dword txt = "(print (str 1) (str 2))";
buffer = malloc(bufferSize);
memory = malloc(memoryBrainfuck);
164,13 → 130,12
code = EAX;
loop()
{
WHILE(DSBYTE[code] == ' ') code++;
IF(DSBYTE[code]!='(') BREAK;
ELSE code++;
while(DSBYTE[code] == ' ') code++;
if(DSBYTE[code]!='(') break;
else code++;
evalLisp();
code--;
IF(DSBYTE[code]!=')') BREAK;
ELSE code++;
if(DSBYTE[code]!=')') break;
code++;
}
}
}
178,24 → 143,21
{
consoleInit();
con_printf stdcall ("Lisp interpreter v1.2");
while(maxLoop)
WHILE(maxLoop)
{
con_printf stdcall ("\r\n\r\nEnter code: ");
con_gets stdcall(buffer, bufferSize);
code = EAX;
//code = txt;
code = txt;
con_printf stdcall ("Output: ");
nextLispLine:
while(DSBYTE[code] == ' ') code++;
if(DSBYTE[code] == '(') code++;
else goto endNext;
if(DSBYTE[code]!='(') continue;
else code++;
evalLisp();
code--;
if(DSBYTE[code]==')') code++;
else goto endNext;
IF(!DSBYTE[code]) goto endNext;
if(DSBYTE[code]!=')') continue;
code++;
goto nextLispLine;
endNext:
maxLoop--;
}
}
/programs/cmm/lisp/stdcall.h
1,9 → 1,6
 
 
dword std_print(dword count, args)
:dword std_print(dword count, args)
{
consoleInit();
count = 1;
WHILE(count)
{
con_printf stdcall (DSDWORD[args]);
12,26 → 9,6
}
}
 
: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)
{
RETURN variables.get(DSDWORD[args]);
}
 
:dword std_str(dword count, args)
{
dword tmp = 0;
75,8 → 52,8
functions.init(100);
/* Console functions */
functions.set("print", #std_print);
/* String functions */
functions.set("str", #std_str);
87,10 → 64,6
functions.set("+", #std_add);
functions.set("-", #std_sub);
/* Lisp functions */
functions.set("set", #std_set);
functions.set("get", #std_get);
variables.init(100);
}
 
97,20 → 70,7
dword StdCall(dword count, name, args)
{
dword tmp = 0;
functions.get(name);
IF(EAX) RETURN EAX(count, args);
IF(!strcmp(name, "print"))
{
consoleInit();
count = 1;
WHILE(count)
{
con_printf stdcall (DSDWORD[args]);
args += 4;
count--;
}
}
RETURN 0;
}
 
}
/programs/cmm/lisp/example/str.lisp
1,0 → 0,0
(set var1 "test string")(print (get var1))
(print (str 123))