core/smn_adt_array.cpp
author Borja Ferrer <faluco@alliedmods.net>
Fri Nov 16 21:34:29 2007 +0000 (2007-11-16)
changeset 1686 185cac1820fe
parent 1664 e054be79e28a
child 1766 d30c252089be
permissions -rw-r--r--
fixed amb1164, SM was crashing due to interface changes from valve (this change is just to make the build update using the latest sdk)
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
ferret99gt@1664
   487
static cell_t CloneArray(IPluginContext *pContext, const cell_t *params)
ferret99gt@1664
   488
{
ferret99gt@1664
   489
	CellArray *oldArray;
ferret99gt@1664
   490
	HandleError err;
ferret99gt@1664
   491
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
ferret99gt@1664
   492
ferret99gt@1664
   493
	if ((err = g_HandleSys.ReadHandle(params[1], htCellArray, &sec, (void **)&oldArray)) 
ferret99gt@1664
   494
		!= HandleError_None)
ferret99gt@1664
   495
	{
ferret99gt@1664
   496
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
ferret99gt@1664
   497
	}
ferret99gt@1664
   498
ferret99gt@1664
   499
	CellArray *array = oldArray->clone();
ferret99gt@1664
   500
	
ferret99gt@1664
   501
	Handle_t hndl = g_HandleSys.CreateHandle(htCellArray, array, pContext->GetIdentity(), g_pCoreIdent, NULL);
ferret99gt@1664
   502
	if (!hndl)
ferret99gt@1664
   503
	{
ferret99gt@1664
   504
		delete array;
ferret99gt@1664
   505
	}
ferret99gt@1664
   506
ferret99gt@1664
   507
	return hndl;
ferret99gt@1664
   508
}
ferret99gt@1664
   509
ferret99gt@1664
   510
static cell_t FindStringInArray(IPluginContext *pContext, const cell_t *params)
ferret99gt@1664
   511
{
ferret99gt@1664
   512
	CellArray *array;
ferret99gt@1664
   513
	HandleError err;
ferret99gt@1664
   514
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
ferret99gt@1664
   515
ferret99gt@1664
   516
	if ((err = g_HandleSys.ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
ferret99gt@1664
   517
		!= HandleError_None)
ferret99gt@1664
   518
	{
ferret99gt@1664
   519
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
ferret99gt@1664
   520
	}
ferret99gt@1664
   521
ferret99gt@1664
   522
	char *str;
ferret99gt@1664
   523
	pContext->LocalToString(params[2], &str);
ferret99gt@1664
   524
ferret99gt@1664
   525
	for (unsigned int i = 0; i < array->size(); i++)
ferret99gt@1664
   526
	{
ferret99gt@1664
   527
		const char *array_str = (const char *)array->at(i);
ferret99gt@1664
   528
		if (strcmp(str, array_str) == 0)
ferret99gt@1664
   529
		{
ferret99gt@1664
   530
			return (cell_t) i;
ferret99gt@1664
   531
		}
ferret99gt@1664
   532
	}
ferret99gt@1664
   533
ferret99gt@1664
   534
	return -1;
ferret99gt@1664
   535
}
ferret99gt@1664
   536
ferret99gt@1664
   537
static cell_t FindValueInArray(IPluginContext *pContext, const cell_t *params)
ferret99gt@1664
   538
{
ferret99gt@1664
   539
	CellArray *array;
ferret99gt@1664
   540
	HandleError err;
ferret99gt@1664
   541
	HandleSecurity sec(pContext->GetIdentity(), g_pCoreIdent);
ferret99gt@1664
   542
ferret99gt@1664
   543
	if ((err = g_HandleSys.ReadHandle(params[1], htCellArray, &sec, (void **)&array)) 
ferret99gt@1664
   544
		!= HandleError_None)
ferret99gt@1664
   545
	{
ferret99gt@1664
   546
		return pContext->ThrowNativeError("Invalid Handle %x (error: %d)", params[1], err);
ferret99gt@1664
   547
	}
ferret99gt@1664
   548
ferret99gt@1664
   549
	for (unsigned int i = 0; i < array->size(); i++)
ferret99gt@1664
   550
	{
ferret99gt@1664
   551
		if (params[2] == *array->at(i))
ferret99gt@1664
   552
		{
ferret99gt@1664
   553
			return (cell_t) i;
ferret99gt@1664
   554
		}
ferret99gt@1664
   555
	}
ferret99gt@1664
   556
ferret99gt@1664
   557
	return -1;
ferret99gt@1664
   558
}
ferret99gt@1664
   559
dvander@1156
   560
REGISTER_NATIVES(cellArrayNatives)
dvander@1156
   561
{
dvander@1156
   562
	{"ClearArray",					ClearArray},
dvander@1156
   563
	{"CreateArray",					CreateArray},
dvander@1156
   564
	{"GetArrayArray",				GetArrayArray},
dvander@1156
   565
	{"GetArrayCell",				GetArrayCell},
dvander@1156
   566
	{"GetArraySize",				GetArraySize},
dvander@1156
   567
	{"GetArrayString",				GetArrayString},
dvander@1156
   568
	{"ResizeArray",					ResizeArray},
dvander@1156
   569
	{"PushArrayArray",				PushArrayArray},
dvander@1156
   570
	{"PushArrayCell",				PushArrayCell},
dvander@1156
   571
	{"PushArrayString",				PushArrayString},
dvander@1156
   572
	{"RemoveFromArray",				RemoveFromArray},
dvander@1156
   573
	{"SetArrayCell",				SetArrayCell},
dvander@1156
   574
	{"SetArrayString",				SetArrayString},
dvander@1156
   575
	{"SetArrayArray",				SetArrayArray},
dvander@1156
   576
	{"ShiftArrayUp",				ShiftArrayUp},
dvander@1156
   577
	{"SwapArrayItems",				SwapArrayItems},
ferret99gt@1664
   578
	{"CloneArray",					CloneArray},
ferret99gt@1664
   579
	{"FindStringInArray",			FindStringInArray},
ferret99gt@1664
   580
	{"FindValueInArray",			FindValueInArray},
dvander@1156
   581
	{NULL,							NULL},
dvander@1156
   582
};