0,0 → 1,138 |
/* |
* 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}; |
|
|
#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, "Math interpreter"); |
initConsole = 0xFF; |
} |
} |
|
:dword getInteger() |
{ |
dword i = 0; |
byte z = 0; |
if (DSBYTE[code] == ' ') code++; |
if (DSBYTE[code] == '-') |
{ |
z = 0xFF; |
code++; |
} |
if (DSBYTE[code] >= '0') && (DSBYTE[code] <= '9') |
{ |
while (DSBYTE[code] >= '0') && (DSBYTE[code] <= '9') |
{ |
i *= 10; |
i += DSBYTE[code] - '0'; |
code++; |
} |
|
if (z) return -i; |
return i; |
} |
return 0; |
} |
|
:dword mathEval(dword i) |
{ |
while (DSBYTE[code] == ' ') code++; |
code++; |
switch (DSBYTE[code-1]) |
{ |
case '+': |
return i + mathEval(getInteger()); |
break; |
case '-': |
return i - mathEval(getInteger()); |
break; |
case '/': |
return i / mathEval(getInteger()); |
break; |
case '*': |
return i * mathEval(getInteger()); |
break; |
case '(': |
return mathEval(mathEval(getInteger())); |
break; |
case ')': |
return i; |
break; |
case 0: |
return 0; |
break; |
} |
return i; |
} |
|
:dword evalMath() |
{ |
return mathEval(getInteger()); |
} |
|
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; |
evalMath(); |
} |
} |
else |
{ |
consoleInit(); |
con_printf stdcall ("Math interpreter v1.0"); |
while(maxLoop) |
{ |
con_printf stdcall ("\r\n\r\n: "); |
con_gets stdcall(buffer, bufferSize); |
code = EAX; |
//code = txt; |
con_printf stdcall ("Result: "); |
evalMath(); |
con_printf stdcall (itoa(EAX)); |
maxLoop--; |
} |
} |
|
IF(initConsole) con_exit stdcall (0); |
ExitProcess(); |
} |
|