forked from KolibriOS/kolibrios
Math interpreter allow calc
git-svn-id: svn://kolibrios.org@7574 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
dfca233dff
commit
03104b5bad
5
programs/cmm/math/compile.sh
Executable file
5
programs/cmm/math/compile.sh
Executable file
@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
for file in `find ./ -type f -name "*.c"`
|
||||||
|
do
|
||||||
|
cmm $file;
|
||||||
|
done
|
138
programs/cmm/math/math.c
Normal file
138
programs/cmm/math/math.c
Normal file
@ -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();
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user