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