extensions/structs/StructHandle.cpp
author Scott Ehlert <ds@alliedmods.net>
Thu Feb 06 00:28:29 2014 -0600 (2014-02-06)
changeset 4227 85383b6a2eb4
parent 2224 676c3b826f13
permissions -rw-r--r--
Update Linux dependency script to support getting Mac deps (no bug, r=dvander).
     1 /**
     2 * vim: set ts=4 :
     3 * =============================================================================
     4 * SourceMod Sample Extension
     5 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
     6 * =============================================================================
     7 *
     8 * This program is free software; you can redistribute it and/or modify it under
     9 * the terms of the GNU General Public License, version 3.0, as published by the
    10 * Free Software Foundation.
    11 * 
    12 * This program is distributed in the hope that it will be useful, but WITHOUT
    13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
    14 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
    15 * details.
    16 *
    17 * You should have received a copy of the GNU General Public License along with
    18 * this program.  If not, see <http://www.gnu.org/licenses/>.
    19 *
    20 * As a special exception, AlliedModders LLC gives you permission to link the
    21 * code of this program (as well as its derivative works) to "Half-Life 2," the
    22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
    23 * by the Valve Corporation.  You must obey the GNU General Public License in
    24 * all respects for all other code used.  Additionally, AlliedModders LLC grants
    25 * this exception to all derivative works.  AlliedModders LLC defines further
    26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
    27 * or <http://www.sourcemod.net/license.php>.
    28 *
    29 * Version: $Id$
    30 */
    31 
    32 #include "StructHandle.h"
    33 #include "extension.h"
    34 
    35 bool StructHandle::GetInt( const char *member, int *value )
    36 {
    37 	int offset;
    38 	
    39 	if (!info->getOffset(member, &offset))
    40 	{
    41 		return false;
    42 	}
    43 
    44 	MemberType type;
    45 
    46 	if (!info->getType(member, &type))
    47 	{
    48 		return false;
    49 	}
    50 
    51 	switch (type)
    52 	{
    53 		case Member_Int8:
    54 		{
    55 			*value = *(uint8 *)((unsigned char *)data + offset);
    56 			break;
    57 		}
    58 
    59 		case Member_Int16:
    60 		{
    61 			*value = *(uint16 *)((unsigned char *)data + offset);
    62 			break;
    63 		}
    64 
    65 		case Member_Int32:
    66 		{
    67 			*value = *(uint32 *)((unsigned char *)data + offset);
    68 			break;
    69 		}
    70 
    71 		case Member_Int8Pointer:
    72 		{
    73 			*value = **(uint8 **)((unsigned char *)data + offset);
    74 			break;
    75 		}
    76 
    77 		case Member_Int16Pointer:
    78 		{
    79 			*value = **(uint16 **)((unsigned char *)data + offset);
    80 			break;
    81 		}
    82 
    83 		case Member_Int32Pointer:
    84 		{
    85 			*value = **(uint32 **)((unsigned char *)data + offset);
    86 			break;
    87 		}
    88 
    89 		default:
    90 		{
    91 			return false;
    92 		}
    93 	}
    94 
    95 	return true;
    96 }
    97 
    98 bool StructHandle::GetFloat( const char *member, float *value )
    99 {
   100 	int offset;
   101 
   102 	if (!info->getOffset(member, &offset))
   103 	{
   104 		return false;
   105 	}
   106 
   107 	MemberType type;
   108 
   109 	if (!info->getType(member, &type))
   110 	{
   111 		return false;
   112 	}
   113 
   114 	switch (type)
   115 	{
   116 		case Member_Float:
   117 		{
   118 			*value = *(float *)((unsigned char *)data + offset);
   119 			break;
   120 		}
   121 
   122 		case Member_FloatPointer:
   123 		{
   124 			*value = **(float **)((unsigned char *)data + offset);
   125 			break;
   126 		}
   127 
   128 		default:
   129 		{
   130 			return false;
   131 		}
   132 	}
   133 
   134 	return true;
   135 }
   136 
   137 bool StructHandle::SetInt( const char *member, int value )
   138 {
   139 	int offset;
   140 
   141 	if (!info->getOffset(member, &offset))
   142 	{
   143 		return false;
   144 	}
   145 
   146 	MemberType type;
   147 
   148 	if (!info->getType(member, &type))
   149 	{
   150 		return false;
   151 	}
   152 
   153 	switch (type)
   154 	{
   155 		case Member_Int8:
   156 		{
   157 			*(uint8 *)((unsigned char *)data + offset) = value;
   158 			break;
   159 		}
   160 
   161 		case Member_Int16:
   162 		{
   163 			*(uint16 *)((unsigned char *)data + offset) = value;
   164 			break;
   165 		}
   166 
   167 		case Member_Int32:
   168 		{
   169 			*(uint32 *)((unsigned char *)data + offset) = value;
   170 			break;
   171 		}
   172 
   173 		case Member_Int8Pointer:
   174 		{
   175 			**(uint8 **)((unsigned char *)data + offset) = value;
   176 			break;
   177 		}
   178 
   179 		case Member_Int16Pointer:
   180 		{
   181 			**(uint16 **)((unsigned char *)data + offset) = value;
   182 			break;
   183 		}
   184 
   185 		case Member_Int32Pointer:
   186 		{
   187 			**(uint32 **)((unsigned char *)data + offset) = value;
   188 			break;
   189 		}
   190 
   191 		default:
   192 		{
   193 			return false;
   194 		}
   195 	}
   196 
   197 	return true;
   198 }
   199 
   200 bool StructHandle::SetFloat( const char *member, float value )
   201 {
   202 	int offset;
   203 
   204 	if (!info->getOffset(member, &offset))
   205 	{
   206 		return false;
   207 	}
   208 
   209 	MemberType type;
   210 
   211 	if (!info->getType(member, &type))
   212 	{
   213 		return false;
   214 	}
   215 
   216 	switch (type)
   217 	{
   218 		case Member_Float:
   219 		{
   220 			*(float *)((unsigned char *)data + offset) = value;
   221 			break;
   222 		}
   223 
   224 		case Member_FloatPointer:
   225 		{
   226 			**(float **)((unsigned char *)data + offset) = value;
   227 			break;
   228 		}
   229 
   230 		default:
   231 		{
   232 			return false;
   233 		}
   234 	}
   235 
   236 	return true;
   237 }
   238 
   239 bool StructHandle::IsPointerNull( const char *member, bool *result )
   240 {
   241 	int offset;
   242 
   243 	if (!info->getOffset(member, &offset))
   244 	{
   245 		return false;
   246 	}
   247 
   248 	MemberType type;
   249 
   250 	if (!info->getType(member, &type))
   251 	{
   252 		return false;
   253 	}
   254 
   255 	switch (type)
   256 	{
   257 		case Member_Int8Pointer:
   258 		case Member_Int16Pointer:
   259 		case Member_Int32Pointer:
   260 		case Member_FloatPointer:
   261 		case Member_CharPointer:
   262 		case Member_VectorPointer:
   263 		case Member_EHandlePointer:
   264 		{
   265 			*result = *((unsigned char **)data + offset) == NULL;
   266 			break;
   267 		}
   268 
   269 		default:
   270 		{
   271 			return false;
   272 		}
   273 	}
   274 
   275 	return true;
   276 }
   277 
   278 bool StructHandle::setPointerNull( const char *member )
   279 {
   280 	int offset;
   281 
   282 	if (!info->getOffset(member, &offset))
   283 	{
   284 		return false;
   285 	}
   286 
   287 	MemberType type;
   288 
   289 	if (!info->getType(member, &type))
   290 	{
   291 		return false;
   292 	}
   293 
   294 	switch (type)
   295 	{
   296 		case Member_Int8Pointer:
   297 		case Member_Int16Pointer:
   298 		case Member_Int32Pointer:
   299 		case Member_FloatPointer:
   300 		case Member_CharPointer:
   301 		case Member_VectorPointer:
   302 		case Member_EHandlePointer:
   303 		{
   304 			*((unsigned char **)data + offset) = NULL;
   305 			break;
   306 		}
   307 
   308 		default:
   309 		{
   310 			return false;
   311 		}
   312 	}
   313 
   314 	return true;
   315 }
   316 
   317 bool StructHandle::GetVector( const char *member, Vector *vec )
   318 {
   319 	int offset;
   320 
   321 	if (!info->getOffset(member, &offset))
   322 	{
   323 		return false;
   324 	}
   325 
   326 	MemberType type;
   327 
   328 	if (!info->getType(member, &type))
   329 	{
   330 		return false;
   331 	}
   332 
   333 	switch (type)
   334 	{
   335 		case Member_Vector:
   336 		{
   337 			*vec = *(Vector *)((unsigned char *)data + offset);
   338 			break;
   339 		}
   340 
   341 		case Member_VectorPointer:
   342 		{
   343 			*vec = **(Vector **)((unsigned char *)data + offset);
   344 			break;
   345 		}
   346 
   347 		default:
   348 		{
   349 			return false;
   350 		}
   351 	}
   352 
   353 	return true;
   354 }
   355 
   356 bool StructHandle::SetVector( const char *member, Vector vec )
   357 {
   358 	int offset;
   359 
   360 	if (!info->getOffset(member, &offset))
   361 	{
   362 		return false;
   363 	}
   364 
   365 	MemberType type;
   366 
   367 	if (!info->getType(member, &type))
   368 	{
   369 		return false;
   370 	}
   371 
   372 	switch (type)
   373 	{
   374 		case Member_Vector:
   375 		{
   376 			*(Vector *)((unsigned char *)data + offset) = vec;
   377 			break;
   378 		}
   379 
   380 		case Member_VectorPointer:
   381 		{
   382 			**(Vector **)((unsigned char *)data + offset) = vec;
   383 			break;
   384 		}
   385 
   386 		default:
   387 		{
   388 			return false;
   389 		}
   390 	}
   391 
   392 	return true;
   393 }
   394 
   395 bool StructHandle::GetString( const char *member, char **string )
   396 {
   397 	int offset;
   398 
   399 	if (!info->getOffset(member, &offset))
   400 	{
   401 		return false;
   402 	}
   403 
   404 	MemberType type;
   405 
   406 	if (!info->getType(member, &type))
   407 	{
   408 		return false;
   409 	}
   410 
   411 	switch (type)
   412 	{
   413 		case Member_Char:
   414 		{
   415 			*string = (char *)((unsigned char *)data + offset);
   416 			break;
   417 		}
   418 
   419 		case Member_CharPointer:
   420 		{
   421 			*string = *(char **)((unsigned char *)data + offset);
   422 			break;
   423 		}
   424 
   425 		default:
   426 		{
   427 			return false;
   428 		}
   429 	}
   430 
   431 	return true;
   432 }
   433 
   434 bool StructHandle::SetString( const char *member, char *string )
   435 {
   436 	int offset;
   437 
   438 	if (!info->getOffset(member, &offset))
   439 	{
   440 		return false;
   441 	}
   442 
   443 	MemberType type;
   444 
   445 	if (!info->getType(member, &type))
   446 	{
   447 		return false;
   448 	}
   449 
   450 	switch (type)
   451 	{
   452 		case Member_Char:
   453 		{
   454 			int size;
   455 			info->getSize(member, &size);
   456 			char *location = (char *)data + offset;
   457 			UTIL_Format(location, size, "%s", string);
   458 			break;
   459 		}
   460 
   461 		case Member_CharPointer:
   462 		{
   463 			int size;
   464 			info->getSize(member, &size);
   465 			char *location = *(char **)((unsigned char *)data + offset);
   466 			UTIL_Format(location, size, "%s", string);
   467 			break;
   468 		}
   469 
   470 		default:
   471 		{
   472 			return false;
   473 		}
   474 	}
   475 
   476 	return true;
   477 }
   478 
   479 bool StructHandle::GetEHandle( const char *member, CBaseHandle **handle )
   480 {
   481 	int offset;
   482 
   483 	if (!info->getOffset(member, &offset))
   484 	{
   485 		return false;
   486 	}
   487 
   488 	MemberType type;
   489 
   490 	if (!info->getType(member, &type))
   491 	{
   492 		return false;
   493 	}
   494 
   495 	switch (type)
   496 	{
   497 		case Member_EHandle:
   498 		{
   499 			*handle = (CBaseHandle *)((unsigned char *)data + offset);
   500 			break;
   501 		}
   502 
   503 		case Member_EHandlePointer:
   504 		{
   505 			*handle = *(CBaseHandle **)((unsigned char *)data + offset);
   506 			break;
   507 		}
   508 
   509 		default:
   510 		{
   511 			return false;
   512 		}
   513 	}
   514 
   515 	return true;
   516 }
   517 
   518 bool StructHandle::SetEHandle( const char *member, CBaseHandle *handle )
   519 {
   520 	int offset;
   521 
   522 	if (!info->getOffset(member, &offset))
   523 	{
   524 		return false;
   525 	}
   526 
   527 	MemberType type;
   528 
   529 	if (!info->getType(member, &type))
   530 	{
   531 		return false;
   532 	}
   533 
   534 	switch (type)
   535 	{
   536 		case Member_Float:
   537 		{
   538 			*(CBaseHandle *)((unsigned char *)data + offset) = *handle;
   539 			break;
   540 		}
   541 
   542 		case Member_FloatPointer:
   543 		{
   544 			**(CBaseHandle **)((unsigned char *)data + offset) = *handle;
   545 			break;
   546 		}
   547 
   548 		default:
   549 		{
   550 			return false;
   551 		}
   552 	}
   553 
   554 	return true;
   555 }
   556