139 lines
2.2 KiB
C
139 lines
2.2 KiB
C
|
/*
|
||
|
* 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();
|
||
|
}
|
||
|
|