gmcl_samurai_win32/struct.cpp
2017-05-14 00:58:45 +03:00

261 lines
No EOL
5 KiB
C++

#include "struct.h"
void Struct_Create(CLuaState* L,memobj_t* obj)
{
struct_t* stc = new struct_t;
stc->page = obj;
stc->s_ptr = (char*)stc->page->mem;
stc->bFree = false;
userdata_t* pData = L->NewUserData();
pData->data = (void*)stc;
pData->type = STRUCT_TYPE;
L->GetMetaFromRegistry(STRUCT_NAME);
L->SetMetaTable(-2);
}
int Struct_FromPointer(CLuaState* L)
{
struct_t* stc = new struct_t;
L->CheckType(1,NUMBER);
stc->page = new memobj_t;
stc->s_ptr = (char*)stc->page->mem;
stc->bFree = false;
userdata_t* pData = L->NewUserData();
pData->data = (void*)stc;
pData->type = STRUCT_TYPE;
L->GetMetaFromRegistry(STRUCT_NAME);
L->SetMetaTable(-2);
return 1;
}
struct_t* Check_Struct(CLuaState* L,int idx)
{
userdata_t* pData = L->GetUserData(idx);
if(pData->type == STRUCT_TYPE)
return (struct_t*)pData->data;
else
return NULL;
}
int lStruct_tostr(CLuaState* L)
{
struct_t* stc = Check_Struct(L,1);
L->PushFString("struct mem %p s_ptr %p size %d",stc->page->mem,stc->s_ptr,stc->page->sz);
return 1;
}
int lStruct_eq(CLuaState* L)
{
struct_t* st1 = Check_Struct(L,1),*st2 = Check_Struct(L,2);
L->PushBool(((st1->page == st2->page) && (st1->s_ptr == st2->s_ptr)));
return 1;
}
int lStruct_gc(CLuaState* L)
{
struct_t* stc = Check_Struct(L,1);
if(stc->bFree && stc->page->mem)
free(stc->page);
return 0;
}
int lStruct_ResetPtr(CLuaState* L)
{
struct_t* stc = Check_Struct(L,1);
stc->s_ptr = (char*)stc->page->mem;
return 0;
}
int lStruct_GetOffset(CLuaState* L)
{
struct_t* stc = Check_Struct(L,1);
L->PushInteger((int)(stc->s_ptr-(char*)stc->page->mem));
return 1;
}
int lStruct_SetOffset(CLuaState* L)
{
L->CheckType(2,NUMBER);
struct_t* stc = Check_Struct(L,1);
stc->s_ptr=(char*)L->GetInteger(2);
return 0;
}
int lStruct_Skip(CLuaState* L)
{
L->CheckType(2,NUMBER);
struct_t* stc = Check_Struct(L,1);
stc->s_ptr=(char*)(stc->s_ptr+L->GetInteger(2));
return 0;
}
int lStruct_PushString(CLuaState* L)
{
L->CheckType(2,STRING);
struct_t* stc = Check_Struct(L,1);
const char* str = L->GetString(2);
size_t len = strlen(str) + 1;
memcpy(stc->s_ptr,str,len);
stc->s_ptr = (char*)(stc->s_ptr+len);
return 0;
}
int lStruct_PushNumber(CLuaState* L)
{
L->CheckType(2,NUMBER);
L->CheckType(3,NUMBER);
struct_t* stc = Check_Struct(L,1);
size_t len = L->GetNumber(3);
int data = L->GetInteger(2);
if(len == 1)
*(unsigned char*)stc->s_ptr = (unsigned char)data;
else if(len == 2)
*(unsigned short*)stc->s_ptr = (unsigned short)data;
else if(len == 4)
*(unsigned int*)stc->s_ptr = (unsigned int)data;
stc->s_ptr = (char*)(stc->s_ptr+len);
return 0;
}
int lStruct_GetStringFixed(CLuaState* L)
{
L->CheckType(2,NUMBER);
struct_t* stc = Check_Struct(L,1);
size_t len = L->GetInteger(2);
L->PushString(stc->s_ptr);
stc->s_ptr = (char*)(stc->s_ptr+len);
return 1;
}
int lStruct_GetString(CLuaState* L)
{
struct_t* stc = Check_Struct(L,1);
size_t len = strlen(stc->s_ptr)+1;
L->PushString(stc->s_ptr);
stc->s_ptr = (char*)(stc->s_ptr+len);
return 1;
}
int lStruct_GetStringFromPtr(CLuaState* L)
{
struct_t* stc = Check_Struct(L,1);
L->PushString(stc->s_ptr);
stc->s_ptr = (char*)(stc->s_ptr+4);
return 1;
}
int lStruct_GetNumber(CLuaState* L)
{
L->CheckType(2,NUMBER);
struct_t* stc = Check_Struct(L,1);
size_t len = L->GetInteger(2);
int data;
if(len == 1)
data = stc->s_ptr[0];
else if(len == 2)
data = *(unsigned short*)stc->s_ptr;
else if(len == 4)
data = *(unsigned int*)stc->s_ptr;
L->PushInteger(data);
stc->s_ptr = (char*)(stc->s_ptr+len);
return 1;
}
int lStruct_ToPointer(CLuaState* L)
{
struct_t* stc = Check_Struct(L,1);
L->PushInteger((int)stc->page->mem);
return 1;
}
int Struct_Open(CLuaState* L)
{
L->PushNumber(1);
L->SetGlobal("BYTE");
L->PushNumber(2);
L->SetGlobal("WORD");
L->PushNumber(4);
L->SetGlobal("DWORD");
L->CreateMetaTable(STRUCT_NAME);
L->PushCFunction(lStruct_eq);
L->SetField(-2,"__eq");
L->PushCFunction(lStruct_gc);
L->SetField(-2,"__gc");
L->PushCFunction(lStruct_tostr);
L->SetField(-2,"__tostring");
L->PushCFunction(lStruct_ResetPtr);
L->SetField(-2,"ResetPtr");
L->PushCFunction(lStruct_GetOffset);
L->SetField(-2,"GetOffset");
L->PushCFunction(lStruct_SetOffset);
L->SetField(-2,"SetOffset");
L->PushCFunction(lStruct_Skip);
L->SetField(-2,"Skip");
L->PushCFunction(lStruct_PushString);
L->SetField(-2,"PushString");
L->PushCFunction(lStruct_PushNumber);
L->SetField(-2,"PushNumber");
L->PushCFunction(lStruct_GetStringFromPtr);
L->SetField(-2,"GetStringFromPtr");
L->PushCFunction(lStruct_GetStringFixed);
L->SetField(-2,"GetStringFixed");
L->PushCFunction(lStruct_GetString);
L->SetField(-2,"GetString");
L->PushCFunction(lStruct_GetNumber);
L->SetField(-2,"GetNumber");
L->PushCFunction(lStruct_ToPointer);
L->SetField(-2,"ToPointer");
L->Push(-1);
L->SetField(-2,"__index");
return 0;
}
int Struct_Close(CLuaState* L)
{
L->PushNil();
L->SetGlobal("BYTE");
L->PushNil();
L->SetGlobal("WORD");
L->PushNil();
L->SetGlobal("DWORD");
return 0;
}