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