/* * Author Pavel Iakovlev */ #define MEMSIZE 4096*10 #include "../lib/io.h" #include "../lib/obj/console.h" #include "../lib/array.h" byte initConsole = 0; Dictionary functions = {0}; Dictionary variables = {0}; #include "stdcall.h" #define bufferSize 10000; #define memoryBrainfuck 30000*4 #define memoryByteBF 1 #define stackBrainFuck 4*1024 #define TStr 1 #define TInt 2 #define TSym 3 #define TBol 4 #define TLen 4*5 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 tmp2 = 0; dword dataArgs = 0; dword posArgs = 0; dword ret = 0; dword p = 0; dword i = 0; dword ii = 0; dataArgs = malloc(16*4); posArgs = dataArgs; loop() { s = DSBYTE[code]; while (s == ' ') || (s == 9) || (s == 10) || (s == 13) { code++; s = DSBYTE[code]; } if (!s) return 0; if (s==')') { code++; args--; ret = StdCall(args, name, dataArgs); free(name); //free(dataArgs); return ret; } if(s == '(') { code++; DSDWORD[posArgs] = evalLisp(); args++; posArgs += 4; continue; } else if (!args) { if (s != ')') // name function { name = malloc(100); pos = name; while (s) && (s != ' ') && (s != ')') { DSBYTE[pos] = s; pos++; code++; s = DSBYTE[code]; } DSBYTE[pos] = 0; args++; continue; } } else { if (s >= '0') && (s <= '9') { tmp = 0; while (s >= '0') && (s <= '9') { tmp *= 10; tmp += s-'0'; code++; s = DSBYTE[code]; } args++; EDX = malloc(TLen); DSDWORD[EDX] = tmp; DSDWORD[EDX+4] = TInt; DSDWORD[posArgs] = EDX; posArgs += 4; continue; } else if (s == '"') { i = 1; tmp = malloc(1<