core/smn_adt_array.cpp
author Scott Ehlert <ds@alliedmods.net>
Wed Aug 15 06:19:30 2007 +0000 (2007-08-15)
changeset 1330 ab94316bb52b
parent 1231 17badaf66ce4
child 1664 e054be79e28a
permissions -rw-r--r--
Updated license headers on virtually all files with extremely minor changes in the name of some sort of strange consistency.
All plugin and include file headers also have been changed to say about GPL3 instead of GPL2.

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