pred@2224: /**
pred@2224: * vim: set ts=4 :
pred@2224: * =============================================================================
pred@2224: * SourceMod Sample Extension
pred@2224: * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
pred@2224: * =============================================================================
pred@2224: *
pred@2224: * This program is free software; you can redistribute it and/or modify it under
pred@2224: * the terms of the GNU General Public License, version 3.0, as published by the
pred@2224: * Free Software Foundation.
pred@2224: *
pred@2224: * This program is distributed in the hope that it will be useful, but WITHOUT
pred@2224: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
pred@2224: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
pred@2224: * details.
pred@2224: *
pred@2224: * You should have received a copy of the GNU General Public License along with
pred@2224: * this program. If not, see .
pred@2224: *
pred@2224: * As a special exception, AlliedModders LLC gives you permission to link the
pred@2224: * code of this program (as well as its derivative works) to "Half-Life 2," the
pred@2224: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
pred@2224: * by the Valve Corporation. You must obey the GNU General Public License in
pred@2224: * all respects for all other code used. Additionally, AlliedModders LLC grants
pred@2224: * this exception to all derivative works. AlliedModders LLC defines further
pred@2224: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
pred@2224: * or .
pred@2224: *
pred@2224: * Version: $Id$
pred@2224: */
pred@2224:
pred@2224: #include "StructHandle.h"
pred@2224: #include "extension.h"
pred@2224:
pred@2224: bool StructHandle::GetInt( const char *member, int *value )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Int8:
pred@2224: {
pred@2224: *value = *(uint8 *)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int16:
pred@2224: {
pred@2224: *value = *(uint16 *)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int32:
pred@2224: {
pred@2224: *value = *(uint32 *)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int8Pointer:
pred@2224: {
pred@2224: *value = **(uint8 **)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int16Pointer:
pred@2224: {
pred@2224: *value = **(uint16 **)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int32Pointer:
pred@2224: {
pred@2224: *value = **(uint32 **)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::GetFloat( const char *member, float *value )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Float:
pred@2224: {
pred@2224: *value = *(float *)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_FloatPointer:
pred@2224: {
pred@2224: *value = **(float **)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::SetInt( const char *member, int value )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Int8:
pred@2224: {
pred@2224: *(uint8 *)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int16:
pred@2224: {
pred@2224: *(uint16 *)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int32:
pred@2224: {
pred@2224: *(uint32 *)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int8Pointer:
pred@2224: {
pred@2224: **(uint8 **)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int16Pointer:
pred@2224: {
pred@2224: **(uint16 **)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_Int32Pointer:
pred@2224: {
pred@2224: **(uint32 **)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::SetFloat( const char *member, float value )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Float:
pred@2224: {
pred@2224: *(float *)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_FloatPointer:
pred@2224: {
pred@2224: **(float **)((unsigned char *)data + offset) = value;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::IsPointerNull( const char *member, bool *result )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Int8Pointer:
pred@2224: case Member_Int16Pointer:
pred@2224: case Member_Int32Pointer:
pred@2224: case Member_FloatPointer:
pred@2224: case Member_CharPointer:
pred@2224: case Member_VectorPointer:
pred@2224: case Member_EHandlePointer:
pred@2224: {
pred@2224: *result = *((unsigned char **)data + offset) == NULL;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::setPointerNull( const char *member )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Int8Pointer:
pred@2224: case Member_Int16Pointer:
pred@2224: case Member_Int32Pointer:
pred@2224: case Member_FloatPointer:
pred@2224: case Member_CharPointer:
pred@2224: case Member_VectorPointer:
pred@2224: case Member_EHandlePointer:
pred@2224: {
pred@2224: *((unsigned char **)data + offset) = NULL;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::GetVector( const char *member, Vector *vec )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Vector:
pred@2224: {
pred@2224: *vec = *(Vector *)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_VectorPointer:
pred@2224: {
pred@2224: *vec = **(Vector **)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::SetVector( const char *member, Vector vec )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Vector:
pred@2224: {
pred@2224: *(Vector *)((unsigned char *)data + offset) = vec;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_VectorPointer:
pred@2224: {
pred@2224: **(Vector **)((unsigned char *)data + offset) = vec;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::GetString( const char *member, char **string )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Char:
pred@2224: {
pred@2224: *string = (char *)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_CharPointer:
pred@2224: {
pred@2224: *string = *(char **)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::SetString( const char *member, char *string )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Char:
pred@2224: {
pred@2224: int size;
pred@2224: info->getSize(member, &size);
pred@2224: char *location = (char *)data + offset;
pred@2224: UTIL_Format(location, size, "%s", string);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_CharPointer:
pred@2224: {
pred@2224: int size;
pred@2224: info->getSize(member, &size);
pred@2224: char *location = *(char **)((unsigned char *)data + offset);
pred@2224: UTIL_Format(location, size, "%s", string);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::GetEHandle( const char *member, CBaseHandle **handle )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_EHandle:
pred@2224: {
pred@2224: *handle = (CBaseHandle *)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_EHandlePointer:
pred@2224: {
pred@2224: *handle = *(CBaseHandle **)((unsigned char *)data + offset);
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224:
pred@2224: bool StructHandle::SetEHandle( const char *member, CBaseHandle *handle )
pred@2224: {
pred@2224: int offset;
pred@2224:
pred@2224: if (!info->getOffset(member, &offset))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: MemberType type;
pred@2224:
pred@2224: if (!info->getType(member, &type))
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224:
pred@2224: switch (type)
pred@2224: {
pred@2224: case Member_Float:
pred@2224: {
pred@2224: *(CBaseHandle *)((unsigned char *)data + offset) = *handle;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: case Member_FloatPointer:
pred@2224: {
pred@2224: **(CBaseHandle **)((unsigned char *)data + offset) = *handle;
pred@2224: break;
pred@2224: }
pred@2224:
pred@2224: default:
pred@2224: {
pred@2224: return false;
pred@2224: }
pred@2224: }
pred@2224:
pred@2224: return true;
pred@2224: }
pred@2224: