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