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: