gmcl_samurai_win32/memobj.cpp
2017-05-14 00:07:42 +03:00

121 lines
No EOL
2.1 KiB
C++

#include "memobj.h"
#include "struct.h"
int lMemObj_Create(CLuaState* L)
{
L->CheckType(1,NUMBER);
memobj_t* obj = new memobj_t;
obj->sz = L->GetInteger(1);
obj->mem = (void*)malloc(obj->sz);
userdata_t* pData = L->NewUserData();
pData->data = obj;
pData->type = MEMOBJ_TYPE;
L->GetMetaFromRegistry(MEMOBJ_NAME);
L->SetMetaTable(-2);
return 1;
}
memobj_t* MemObj_Check(CLuaState* L,int idx)
{
userdata_t* pData = L->GetUserData(idx);
if(pData->type == MEMOBJ_TYPE)
return (memobj_t*)pData->data;
else
return NULL;
}
int lMemObj_tostr(CLuaState* L)
{
memobj_t* obj = MemObj_Check(L,1);
if(!obj)
return 0;
else
L->PushFString("memobj_t mem %p size %d",obj->mem,obj->sz);
return 1;
}
int lMemObj_eq(CLuaState* L)
{
memobj_t* obj1 = MemObj_Check(L,1),*obj2 = MemObj_Check(L,2);
L->PushBool(((obj1->mem == obj2->mem) && (obj1->sz == obj2->sz)));
return 1;
}
int lMemObj_gc(CLuaState *L)
{
memobj_t* obj = MemObj_Check(L,1);
if(obj->mem)
free(obj->mem);
delete obj;
return 0;
}
int lMemObj_ToString(CLuaState* L)
{
memobj_t* obj = MemObj_Check(L,1);
L->PushString((const char*)obj->mem,obj->sz);
return 1;
}
int lMemObj_ToStruct(CLuaState* L)
{
memobj_t* obj = MemObj_Check(L,1);
Struct_Create(L,obj);
return 1;
}
int lMemObj_ToPointer(CLuaState* L)
{
memobj_t* obj = MemObj_Check(L,1);
L->PushInteger((int)obj->mem);
return 1;
}
int lMemObj_Free(CLuaState* L)
{
memobj_t* obj = MemObj_Check(L,1);
if(obj->mem)
{
free(obj->mem);
obj->mem = NULL;
}
return 0;
}
int MemObj_Open(CLuaState* L)
{
L->CreateMetaTable(MEMOBJ_NAME);
L->PushCFunction(lMemObj_tostr);
L->SetField(-2,"__tostring");
L->PushCFunction(lMemObj_eq);
L->SetField(-2,"__eq");
L->PushCFunction(lMemObj_gc);
L->SetField(-2,"__gc");
L->PushCFunction(lMemObj_Free);
L->SetField(-2,"Free");
L->PushCFunction(lMemObj_ToString);
L->SetField(-2,"ToString");
L->PushCFunction(lMemObj_ToStruct);
L->SetField(-2,"ToStruct");
L->PushCFunction(lMemObj_ToPointer);
L->SetField(-2,"ToPointer");
L->Push(-1);
L->SetField(-2,"__index");
return 0;
}
int MemObj_Close(CLuaState* L)
{
return 0;
}