Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 7561 → Rev 7562

/programs/cmm/lisp/compile.sh
0,0 → 1,5
#!/bin/bash
for file in `find ./ -type f -name "*.c"`
do
cmm $file;
done
Property changes:
Added: svn:executable
+*
\ No newline at end of property
/programs/cmm/lisp/example/str.lisp
0,0 → 1,0
(print (str 123))
/programs/cmm/lisp/lisp.c
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();
}
 
/programs/cmm/lisp/stdcall.h
0,0 → 1,24
dword StdCall(dword count, name, args)
{
dword tmp = 0;
if(!strcmp(name, "print"))
{
consoleInit();
con_printf stdcall (DSDWORD[args]);
}
else if(!strcmp(name, "input"))
{
}
else if(!strcmp(name, "str"))
{
tmp = malloc(15);
itoa_(tmp,DSDWORD[args]);
return tmp;
}
else if(!strcmp(name, "exit"))
{
ExitProcess();
}
return 0;
}