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