core/logic/smn_adt_array.cpp
author Nicholas Hastings <skamonkey@gmail.com>
Wed Aug 14 14:20:57 2013 -0400 (2013-08-14)
changeset 4008 490b01aa0683
parent 2726 c96f3fab8211
permissions -rw-r--r--
Updated some CS:GO gamedata.
dvander@2726
     1
/**
dvander@2726
     2
 * vim: set ts=4 :
dvander@2726
     3
 * =============================================================================
dvander@2726
     4
 * SourceMod
dvander@2726
     5
 * Copyright (C) 2004-2008 AlliedModders LLC.  All rights reserved.
dvander@2726
     6
 * =============================================================================
dvander@2726
     7
 *
dvander@2726
     8
 * This program is free software; you can redistribute it and/or modify it under
dvander@2726
     9
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2726
    10
 * Free Software Foundation.
dvander@2726
    11
 * 
dvander@2726
    12
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2726
    13
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2726
    14
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2726
    15
 * details.
dvander@2726
    16
 *
dvander@2726
    17
 * You should have received a copy of the GNU General Public License along with
dvander@2726
    18
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2726
    19
 *
dvander@2726
    20
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2726
    21
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2726
    22
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2726
    23
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2726
    24
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2726
    25
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2726
    26
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2726
    27
 * or <http://www.sourcemod.net/license.php>.
dvander@2726
    28
 *
dvander@2726
    29
 * Version: $Id$
dvander@2726
    30
 */
dvander@2726
    31
dvander@2726
    32
#include <stdlib.h>
dvander@2726
    33
#include "common_logic.h"
dvander@2726
    34
#include "CellArray.h"
dvander@2726
    35
dvander@2726
    36
HandleType_t htCellArray;
dvander@2726
    37
dvander@2726
    38
class CellArrayHelpers : 
dvander@2726
    39
	public SMGlobalClass,
dvander@2726
    40
	public IHandleTypeDispatch
dvander@2726
    41
{
dvander@2726
    42
public: //SMGlobalClass
dvander@2726
    43
	void OnSourceModAllInitialized()
dvander@2726
    44
	{
dvander@2726
    45
		htCellArray = handlesys->CreateType("CellArray", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@2726
    46
	}
dvander@2726
    47
	void OnSourceModShutdown()
dvander@2726
    48
	{
dvander@2726
    49
		handlesys->RemoveType(htCellArray, g_pCoreIdent);
dvander@2726
    50
	}
dvander@2726
    51
public: //IHandleTypeDispatch
dvander@2726
    52
	void OnHandleDestroy(HandleType_t type, void *object)
dvander@2726
    53
	{
dvander@2726
    54
		CellArray *array = (CellArray *)object;
dvander@2726
    55
		delete array;
dvander@2726
    56
	}
dvander@2726
    57
	bool GetHandleApproxSize(HandleType_t type, void *object, unsigned int *pSize)
dvander@2726
    58
	{
dvander@2726
    59
		CellArray *pArray = (CellArray *)object;
dvander@2726
    60
		*pSize = sizeof(CellArray) + pArray->mem_usage();
dvander@2726
    61
		return true;
dvander@2726
    62
	}
dvander@2726
    63
} s_CellArrayHelpers;
dvander@2726
    64
dvander@2726
    65
static cell_t CreateArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
    66
{
dvander@2726
    67
	if (!params[1])
dvander@2726
    68
	{
dvander@2726
    69
		return pContext->ThrowNativeError("Invalid block size (must be > 0)");
dvander@2726
    70
	}
dvander@2726
    71
dvander@2726
    72
	CellArray *array = new CellArray(params[1]);
dvander@2726
    73
dvander@2726
    74
	if (params[2])
dvander@2726
    75
	{
dvander@2726
    76
		array->resize(params[2]);
dvander@2726
    77
	}
dvander@2726
    78
	
dvander@2726
    79
	Handle_t hndl = handlesys->CreateHandle(htCellArray, array, pContext->GetIdentity(), g_pCoreIdent, NULL);
dvander@2726
    80
	if (!hndl)
dvander@2726
    81
	{
dvander@2726
    82
		delete array;
dvander@2726
    83
	}
dvander@2726
    84
dvander@2726
    85
	return hndl;
dvander@2726
    86
}
dvander@2726
    87
dvander@2726
    88
static cell_t ClearArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
    89
{
dvander@2726
    90
	CellArray *array;
dvander@2726
    91
	HandleError err;
dvander@2726
    92
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
    93
dvander@2726
    94
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
    95
		!= HandleError_None)
dvander@2726
    96
	{
dvander@2726
    97
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
    98
	}
dvander@2726
    99
dvander@2726
   100
	array->clear();
dvander@2726
   101
	
dvander@2726
   102
	return 1;
dvander@2726
   103
}
dvander@2726
   104
dvander@2726
   105
static cell_t ResizeArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   106
{
dvander@2726
   107
	CellArray *array;
dvander@2726
   108
	HandleError err;
dvander@2726
   109
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   110
dvander@2726
   111
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   112
		!= HandleError_None)
dvander@2726
   113
	{
dvander@2726
   114
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   115
	}
dvander@2726
   116
dvander@2726
   117
	if (!array->resize(params[2]))
dvander@2726
   118
	{
dvander@2726
   119
		return pContext->ThrowNativeError("Unable to resize array to \"%u\"", params[2]);
dvander@2726
   120
	}
dvander@2726
   121
dvander@2726
   122
	return 1;
dvander@2726
   123
}
dvander@2726
   124
dvander@2726
   125
static cell_t GetArraySize(IPluginContext *pContext, const cell_t *params)
dvander@2726
   126
{
dvander@2726
   127
	CellArray *array;
dvander@2726
   128
	HandleError err;
dvander@2726
   129
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   130
dvander@2726
   131
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   132
		!= HandleError_None)
dvander@2726
   133
	{
dvander@2726
   134
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   135
	}
dvander@2726
   136
dvander@2726
   137
	return (cell_t)array->size();
dvander@2726
   138
}
dvander@2726
   139
dvander@2726
   140
static cell_t PushArrayCell(IPluginContext *pContext, const cell_t *params)
dvander@2726
   141
{
dvander@2726
   142
	CellArray *array;
dvander@2726
   143
	HandleError err;
dvander@2726
   144
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   145
dvander@2726
   146
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   147
		!= HandleError_None)
dvander@2726
   148
	{
dvander@2726
   149
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   150
	}
dvander@2726
   151
dvander@2726
   152
	cell_t *blk = array->push();
dvander@2726
   153
	if (!blk)
dvander@2726
   154
	{
dvander@2726
   155
		return pContext->ThrowNativeError("Failed to grow array");
dvander@2726
   156
	}
dvander@2726
   157
dvander@2726
   158
	*blk = params[2];
dvander@2726
   159
dvander@2726
   160
	return (cell_t)(array->size() - 1);
dvander@2726
   161
}
dvander@2726
   162
dvander@2726
   163
static cell_t PushArrayString(IPluginContext *pContext, const cell_t *params)
dvander@2726
   164
{
dvander@2726
   165
	CellArray *array;
dvander@2726
   166
	HandleError err;
dvander@2726
   167
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   168
dvander@2726
   169
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   170
		!= HandleError_None)
dvander@2726
   171
	{
dvander@2726
   172
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   173
	}
dvander@2726
   174
dvander@2726
   175
	cell_t *blk = array->push();
dvander@2726
   176
	if (!blk)
dvander@2726
   177
	{
dvander@2726
   178
		return pContext->ThrowNativeError("Failed to grow array");
dvander@2726
   179
	}
dvander@2726
   180
dvander@2726
   181
	char *str;
dvander@2726
   182
	pContext->LocalToString(params[2], &str);
dvander@2726
   183
dvander@2726
   184
	smcore.strncopy((char *)blk, str, array->blocksize() * sizeof(cell_t));
dvander@2726
   185
dvander@2726
   186
	return (cell_t)(array->size() - 1);
dvander@2726
   187
}
dvander@2726
   188
dvander@2726
   189
static cell_t PushArrayArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   190
{
dvander@2726
   191
	CellArray *array;
dvander@2726
   192
	HandleError err;
dvander@2726
   193
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   194
dvander@2726
   195
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   196
		!= HandleError_None)
dvander@2726
   197
	{
dvander@2726
   198
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   199
	}
dvander@2726
   200
dvander@2726
   201
	cell_t *blk = array->push();
dvander@2726
   202
	if (!blk)
dvander@2726
   203
	{
dvander@2726
   204
		return pContext->ThrowNativeError("Failed to grow array");
dvander@2726
   205
	}
dvander@2726
   206
dvander@2726
   207
	cell_t *addr;
dvander@2726
   208
	pContext->LocalToPhysAddr(params[2], &addr);
dvander@2726
   209
dvander@2726
   210
	size_t indexes = array->blocksize();
dvander@2726
   211
	if (params[3] != -1 && (size_t)params[3] <= array->blocksize())
dvander@2726
   212
	{
dvander@2726
   213
		indexes = params[3];
dvander@2726
   214
	}
dvander@2726
   215
dvander@2726
   216
	memcpy(blk, addr, sizeof(cell_t) * indexes);
dvander@2726
   217
dvander@2726
   218
	return (cell_t)(array->size() - 1);
dvander@2726
   219
}
dvander@2726
   220
dvander@2726
   221
static cell_t GetArrayCell(IPluginContext *pContext, const cell_t *params)
dvander@2726
   222
{
dvander@2726
   223
	CellArray *array;
dvander@2726
   224
	HandleError err;
dvander@2726
   225
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   226
dvander@2726
   227
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   228
		!= HandleError_None)
dvander@2726
   229
	{
dvander@2726
   230
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   231
	}
dvander@2726
   232
dvander@2726
   233
	size_t idx = (size_t)params[2];
dvander@2726
   234
	if (idx >= array->size())
dvander@2726
   235
	{
dvander@2726
   236
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   237
	}
dvander@2726
   238
dvander@2726
   239
	cell_t *blk = array->at(idx);
dvander@2726
   240
dvander@2726
   241
	idx = (size_t)params[3];
dvander@2726
   242
	if (params[4] == 0)
dvander@2726
   243
	{
dvander@2726
   244
		if (idx >= array->blocksize())
dvander@2726
   245
		{
dvander@2726
   246
			return pContext->ThrowNativeError("Invalid block %d (blocksize: %d)", idx, array->blocksize());
dvander@2726
   247
		}
dvander@2726
   248
		return blk[idx];
dvander@2726
   249
	} else {
dvander@2726
   250
		if (idx >= array->blocksize() * 4)
dvander@2726
   251
		{
dvander@2726
   252
			return pContext->ThrowNativeError("Invalid byte %d (blocksize: %d bytes)", idx, array->blocksize() * 4);
dvander@2726
   253
		}
dvander@2726
   254
		return (cell_t)*((char *)blk + idx);
dvander@2726
   255
	}
dvander@2726
   256
dvander@2726
   257
	return 0;
dvander@2726
   258
}
dvander@2726
   259
dvander@2726
   260
static cell_t GetArrayString(IPluginContext *pContext, const cell_t *params)
dvander@2726
   261
{
dvander@2726
   262
	CellArray *array;
dvander@2726
   263
	HandleError err;
dvander@2726
   264
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   265
dvander@2726
   266
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   267
		!= HandleError_None)
dvander@2726
   268
	{
dvander@2726
   269
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   270
	}
dvander@2726
   271
dvander@2726
   272
	size_t idx = (size_t)params[2];
dvander@2726
   273
	if (idx >= array->size())
dvander@2726
   274
	{
dvander@2726
   275
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   276
	}
dvander@2726
   277
dvander@2726
   278
	cell_t *blk = array->at(idx);
dvander@2726
   279
	size_t numWritten = 0;
dvander@2726
   280
dvander@2726
   281
	pContext->StringToLocalUTF8(params[3], params[4], (char *)blk, &numWritten);
dvander@2726
   282
dvander@2726
   283
	return numWritten;
dvander@2726
   284
}
dvander@2726
   285
dvander@2726
   286
static cell_t GetArrayArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   287
{
dvander@2726
   288
	CellArray *array;
dvander@2726
   289
	HandleError err;
dvander@2726
   290
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   291
dvander@2726
   292
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   293
		!= HandleError_None)
dvander@2726
   294
	{
dvander@2726
   295
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   296
	}
dvander@2726
   297
dvander@2726
   298
	size_t idx = (size_t)params[2];
dvander@2726
   299
	if (idx >= array->size())
dvander@2726
   300
	{
dvander@2726
   301
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   302
	}
dvander@2726
   303
dvander@2726
   304
	cell_t *blk = array->at(idx);
dvander@2726
   305
	size_t indexes = array->blocksize();
dvander@2726
   306
	if (params[4] != -1 && (size_t)params[4] <= array->blocksize())
dvander@2726
   307
	{
dvander@2726
   308
		indexes = params[4];
dvander@2726
   309
	}
dvander@2726
   310
dvander@2726
   311
	cell_t *addr;
dvander@2726
   312
	pContext->LocalToPhysAddr(params[3], &addr);
dvander@2726
   313
dvander@2726
   314
	memcpy(addr, blk, sizeof(cell_t) * indexes);
dvander@2726
   315
dvander@2726
   316
	return indexes;
dvander@2726
   317
}
dvander@2726
   318
dvander@2726
   319
static cell_t SetArrayCell(IPluginContext *pContext, const cell_t *params)
dvander@2726
   320
{
dvander@2726
   321
	CellArray *array;
dvander@2726
   322
	HandleError err;
dvander@2726
   323
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   324
dvander@2726
   325
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   326
		!= HandleError_None)
dvander@2726
   327
	{
dvander@2726
   328
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   329
	}
dvander@2726
   330
dvander@2726
   331
	size_t idx = (size_t)params[2];
dvander@2726
   332
	if (idx >= array->size())
dvander@2726
   333
	{
dvander@2726
   334
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   335
	}
dvander@2726
   336
dvander@2726
   337
	cell_t *blk = array->at(idx);
dvander@2726
   338
dvander@2726
   339
	idx = (size_t)params[4];
dvander@2726
   340
	if (params[5] == 0)
dvander@2726
   341
	{
dvander@2726
   342
		if (idx >= array->blocksize())
dvander@2726
   343
		{
dvander@2726
   344
			return pContext->ThrowNativeError("Invalid block %d (blocksize: %d)", idx, array->blocksize());
dvander@2726
   345
		}
dvander@2726
   346
		blk[idx] = params[3];
dvander@2726
   347
	} else {
dvander@2726
   348
		if (idx >= array->blocksize() * 4)
dvander@2726
   349
		{
dvander@2726
   350
			return pContext->ThrowNativeError("Invalid byte %d (blocksize: %d bytes)", idx, array->blocksize() * 4);
dvander@2726
   351
		}
dvander@2726
   352
		*((char *)blk + idx) = (char)params[3];
dvander@2726
   353
	}
dvander@2726
   354
dvander@2726
   355
	return 1;
dvander@2726
   356
}
dvander@2726
   357
dvander@2726
   358
static cell_t SetArrayString(IPluginContext *pContext, const cell_t *params)
dvander@2726
   359
{
dvander@2726
   360
	CellArray *array;
dvander@2726
   361
	HandleError err;
dvander@2726
   362
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   363
dvander@2726
   364
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   365
		!= HandleError_None)
dvander@2726
   366
	{
dvander@2726
   367
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   368
	}
dvander@2726
   369
dvander@2726
   370
	size_t idx = (size_t)params[2];
dvander@2726
   371
	if (idx >= array->size())
dvander@2726
   372
	{
dvander@2726
   373
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   374
	}
dvander@2726
   375
dvander@2726
   376
	cell_t *blk = array->at(idx);
dvander@2726
   377
dvander@2726
   378
	char *str;
dvander@2726
   379
	pContext->LocalToString(params[3], &str);
dvander@2726
   380
dvander@2726
   381
	return smcore.strncopy((char *)blk, str, array->blocksize() * sizeof(cell_t));
dvander@2726
   382
}
dvander@2726
   383
dvander@2726
   384
static cell_t SetArrayArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   385
{
dvander@2726
   386
	CellArray *array;
dvander@2726
   387
	HandleError err;
dvander@2726
   388
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   389
dvander@2726
   390
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   391
		!= HandleError_None)
dvander@2726
   392
	{
dvander@2726
   393
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   394
	}
dvander@2726
   395
dvander@2726
   396
	size_t idx = (size_t)params[2];
dvander@2726
   397
	if (idx >= array->size())
dvander@2726
   398
	{
dvander@2726
   399
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   400
	}
dvander@2726
   401
dvander@2726
   402
	cell_t *blk = array->at(idx);
dvander@2726
   403
	size_t indexes = array->blocksize();
dvander@2726
   404
	if (params[4] != -1 && (size_t)params[4] <= array->blocksize())
dvander@2726
   405
	{
dvander@2726
   406
		indexes = params[4];
dvander@2726
   407
	}
dvander@2726
   408
dvander@2726
   409
	cell_t *addr;
dvander@2726
   410
	pContext->LocalToPhysAddr(params[3], &addr);
dvander@2726
   411
dvander@2726
   412
	memcpy(blk, addr, sizeof(cell_t) * indexes);
dvander@2726
   413
dvander@2726
   414
	return indexes;
dvander@2726
   415
}
dvander@2726
   416
dvander@2726
   417
static cell_t ShiftArrayUp(IPluginContext *pContext, const cell_t *params)
dvander@2726
   418
{
dvander@2726
   419
	CellArray *array;
dvander@2726
   420
	HandleError err;
dvander@2726
   421
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   422
dvander@2726
   423
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   424
		!= HandleError_None)
dvander@2726
   425
	{
dvander@2726
   426
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   427
	}
dvander@2726
   428
dvander@2726
   429
	size_t idx = (size_t)params[2];
dvander@2726
   430
	if (idx >= array->size())
dvander@2726
   431
	{
dvander@2726
   432
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   433
	}
dvander@2726
   434
dvander@2726
   435
	array->insert_at(idx);
dvander@2726
   436
dvander@2726
   437
	return 1;
dvander@2726
   438
}
dvander@2726
   439
dvander@2726
   440
static cell_t RemoveFromArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   441
{
dvander@2726
   442
	CellArray *array;
dvander@2726
   443
	HandleError err;
dvander@2726
   444
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   445
dvander@2726
   446
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   447
		!= HandleError_None)
dvander@2726
   448
	{
dvander@2726
   449
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   450
	}
dvander@2726
   451
dvander@2726
   452
	size_t idx = (size_t)params[2];
dvander@2726
   453
	if (idx >= array->size())
dvander@2726
   454
	{
dvander@2726
   455
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx, array->size());
dvander@2726
   456
	}
dvander@2726
   457
dvander@2726
   458
	array->remove(idx);
dvander@2726
   459
dvander@2726
   460
	return 1;
dvander@2726
   461
}
dvander@2726
   462
dvander@2726
   463
static cell_t SwapArrayItems(IPluginContext *pContext, const cell_t *params)
dvander@2726
   464
{
dvander@2726
   465
	CellArray *array;
dvander@2726
   466
	HandleError err;
dvander@2726
   467
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   468
dvander@2726
   469
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   470
		!= HandleError_None)
dvander@2726
   471
	{
dvander@2726
   472
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   473
	}
dvander@2726
   474
dvander@2726
   475
	size_t idx1 = (size_t)params[2];
dvander@2726
   476
	size_t idx2 = (size_t)params[3];
dvander@2726
   477
	if (idx1 >= array->size())
dvander@2726
   478
	{
dvander@2726
   479
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx1, array->size());
dvander@2726
   480
	}
dvander@2726
   481
	if (idx2 >= array->size())
dvander@2726
   482
	{
dvander@2726
   483
		return pContext->ThrowNativeError("Invalid index %d (count: %d)", idx2, array->size());
dvander@2726
   484
	}
dvander@2726
   485
dvander@2726
   486
	array->swap(idx1, idx2);
dvander@2726
   487
dvander@2726
   488
	return 1;
dvander@2726
   489
}
dvander@2726
   490
dvander@2726
   491
static cell_t CloneArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   492
{
dvander@2726
   493
	CellArray *oldArray;
dvander@2726
   494
	HandleError err;
dvander@2726
   495
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   496
dvander@2726
   497
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&oldArray)) 
dvander@2726
   498
		!= HandleError_None)
dvander@2726
   499
	{
dvander@2726
   500
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   501
	}
dvander@2726
   502
dvander@2726
   503
	CellArray *array = oldArray->clone();
dvander@2726
   504
	
dvander@2726
   505
	Handle_t hndl = handlesys->CreateHandle(htCellArray, array, pContext->GetIdentity(), g_pCoreIdent, NULL);
dvander@2726
   506
	if (!hndl)
dvander@2726
   507
	{
dvander@2726
   508
		delete array;
dvander@2726
   509
	}
dvander@2726
   510
dvander@2726
   511
	return hndl;
dvander@2726
   512
}
dvander@2726
   513
dvander@2726
   514
static cell_t FindStringInArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   515
{
dvander@2726
   516
	CellArray *array;
dvander@2726
   517
	HandleError err;
dvander@2726
   518
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   519
dvander@2726
   520
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   521
		!= HandleError_None)
dvander@2726
   522
	{
dvander@2726
   523
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   524
	}
dvander@2726
   525
dvander@2726
   526
	char *str;
dvander@2726
   527
	pContext->LocalToString(params[2], &str);
dvander@2726
   528
dvander@2726
   529
	for (unsigned int i = 0; i < array->size(); i++)
dvander@2726
   530
	{
dvander@2726
   531
		const char *array_str = (const char *)array->at(i);
dvander@2726
   532
		if (strcmp(str, array_str) == 0)
dvander@2726
   533
		{
dvander@2726
   534
			return (cell_t) i;
dvander@2726
   535
		}
dvander@2726
   536
	}
dvander@2726
   537
dvander@2726
   538
	return -1;
dvander@2726
   539
}
dvander@2726
   540
dvander@2726
   541
static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params)
dvander@2726
   542
{
dvander@2726
   543
	CellArray *array;
dvander@2726
   544
	HandleError err;
dvander@2726
   545
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
dvander@2726
   546
dvander@2726
   547
	if ((err = handlesys->ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
dvander@2726
   548
		!= HandleError_None)
dvander@2726
   549
	{
dvander@2726
   550
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
dvander@2726
   551
	}
dvander@2726
   552
dvander@2726
   553
	for (unsigned int i = 0; i < array->size(); i++)
dvander@2726
   554
	{
dvander@2726
   555
		if (params[2] == *array->at(i))
dvander@2726
   556
		{
dvander@2726
   557
			return (cell_t) i;
dvander@2726
   558
		}
dvander@2726
   559
	}
dvander@2726
   560
dvander@2726
   561
	return -1;
dvander@2726
   562
}
dvander@2726
   563
dvander@2726
   564
REGISTER_NATIVES(cellArrayNatives)
dvander@2726
   565
{
dvander@2726
   566
	{"ClearArray",					ClearArray},
dvander@2726
   567
	{"CreateArray",					CreateArray},
dvander@2726
   568
	{"GetArrayArray",				GetArrayArray},
dvander@2726
   569
	{"GetArrayCell",				GetArrayCell},
dvander@2726
   570
	{"GetArraySize",				GetArraySize},
dvander@2726
   571
	{"GetArrayString",				GetArrayString},
dvander@2726
   572
	{"ResizeArray",					ResizeArray},
dvander@2726
   573
	{"PushArrayArray",				PushArrayArray},
dvander@2726
   574
	{"PushArrayCell",				PushArrayCell},
dvander@2726
   575
	{"PushArrayString",				PushArrayString},
dvander@2726
   576
	{"RemoveFromArray",				RemoveFromArray},
dvander@2726
   577
	{"SetArrayCell",				SetArrayCell},
dvander@2726
   578
	{"SetArrayString",				SetArrayString},
dvander@2726
   579
	{"SetArrayArray",				SetArrayArray},
dvander@2726
   580
	{"ShiftArrayUp",				ShiftArrayUp},
dvander@2726
   581
	{"SwapArrayItems",				SwapArrayItems},
dvander@2726
   582
	{"CloneArray",					CloneArray},
dvander@2726
   583
	{"FindStringInArray",			FindStringInArray},
dvander@2726
   584
	{"FindValueInArray",			FindValueInArray},
dvander@2726
   585
	{NULL,							NULL},
dvander@2726
   586
};