0,0 → 1,160 |
/* |
* Author Pavel Iakovlev |
*/ |
|
#define MEMSIZE 4096*10 |
|
#include "../lib/io.h" |
#include "../lib/obj/console.h" |
|
byte initConsole = 0; |
|
#include "stdcall.h" |
|
#define bufferSize 10000; |
#define memoryBrainfuck 30000*4 |
#define memoryByteBF 1 |
#define stackBrainFuck 4*1024 |
|
dword buffer = 0; |
word bufferSymbol = 0; |
dword memory = 0; |
|
dword stack = 0; |
dword code = 0; |
byte tempBuffer[100] = {0}; |
|
void consoleInit() |
{ |
IF(!initConsole) |
{ |
load_dll(libConsole, #con_init, 0); |
con_init stdcall (-1, -1, -1, -1, "Lisp interpreter"); |
initConsole = 0xFF; |
} |
} |
|
dword evalLisp() |
{ |
byte s = 0; |
byte args = 0; |
dword pos = 0; |
dword name = 0; |
dword tmp = 0; |
dword dataArgs = 0; |
dword posArgs = 0; |
dword ret = 0; |
dataArgs = malloc(16*4); |
posArgs = dataArgs; |
name = malloc(100); |
pos = name; |
loop() |
{ |
s = DSBYTE[code]; |
while(s == ' ') |
{ |
code++; |
s = DSBYTE[code]; |
} |
if (!s) || (s==')') |
{ |
code++; |
break; |
} |
if (!args) |
{ |
if(s>='A') && (s<='z') // name function |
{ |
while (s>='A') && (s<='z') |
{ |
DSBYTE[pos] = s; |
code++; |
s = DSBYTE[code]; |
pos++; |
} |
code--; |
} |
} |
else |
{ |
if(s == '(') |
{ |
code++; |
DSDWORD[posArgs] = evalLisp(); |
posArgs += 4; |
} |
else if (s >= '0') && (s <= '9') |
{ |
tmp = 0; |
while (s >= '0') && (s <= '9') |
{ |
tmp *= 10; |
tmp += s-'0'; |
code++; |
s = DSBYTE[code]; |
} |
code--; |
DSDWORD[posArgs] = tmp; |
posArgs += 4; |
} |
} |
code++; |
args++; |
} |
args -= 2; |
ret = StdCall(args, name, dataArgs); |
free(name); |
free(dataArgs); |
return ret; |
} |
|
|
void main() |
{ |
dword brainFuckCode = 0; |
word maxLoop = 1000; |
|
buffer = malloc(bufferSize); |
memory = malloc(memoryBrainfuck); |
stack = malloc(stackBrainFuck); |
|
IF(DSBYTE[I_Param]) |
{ |
IF(io.read(I_Param)) |
{ |
code = EAX; |
loop() |
{ |
if(DSBYTE[code]!='(') break; |
else code++; |
evalLisp(); |
if(DSBYTE[code]!=')') break; |
code++; |
} |
} |
} |
ELSE |
{ |
consoleInit(); |
con_printf stdcall ("Lisp interpreter v1.0"); |
WHILE(maxLoop) |
{ |
con_printf stdcall ("\r\n\r\nEnter code: "); |
con_gets stdcall(buffer, bufferSize); |
code = EAX; |
con_printf stdcall ("Output: "); |
nextLispLine: |
if(DSBYTE[code]!='(') continue; |
else code++; |
evalLisp(); |
if(DSBYTE[code]!=')') continue; |
code++; |
goto nextLispLine; |
maxLoop--; |
} |
} |
|
IF(initConsole) con_exit stdcall (0); |
ExitProcess(); |
} |
|