#include "vmrunner.hpp" #include "coreshared.hpp" #include "fncwrapper.hpp" #include #include blrScriptVM *vm; callStack callStk; 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; int a=mgetc(); para->data.d|=(unsigned long long)a; } } int blrScriptVM::loadLSBFromMemory(const char *ptr,DWORD size) { cbyte=sbyte=(const unsigned char*)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;isetSeed(seed); lops=0; } void blrScriptVM::vmDeinit() { delete re; }