From b9d4b60486e224261990c0732852513e86dd94ff Mon Sep 17 00:00:00 2001 From: Chris Xiong Date: Fri, 2 Oct 2015 23:48:34 +0800 Subject: Add BLR3 files. Modify Readme. Currently BLR3 is VERY primitive!! --- src/core/vmrunner.cpp | 280 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 src/core/vmrunner.cpp (limited to 'src/core/vmrunner.cpp') diff --git a/src/core/vmrunner.cpp b/src/core/vmrunner.cpp new file mode 100644 index 0000000..1942d74 --- /dev/null +++ b/src/core/vmrunner.cpp @@ -0,0 +1,280 @@ +#include "vmrunner.hpp" +#include "coreshared.hpp" +#include +unsigned getHash(const char *s) +{ + unsigned r=5381;char c; + while((c=(*s++)))r=((r<<5)+r)+c; + return r; +} +Idata& blrScriptVM::fetchData(SPara para,bool forcerw) +{ + static Idata cret; + switch (para.type) + { + case 0: + if(forcerw)throw; + cret.i()=para.data.i;cret.type=0; + return cret; + case 1: + if(forcerw)throw; + cret.r()=para.data.r;cret.type=1; + return cret; + case 2: + return ir[para.data.i]; + case 3: + return rr[para.data.i]; + case 4: + return ia[para.data.i]; + case 5: + return ra[para.data.i]; + case 6: + return ia[ir[para.data.i].i()]; + case 7: + return ra[ir[para.data.i].i()]; + default: + throw; + } +} +int blrScriptVM::mgetc() +{ + if(cbyte-sbytetype=mgetc(); + para->data.d=0; + int l=0; + switch(para->type) + { + case 1: l=8;break; + case 0: case 4: case 5: l=4;break; + case 2: case 3: case 6: case 7: l=1;break; + default: break; + } + for(int i=0;idata.d<<=8LL; + para->data.d|=(unsigned long long)mgetc(); + } +} +int blrScriptVM::loadLSBFromMemory(const char *ptr,DWORD size) +{ + cbyte=sbyte=ptr;fsize=size; + int ibyt=0,infunc=0; + while(~(ibyt=mgetc())) + { + ++ic;inst[ic].id=ibyt; + switch(inst[ic].id) + { + case 0xFF: case 0x02: + { + int nl=mgetc(); + if(nl==-1)return 1; + if(inst[ic].id==0xFF){if(infunc)return 1;else infunc=1;} + if(inst[ic].id==0x02)if(!infunc)return 1; + inst[ic].para1.fnc=(char*)calloc(sizeof(char),nl+1); + inst[ic].para1.type=8; + for(int i=0;i