1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/extensions/structs/StructHandle.cpp Fri Aug 08 00:17:37 2008 +0000
1.3 @@ -0,0 +1,556 @@
1.4 +/**
1.5 +* vim: set ts=4 :
1.6 +* =============================================================================
1.7 +* SourceMod Sample Extension
1.8 +* Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
1.9 +* =============================================================================
1.10 +*
1.11 +* This program is free software; you can redistribute it and/or modify it under
1.12 +* the terms of the GNU General Public License, version 3.0, as published by the
1.13 +* Free Software Foundation.
1.14 +*
1.15 +* This program is distributed in the hope that it will be useful, but WITHOUT
1.16 +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
1.17 +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
1.18 +* details.
1.19 +*
1.20 +* You should have received a copy of the GNU General Public License along with
1.21 +* this program. If not, see <http://www.gnu.org/licenses/>.
1.22 +*
1.23 +* As a special exception, AlliedModders LLC gives you permission to link the
1.24 +* code of this program (as well as its derivative works) to "Half-Life 2," the
1.25 +* "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
1.26 +* by the Valve Corporation. You must obey the GNU General Public License in
1.27 +* all respects for all other code used. Additionally, AlliedModders LLC grants
1.28 +* this exception to all derivative works. AlliedModders LLC defines further
1.29 +* exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
1.30 +* or <http://www.sourcemod.net/license.php>.
1.31 +*
1.32 +* Version: $Id$
1.33 +*/
1.34 +
1.35 +#include "StructHandle.h"
1.36 +#include "extension.h"
1.37 +
1.38 +bool StructHandle::GetInt( const char *member, int *value )
1.39 +{
1.40 + int offset;
1.41 +
1.42 + if (!info->getOffset(member, &offset))
1.43 + {
1.44 + return false;
1.45 + }
1.46 +
1.47 + MemberType type;
1.48 +
1.49 + if (!info->getType(member, &type))
1.50 + {
1.51 + return false;
1.52 + }
1.53 +
1.54 + switch (type)
1.55 + {
1.56 + case Member_Int8:
1.57 + {
1.58 + *value = *(uint8 *)((unsigned char *)data + offset);
1.59 + break;
1.60 + }
1.61 +
1.62 + case Member_Int16:
1.63 + {
1.64 + *value = *(uint16 *)((unsigned char *)data + offset);
1.65 + break;
1.66 + }
1.67 +
1.68 + case Member_Int32:
1.69 + {
1.70 + *value = *(uint32 *)((unsigned char *)data + offset);
1.71 + break;
1.72 + }
1.73 +
1.74 + case Member_Int8Pointer:
1.75 + {
1.76 + *value = **(uint8 **)((unsigned char *)data + offset);
1.77 + break;
1.78 + }
1.79 +
1.80 + case Member_Int16Pointer:
1.81 + {
1.82 + *value = **(uint16 **)((unsigned char *)data + offset);
1.83 + break;
1.84 + }
1.85 +
1.86 + case Member_Int32Pointer:
1.87 + {
1.88 + *value = **(uint32 **)((unsigned char *)data + offset);
1.89 + break;
1.90 + }
1.91 +
1.92 + default:
1.93 + {
1.94 + return false;
1.95 + }
1.96 + }
1.97 +
1.98 + return true;
1.99 +}
1.100 +
1.101 +bool StructHandle::GetFloat( const char *member, float *value )
1.102 +{
1.103 + int offset;
1.104 +
1.105 + if (!info->getOffset(member, &offset))
1.106 + {
1.107 + return false;
1.108 + }
1.109 +
1.110 + MemberType type;
1.111 +
1.112 + if (!info->getType(member, &type))
1.113 + {
1.114 + return false;
1.115 + }
1.116 +
1.117 + switch (type)
1.118 + {
1.119 + case Member_Float:
1.120 + {
1.121 + *value = *(float *)((unsigned char *)data + offset);
1.122 + break;
1.123 + }
1.124 +
1.125 + case Member_FloatPointer:
1.126 + {
1.127 + *value = **(float **)((unsigned char *)data + offset);
1.128 + break;
1.129 + }
1.130 +
1.131 + default:
1.132 + {
1.133 + return false;
1.134 + }
1.135 + }
1.136 +
1.137 + return true;
1.138 +}
1.139 +
1.140 +bool StructHandle::SetInt( const char *member, int value )
1.141 +{
1.142 + int offset;
1.143 +
1.144 + if (!info->getOffset(member, &offset))
1.145 + {
1.146 + return false;
1.147 + }
1.148 +
1.149 + MemberType type;
1.150 +
1.151 + if (!info->getType(member, &type))
1.152 + {
1.153 + return false;
1.154 + }
1.155 +
1.156 + switch (type)
1.157 + {
1.158 + case Member_Int8:
1.159 + {
1.160 + *(uint8 *)((unsigned char *)data + offset) = value;
1.161 + break;
1.162 + }
1.163 +
1.164 + case Member_Int16:
1.165 + {
1.166 + *(uint16 *)((unsigned char *)data + offset) = value;
1.167 + break;
1.168 + }
1.169 +
1.170 + case Member_Int32:
1.171 + {
1.172 + *(uint32 *)((unsigned char *)data + offset) = value;
1.173 + break;
1.174 + }
1.175 +
1.176 + case Member_Int8Pointer:
1.177 + {
1.178 + **(uint8 **)((unsigned char *)data + offset) = value;
1.179 + break;
1.180 + }
1.181 +
1.182 + case Member_Int16Pointer:
1.183 + {
1.184 + **(uint16 **)((unsigned char *)data + offset) = value;
1.185 + break;
1.186 + }
1.187 +
1.188 + case Member_Int32Pointer:
1.189 + {
1.190 + **(uint32 **)((unsigned char *)data + offset) = value;
1.191 + break;
1.192 + }
1.193 +
1.194 + default:
1.195 + {
1.196 + return false;
1.197 + }
1.198 + }
1.199 +
1.200 + return true;
1.201 +}
1.202 +
1.203 +bool StructHandle::SetFloat( const char *member, float value )
1.204 +{
1.205 + int offset;
1.206 +
1.207 + if (!info->getOffset(member, &offset))
1.208 + {
1.209 + return false;
1.210 + }
1.211 +
1.212 + MemberType type;
1.213 +
1.214 + if (!info->getType(member, &type))
1.215 + {
1.216 + return false;
1.217 + }
1.218 +
1.219 + switch (type)
1.220 + {
1.221 + case Member_Float:
1.222 + {
1.223 + *(float *)((unsigned char *)data + offset) = value;
1.224 + break;
1.225 + }
1.226 +
1.227 + case Member_FloatPointer:
1.228 + {
1.229 + **(float **)((unsigned char *)data + offset) = value;
1.230 + break;
1.231 + }
1.232 +
1.233 + default:
1.234 + {
1.235 + return false;
1.236 + }
1.237 + }
1.238 +
1.239 + return true;
1.240 +}
1.241 +
1.242 +bool StructHandle::IsPointerNull( const char *member, bool *result )
1.243 +{
1.244 + int offset;
1.245 +
1.246 + if (!info->getOffset(member, &offset))
1.247 + {
1.248 + return false;
1.249 + }
1.250 +
1.251 + MemberType type;
1.252 +
1.253 + if (!info->getType(member, &type))
1.254 + {
1.255 + return false;
1.256 + }
1.257 +
1.258 + switch (type)
1.259 + {
1.260 + case Member_Int8Pointer:
1.261 + case Member_Int16Pointer:
1.262 + case Member_Int32Pointer:
1.263 + case Member_FloatPointer:
1.264 + case Member_CharPointer:
1.265 + case Member_VectorPointer:
1.266 + case Member_EHandlePointer:
1.267 + {
1.268 + *result = *((unsigned char **)data + offset) == NULL;
1.269 + break;
1.270 + }
1.271 +
1.272 + default:
1.273 + {
1.274 + return false;
1.275 + }
1.276 + }
1.277 +
1.278 + return true;
1.279 +}
1.280 +
1.281 +bool StructHandle::setPointerNull( const char *member )
1.282 +{
1.283 + int offset;
1.284 +
1.285 + if (!info->getOffset(member, &offset))
1.286 + {
1.287 + return false;
1.288 + }
1.289 +
1.290 + MemberType type;
1.291 +
1.292 + if (!info->getType(member, &type))
1.293 + {
1.294 + return false;
1.295 + }
1.296 +
1.297 + switch (type)
1.298 + {
1.299 + case Member_Int8Pointer:
1.300 + case Member_Int16Pointer:
1.301 + case Member_Int32Pointer:
1.302 + case Member_FloatPointer:
1.303 + case Member_CharPointer:
1.304 + case Member_VectorPointer:
1.305 + case Member_EHandlePointer:
1.306 + {
1.307 + *((unsigned char **)data + offset) = NULL;
1.308 + break;
1.309 + }
1.310 +
1.311 + default:
1.312 + {
1.313 + return false;
1.314 + }
1.315 + }
1.316 +
1.317 + return true;
1.318 +}
1.319 +
1.320 +bool StructHandle::GetVector( const char *member, Vector *vec )
1.321 +{
1.322 + int offset;
1.323 +
1.324 + if (!info->getOffset(member, &offset))
1.325 + {
1.326 + return false;
1.327 + }
1.328 +
1.329 + MemberType type;
1.330 +
1.331 + if (!info->getType(member, &type))
1.332 + {
1.333 + return false;
1.334 + }
1.335 +
1.336 + switch (type)
1.337 + {
1.338 + case Member_Vector:
1.339 + {
1.340 + *vec = *(Vector *)((unsigned char *)data + offset);
1.341 + break;
1.342 + }
1.343 +
1.344 + case Member_VectorPointer:
1.345 + {
1.346 + *vec = **(Vector **)((unsigned char *)data + offset);
1.347 + break;
1.348 + }
1.349 +
1.350 + default:
1.351 + {
1.352 + return false;
1.353 + }
1.354 + }
1.355 +
1.356 + return true;
1.357 +}
1.358 +
1.359 +bool StructHandle::SetVector( const char *member, Vector vec )
1.360 +{
1.361 + int offset;
1.362 +
1.363 + if (!info->getOffset(member, &offset))
1.364 + {
1.365 + return false;
1.366 + }
1.367 +
1.368 + MemberType type;
1.369 +
1.370 + if (!info->getType(member, &type))
1.371 + {
1.372 + return false;
1.373 + }
1.374 +
1.375 + switch (type)
1.376 + {
1.377 + case Member_Vector:
1.378 + {
1.379 + *(Vector *)((unsigned char *)data + offset) = vec;
1.380 + break;
1.381 + }
1.382 +
1.383 + case Member_VectorPointer:
1.384 + {
1.385 + **(Vector **)((unsigned char *)data + offset) = vec;
1.386 + break;
1.387 + }
1.388 +
1.389 + default:
1.390 + {
1.391 + return false;
1.392 + }
1.393 + }
1.394 +
1.395 + return true;
1.396 +}
1.397 +
1.398 +bool StructHandle::GetString( const char *member, char **string )
1.399 +{
1.400 + int offset;
1.401 +
1.402 + if (!info->getOffset(member, &offset))
1.403 + {
1.404 + return false;
1.405 + }
1.406 +
1.407 + MemberType type;
1.408 +
1.409 + if (!info->getType(member, &type))
1.410 + {
1.411 + return false;
1.412 + }
1.413 +
1.414 + switch (type)
1.415 + {
1.416 + case Member_Char:
1.417 + {
1.418 + *string = (char *)((unsigned char *)data + offset);
1.419 + break;
1.420 + }
1.421 +
1.422 + case Member_CharPointer:
1.423 + {
1.424 + *string = *(char **)((unsigned char *)data + offset);
1.425 + break;
1.426 + }
1.427 +
1.428 + default:
1.429 + {
1.430 + return false;
1.431 + }
1.432 + }
1.433 +
1.434 + return true;
1.435 +}
1.436 +
1.437 +bool StructHandle::SetString( const char *member, char *string )
1.438 +{
1.439 + int offset;
1.440 +
1.441 + if (!info->getOffset(member, &offset))
1.442 + {
1.443 + return false;
1.444 + }
1.445 +
1.446 + MemberType type;
1.447 +
1.448 + if (!info->getType(member, &type))
1.449 + {
1.450 + return false;
1.451 + }
1.452 +
1.453 + switch (type)
1.454 + {
1.455 + case Member_Char:
1.456 + {
1.457 + int size;
1.458 + info->getSize(member, &size);
1.459 + char *location = (char *)data + offset;
1.460 + UTIL_Format(location, size, "%s", string);
1.461 + break;
1.462 + }
1.463 +
1.464 + case Member_CharPointer:
1.465 + {
1.466 + int size;
1.467 + info->getSize(member, &size);
1.468 + char *location = *(char **)((unsigned char *)data + offset);
1.469 + UTIL_Format(location, size, "%s", string);
1.470 + break;
1.471 + }
1.472 +
1.473 + default:
1.474 + {
1.475 + return false;
1.476 + }
1.477 + }
1.478 +
1.479 + return true;
1.480 +}
1.481 +
1.482 +bool StructHandle::GetEHandle( const char *member, CBaseHandle **handle )
1.483 +{
1.484 + int offset;
1.485 +
1.486 + if (!info->getOffset(member, &offset))
1.487 + {
1.488 + return false;
1.489 + }
1.490 +
1.491 + MemberType type;
1.492 +
1.493 + if (!info->getType(member, &type))
1.494 + {
1.495 + return false;
1.496 + }
1.497 +
1.498 + switch (type)
1.499 + {
1.500 + case Member_EHandle:
1.501 + {
1.502 + *handle = (CBaseHandle *)((unsigned char *)data + offset);
1.503 + break;
1.504 + }
1.505 +
1.506 + case Member_EHandlePointer:
1.507 + {
1.508 + *handle = *(CBaseHandle **)((unsigned char *)data + offset);
1.509 + break;
1.510 + }
1.511 +
1.512 + default:
1.513 + {
1.514 + return false;
1.515 + }
1.516 + }
1.517 +
1.518 + return true;
1.519 +}
1.520 +
1.521 +bool StructHandle::SetEHandle( const char *member, CBaseHandle *handle )
1.522 +{
1.523 + int offset;
1.524 +
1.525 + if (!info->getOffset(member, &offset))
1.526 + {
1.527 + return false;
1.528 + }
1.529 +
1.530 + MemberType type;
1.531 +
1.532 + if (!info->getType(member, &type))
1.533 + {
1.534 + return false;
1.535 + }
1.536 +
1.537 + switch (type)
1.538 + {
1.539 + case Member_Float:
1.540 + {
1.541 + *(CBaseHandle *)((unsigned char *)data + offset) = *handle;
1.542 + break;
1.543 + }
1.544 +
1.545 + case Member_FloatPointer:
1.546 + {
1.547 + **(CBaseHandle **)((unsigned char *)data + offset) = *handle;
1.548 + break;
1.549 + }
1.550 +
1.551 + default:
1.552 + {
1.553 + return false;
1.554 + }
1.555 + }
1.556 +
1.557 + return true;
1.558 +}
1.559 +