amxmodx/dlls/fakemeta/pdata.cpp
2006-02-11 22:56:55 +00:00

155 lines
3.1 KiB
C++
Executable File

#include "fakemeta_amxx.h"
#if defined WIN32
#define WINDOWS_LEAN_AND_MEAN
#include <windows.h>
#else
//implement these with setjmp later.
bool IsBadReadPtr(void *l, size_t size)
{
return false;
}
bool IsBadWritePtr(void *l, size_t size)
{
return false;
}
#endif
static cell AMX_NATIVE_CALL set_pdata_int(AMX *amx, cell *params)
{
int index=params[1];
CHECK_ENTITY(index);
int iOffset=params[2];
if (iOffset <0)
return 1;
#ifdef __linux__
iOffset += params[4];
#endif
int iValue=params[3];
*((int *)INDEXENT2(index)->pvPrivateData + iOffset) = iValue;
return 1;
}
static cell AMX_NATIVE_CALL get_pdata_int(AMX *amx, cell *params)
{
int index=params[1];
CHECK_ENTITY(index);
int iOffset=params[2];
if (iOffset <0)
return 0;
#ifdef __linux__
iOffset += params[3];
#endif
return *((int *)INDEXENT2(index)->pvPrivateData + iOffset);
}
// Float
static cell AMX_NATIVE_CALL set_pdata_float(AMX *amx, cell *params)
{
int index=params[1];
CHECK_ENTITY(index);
int iOffset=params[2];
if (iOffset <0)
return 1;
#ifdef __linux__
iOffset += params[4];
#endif
float fValue=amx_ctof(params[3]);
*((float *)INDEXENT2(index)->pvPrivateData + iOffset) = fValue;
return 1;
}
static cell AMX_NATIVE_CALL get_pdata_float(AMX *amx, cell *params)
{
int index=params[1];
CHECK_ENTITY(index);
int iOffset=params[2];
if (iOffset <0)
return 1;
#ifdef __linux__
iOffset += params[3];
#endif
return amx_ftoc(*((float *)INDEXENT2(index)->pvPrivateData + iOffset));
}
static cell AMX_NATIVE_CALL get_pdata_string(AMX *amx, cell *params)
{
int index=params[1];
CHECK_ENTITY(index);
int iOffset=params[2];
if (iOffset <0)
return 1;
#ifdef __linux__
iOffset += params[6];
#endif
edict_t *pEdict = INDEXENT2(index);
char *szData;
if (params[5])
{
szData = *((char **)pEdict->pvPrivateData + iOffset);
} else {
szData = (char *)pEdict->pvPrivateData + iOffset;
}
if (IsBadReadPtr(szData, 1))
{
return 0;
}
MF_SetAmxString(amx, params[3], szData, params[4]);
return 1;
}
static cell AMX_NATIVE_CALL set_pdata_string(AMX *amx, cell *params)
{
int index=params[1];
CHECK_ENTITY(index);
int iOffset=params[2];
if (iOffset <0)
return 1;
#ifdef __linux__
iOffset += params[5];
#endif
edict_t *pEdict = INDEXENT2(index);
char *szData;
int len;
char *data = MF_GetAmxString(amx, params[3], 0, &len);
if (params[4] == -1)
{
szData = (char *)pEdict->pvPrivateData + iOffset;
if (IsBadWritePtr(szData, 1))
return 0;
strcpy(szData, data);
} else {
szData = *((char **)pEdict->pvPrivateData + iOffset);
if (IsBadWritePtr(szData, 1))
return 0;
if (params[4] == 1)
{
free(szData);
szData = (char *)malloc(len + 1);
} else if (params[4] == 2) {
delete [] szData;
szData = new char[len + 1];
}
strcpy(szData, data);
*((char **)pEdict->pvPrivateData + iOffset) = szData;
}
return 1;
}
AMX_NATIVE_INFO pdata_natives[] = {
{ "get_pdata_int", get_pdata_int },
{ "set_pdata_int", set_pdata_int },
{ "get_pdata_float", get_pdata_float },
{ "set_pdata_float", set_pdata_float },
{ "set_pdata_string", set_pdata_string },
{ "get_pdata_string", get_pdata_string },
{ NULL, NULL }
};