core/smn_filesystem.cpp
author David Anderson <dvander@alliedmods.net>
Thu Jun 21 23:06:37 2007 +0000 (2007-06-21)
changeset 997 2fc3152c3118
parent 821 c5b4dca7f8ac
child 1011 b413072540fd
permissions -rw-r--r--
bumped menu api again - added feature to get menu end reason
dvander@370
     1
/**
ds@653
     2
 * vim: set ts=4 :
dvander@370
     3
 * ===============================================================
dvander@370
     4
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
dvander@370
     5
 * ===============================================================
dvander@370
     6
 *
dvander@370
     7
 * This file is not open source and may not be copied without explicit
dvander@370
     8
 * written permission of AlliedModders LLC.  This file may not be redistributed 
dvander@370
     9
 * in whole or significant part.
dvander@370
    10
 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
dvander@370
    11
 *
dvander@370
    12
 * Version: $Id$
dvander@370
    13
 */
dvander@370
    14
faluco@274
    15
#include <sys/stat.h>
dvander@252
    16
#include "sm_globals.h"
dvander@252
    17
#include "HandleSys.h"
dvander@252
    18
#include "LibrarySys.h"
faluco@274
    19
#include "sm_stringutil.h"
dvander@592
    20
#include "Logger.h"
dvander@347
    21
#include "PluginSys.h"
dvander@347
    22
#include "sourcemm_api.h"
dvander@252
    23
dvander@252
    24
HandleType_t g_FileType;
dvander@252
    25
HandleType_t g_DirType;
dvander@252
    26
dvander@252
    27
class FileNatives : 
dvander@252
    28
	public SMGlobalClass,
dvander@252
    29
	public IHandleTypeDispatch
dvander@252
    30
{
dvander@252
    31
public:
dvander@252
    32
	virtual void OnSourceModAllInitialized()
dvander@252
    33
	{
dvander@262
    34
		g_FileType = g_HandleSys.CreateType("File", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@262
    35
		g_DirType = g_HandleSys.CreateType("Directory", this, 0, NULL, NULL, g_pCoreIdent, NULL);
dvander@252
    36
	}
dvander@252
    37
	virtual void OnSourceModShutdown()
dvander@252
    38
	{
dvander@252
    39
		g_HandleSys.RemoveType(g_DirType, g_pCoreIdent);
dvander@252
    40
		g_HandleSys.RemoveType(g_FileType, g_pCoreIdent);
dvander@252
    41
		g_DirType = 0;
dvander@252
    42
		g_FileType = 0;
dvander@252
    43
	}
dvander@252
    44
	virtual void OnHandleDestroy(HandleType_t type, void *object)
dvander@252
    45
	{
dvander@252
    46
		if (type == g_FileType)
dvander@252
    47
		{
dvander@252
    48
			FILE *fp = (FILE *)object;
dvander@252
    49
			fclose(fp);
dvander@252
    50
		} else if (type == g_DirType) {
dvander@252
    51
			IDirectory *pDir = (IDirectory *)object;
dvander@252
    52
			g_LibSys.CloseDirectory(pDir);
dvander@252
    53
		}
dvander@252
    54
	}
dvander@252
    55
};
dvander@252
    56
dvander@252
    57
faluco@274
    58
static cell_t sm_OpenDirectory(IPluginContext *pContext, const cell_t *params)
dvander@252
    59
{
dvander@252
    60
	char *path;
dvander@252
    61
	int err;
dvander@252
    62
	if ((err=pContext->LocalToString(params[1], &path)) != SP_ERROR_NONE)
dvander@252
    63
	{
dvander@252
    64
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
    65
		return 0;
dvander@252
    66
	}
dvander@252
    67
ds@652
    68
	char realpath[PLATFORM_MAX_PATH];
dvander@317
    69
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", path);
dvander@255
    70
dvander@255
    71
	IDirectory *pDir = g_LibSys.OpenDirectory(realpath);
dvander@252
    72
	if (!pDir)
dvander@252
    73
	{
dvander@252
    74
		return 0;
dvander@252
    75
	}
dvander@252
    76
dvander@262
    77
	return g_HandleSys.CreateHandle(g_DirType, pDir, pContext->GetIdentity(), g_pCoreIdent, NULL);
dvander@252
    78
}
dvander@252
    79
faluco@274
    80
static cell_t sm_ReadDirEntry(IPluginContext *pContext, const cell_t *params)
dvander@252
    81
{
dvander@252
    82
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@252
    83
	IDirectory *pDir;
dvander@252
    84
	HandleError herr;
dvander@262
    85
	HandleSecurity sec;
dvander@252
    86
	int err;
dvander@262
    87
dvander@262
    88
	sec.pOwner = NULL;
dvander@262
    89
	sec.pIdentity = g_pCoreIdent;
dvander@262
    90
dvander@262
    91
	if ((herr=g_HandleSys.ReadHandle(hndl, g_DirType, &sec, (void **)&pDir))
dvander@252
    92
		!= HandleError_None)
dvander@252
    93
	{
dvander@252
    94
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
dvander@252
    95
	}
dvander@252
    96
dvander@252
    97
	if (!pDir->MoreFiles())
dvander@252
    98
	{
dvander@252
    99
		return false;
dvander@252
   100
	}
dvander@252
   101
dvander@252
   102
	cell_t *filetype;
dvander@252
   103
	if ((err=pContext->LocalToPhysAddr(params[4], &filetype)) != SP_ERROR_NONE)
dvander@252
   104
	{
dvander@252
   105
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
   106
		return 0;
dvander@252
   107
	}
dvander@252
   108
dvander@252
   109
	if (pDir->IsEntryDirectory())
dvander@252
   110
	{
dvander@252
   111
		*filetype = 1;
dvander@252
   112
	} else if (pDir->IsEntryFile()) {
dvander@252
   113
		*filetype = 2;
dvander@252
   114
	} else {
dvander@252
   115
		*filetype = 0;
dvander@252
   116
	}
dvander@252
   117
dvander@252
   118
	const char *path = pDir->GetEntryName();
dvander@255
   119
	if ((err=pContext->StringToLocalUTF8(params[2], params[3], path, NULL))
dvander@252
   120
		!= SP_ERROR_NONE)
dvander@252
   121
	{
dvander@252
   122
		pContext->ThrowNativeErrorEx(err, NULL);
dvander@252
   123
		return 0;
dvander@252
   124
	}
dvander@252
   125
dvander@255
   126
	pDir->NextEntry();
dvander@255
   127
dvander@252
   128
	return true;
dvander@252
   129
}
dvander@252
   130
faluco@274
   131
static cell_t sm_OpenFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   132
{
faluco@274
   133
	char *name, *mode;
faluco@274
   134
	int err;
faluco@274
   135
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   136
	{
faluco@274
   137
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   138
		return 0;
faluco@274
   139
	}
faluco@274
   140
	if ((err=pContext->LocalToString(params[2], &mode)) != SP_ERROR_NONE)
faluco@274
   141
	{
faluco@274
   142
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   143
		return 0;
faluco@274
   144
	}
faluco@274
   145
ds@652
   146
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   147
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   148
faluco@274
   149
	FILE *pFile = fopen(realpath, mode);
faluco@274
   150
	if (!pFile)
faluco@274
   151
	{
faluco@274
   152
		return 0;
faluco@274
   153
	}
faluco@274
   154
faluco@274
   155
	return g_HandleSys.CreateHandle(g_FileType, pFile, pContext->GetIdentity(), g_pCoreIdent, NULL);
faluco@274
   156
}
faluco@274
   157
faluco@274
   158
static cell_t sm_DeleteFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   159
{
faluco@274
   160
	char *name;
faluco@274
   161
	int err;
faluco@274
   162
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   163
	{
faluco@274
   164
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   165
		return 0;
faluco@274
   166
	}
faluco@274
   167
ds@652
   168
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   169
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   170
faluco@274
   171
	return (unlink(realpath)) ? 0 : 1;
faluco@274
   172
}
faluco@274
   173
faluco@274
   174
static cell_t sm_ReadFileLine(IPluginContext *pContext, const cell_t *params)
faluco@274
   175
{
faluco@274
   176
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   177
	HandleError herr;
faluco@274
   178
	HandleSecurity sec;
faluco@274
   179
	FILE *pFile;
faluco@274
   180
	int err;
faluco@274
   181
faluco@274
   182
	sec.pOwner = NULL;
faluco@274
   183
	sec.pIdentity = g_pCoreIdent;
faluco@274
   184
faluco@274
   185
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   186
		!= HandleError_None)
faluco@274
   187
	{
faluco@274
   188
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   189
	}
faluco@274
   190
faluco@274
   191
	char *buf;
faluco@274
   192
	if ((err=pContext->LocalToString(params[2], &buf)) != SP_ERROR_NONE)
faluco@274
   193
	{
faluco@274
   194
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   195
		return 0;
faluco@274
   196
	}
faluco@274
   197
dvander@638
   198
	if (fgets(buf, params[3], pFile) == NULL)
dvander@638
   199
	{
dvander@638
   200
		return 0;
dvander@638
   201
	}
faluco@274
   202
faluco@274
   203
	return 1;
faluco@274
   204
}
faluco@274
   205
faluco@274
   206
static cell_t sm_IsEndOfFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   207
{
faluco@274
   208
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   209
	HandleError herr;
faluco@274
   210
	HandleSecurity sec;
faluco@274
   211
	FILE *pFile;
faluco@274
   212
faluco@274
   213
	sec.pOwner = NULL;
faluco@274
   214
	sec.pIdentity = g_pCoreIdent;
faluco@274
   215
faluco@274
   216
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   217
		!= HandleError_None)
faluco@274
   218
	{
faluco@274
   219
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   220
	}
faluco@274
   221
faluco@274
   222
	return (feof(pFile)) ? 1 : 0;
faluco@274
   223
}
faluco@274
   224
faluco@274
   225
static cell_t sm_FileSeek(IPluginContext *pContext, const cell_t *params)
faluco@274
   226
{
faluco@274
   227
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   228
	HandleError herr;
faluco@274
   229
	HandleSecurity sec;
faluco@274
   230
	FILE *pFile;
faluco@274
   231
faluco@274
   232
	sec.pOwner = NULL;
faluco@274
   233
	sec.pIdentity = g_pCoreIdent;
faluco@274
   234
faluco@274
   235
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   236
		!= HandleError_None)
faluco@274
   237
	{
faluco@274
   238
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   239
	}
faluco@274
   240
faluco@274
   241
	fseek(pFile, params[2], params[3]);
faluco@274
   242
	
faluco@274
   243
	return 1;
faluco@274
   244
}
faluco@274
   245
faluco@274
   246
static cell_t sm_FilePosition(IPluginContext *pContext, const cell_t *params)
faluco@274
   247
{
faluco@274
   248
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   249
	HandleError herr;
faluco@274
   250
	HandleSecurity sec;
faluco@274
   251
	FILE *pFile;
faluco@274
   252
faluco@274
   253
	sec.pOwner = NULL;
faluco@274
   254
	sec.pIdentity = g_pCoreIdent;
faluco@274
   255
faluco@274
   256
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   257
		!= HandleError_None)
faluco@274
   258
	{
faluco@274
   259
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   260
	}
faluco@274
   261
faluco@274
   262
	return ftell(pFile);
faluco@274
   263
}
faluco@274
   264
faluco@274
   265
static cell_t sm_FileExists(IPluginContext *pContext, const cell_t *params)
faluco@274
   266
{
faluco@274
   267
	char *name;
faluco@274
   268
	int err;
faluco@274
   269
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   270
	{
faluco@274
   271
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   272
		return 0;
faluco@274
   273
	}
faluco@274
   274
ds@652
   275
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   276
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   277
#ifdef PLATFORM_WINDOWS
faluco@274
   278
	struct _stat s;
faluco@274
   279
	if (_stat(realpath, &s) != 0)
faluco@274
   280
	{
faluco@274
   281
		return 0;
faluco@274
   282
	}
faluco@274
   283
	if (s.st_mode & S_IFREG)
faluco@274
   284
	{
faluco@274
   285
		return 1;
faluco@274
   286
	}
faluco@274
   287
	return 0;
dvander@351
   288
#elif defined PLATFORM_POSIX
faluco@274
   289
	struct stat s;
faluco@274
   290
	if (stat(realpath, &s) != 0)
faluco@274
   291
	{
faluco@274
   292
		return 0;
faluco@274
   293
	}
faluco@274
   294
	if (S_ISREG(s.st_mode))
faluco@274
   295
	{
faluco@274
   296
		return 1;
faluco@274
   297
	}
faluco@274
   298
	return 0;
faluco@274
   299
#endif
faluco@274
   300
}
faluco@274
   301
faluco@274
   302
static cell_t sm_RenameFile(IPluginContext *pContext, const cell_t *params)
faluco@274
   303
{
faluco@274
   304
	char *newpath, *oldpath;
faluco@274
   305
	int err;
faluco@274
   306
	if ((err=pContext->LocalToString(params[1], &newpath)) != SP_ERROR_NONE)
faluco@274
   307
	{
faluco@274
   308
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   309
		return 0;
faluco@274
   310
	}
faluco@274
   311
	if ((err=pContext->LocalToString(params[2], &oldpath)) != SP_ERROR_NONE)
faluco@274
   312
	{
faluco@274
   313
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   314
		return 0;
faluco@274
   315
	}
faluco@274
   316
ds@652
   317
	char new_realpath[PLATFORM_MAX_PATH];
dvander@636
   318
	g_SourceMod.BuildPath(Path_Game, new_realpath, sizeof(new_realpath), "%s", newpath);
ds@652
   319
	char old_realpath[PLATFORM_MAX_PATH];
dvander@636
   320
	g_SourceMod.BuildPath(Path_Game, old_realpath, sizeof(old_realpath), "%s", oldpath);
faluco@274
   321
faluco@274
   322
#ifdef PLATFORM_WINDOWS
faluco@274
   323
	return (MoveFileA(old_realpath, new_realpath)) ? 1 : 0;
dvander@351
   324
#elif defined PLATFORM_POSIX
faluco@274
   325
	return (rename(old_realpath, new_realpath)) ? 0 : 1;
faluco@274
   326
#endif
faluco@274
   327
}
faluco@274
   328
faluco@274
   329
static cell_t sm_DirExists(IPluginContext *pContext, const cell_t *params)
faluco@274
   330
{
faluco@274
   331
	char *name;
faluco@274
   332
	int err;
faluco@274
   333
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   334
	{
faluco@274
   335
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   336
		return 0;
faluco@274
   337
	}
faluco@274
   338
ds@652
   339
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   340
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   341
#ifdef PLATFORM_WINDOWS
faluco@274
   342
	struct _stat s;
faluco@274
   343
	if (_stat(realpath, &s) != 0)
faluco@274
   344
	{
faluco@274
   345
		return 0;
faluco@274
   346
	}
faluco@274
   347
	if (s.st_mode & S_IFDIR)
faluco@274
   348
	{
faluco@274
   349
		return 1;
faluco@274
   350
	}
faluco@274
   351
	return 0;
dvander@351
   352
#elif defined PLATFORM_POSIX
faluco@274
   353
	struct stat s;
faluco@274
   354
	if (stat(realpath, &s) != 0)
faluco@274
   355
	{
faluco@274
   356
		return 0;
faluco@274
   357
	}
faluco@274
   358
	if (S_ISDIR(s.st_mode))
faluco@274
   359
	{
faluco@274
   360
		return 1;
faluco@274
   361
	}
faluco@274
   362
	return 0;
faluco@274
   363
#endif
faluco@274
   364
}
faluco@274
   365
faluco@274
   366
static cell_t sm_FileSize(IPluginContext *pContext, const cell_t *params)
faluco@274
   367
{
faluco@274
   368
	char *name;
faluco@274
   369
	int err;
faluco@274
   370
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   371
	{
faluco@274
   372
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   373
		return -1;
faluco@274
   374
	}
faluco@274
   375
ds@652
   376
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   377
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   378
#ifdef PLATFORM_WINDOWS
faluco@274
   379
	struct _stat s;
faluco@274
   380
	if (_stat(realpath, &s) != 0)
faluco@274
   381
	{
faluco@274
   382
		return -1;
faluco@274
   383
	}
faluco@274
   384
	if (s.st_mode & S_IFREG)
faluco@274
   385
	{
faluco@274
   386
		return static_cast<cell_t>(s.st_size);
faluco@274
   387
	}
faluco@274
   388
	return -1;
dvander@351
   389
#elif defined PLATFORM_POSIX
faluco@274
   390
	struct stat s;
faluco@274
   391
	if (stat(realpath, &s) != 0)
faluco@274
   392
	{
faluco@274
   393
		return -1;
faluco@274
   394
	}
faluco@274
   395
	if (S_ISREG(s.st_mode))
faluco@274
   396
	{
faluco@274
   397
		return static_cast<cell_t>(s.st_size);
faluco@274
   398
	}
faluco@274
   399
	return -1;
faluco@274
   400
#endif
faluco@274
   401
}
faluco@274
   402
faluco@274
   403
static cell_t sm_RemoveDir(IPluginContext *pContext, const cell_t *params)
faluco@274
   404
{
faluco@274
   405
	char *name;
faluco@274
   406
	int err;
faluco@274
   407
	if ((err=pContext->LocalToString(params[1], &name)) != SP_ERROR_NONE)
faluco@274
   408
	{
faluco@274
   409
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   410
		return 0;
faluco@274
   411
	}
faluco@274
   412
ds@652
   413
	char realpath[PLATFORM_MAX_PATH];
dvander@636
   414
	g_SourceMod.BuildPath(Path_Game, realpath, sizeof(realpath), "%s", name);
faluco@274
   415
faluco@274
   416
	return (rmdir(realpath)) ? 0 : 1;
faluco@274
   417
}
faluco@274
   418
faluco@274
   419
static cell_t sm_WriteFileLine(IPluginContext *pContext, const cell_t *params)
faluco@274
   420
{
faluco@274
   421
	Handle_t hndl = static_cast<Handle_t>(params[1]);
faluco@274
   422
	HandleError herr;
faluco@274
   423
	HandleSecurity sec;
faluco@274
   424
	FILE *pFile;
faluco@274
   425
faluco@274
   426
	sec.pOwner = NULL;
faluco@274
   427
	sec.pIdentity = g_pCoreIdent;
faluco@274
   428
faluco@274
   429
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
faluco@274
   430
		!= HandleError_None)
faluco@274
   431
	{
faluco@274
   432
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
faluco@274
   433
	}
faluco@274
   434
faluco@274
   435
	char *fmt;
faluco@274
   436
	int err;
faluco@274
   437
	if ((err=pContext->LocalToString(params[2], &fmt)) != SP_ERROR_NONE)
faluco@274
   438
	{
faluco@274
   439
		pContext->ThrowNativeErrorEx(err, NULL);
faluco@274
   440
		return 0;
faluco@274
   441
	}
faluco@274
   442
faluco@274
   443
	char buffer[2048];
faluco@274
   444
	int arg = 3;
faluco@274
   445
	atcprintf(buffer, sizeof(buffer), fmt, pContext, params, &arg);
faluco@274
   446
	fprintf(pFile, "%s\n", buffer);
faluco@274
   447
faluco@274
   448
	return 1;
faluco@274
   449
}
faluco@274
   450
dvander@821
   451
static cell_t sm_FlushFile(IPluginContext *pContext, const cell_t *params)
dvander@821
   452
{
dvander@821
   453
	Handle_t hndl = static_cast<Handle_t>(params[1]);
dvander@821
   454
	HandleError herr;
dvander@821
   455
	HandleSecurity sec;
dvander@821
   456
	FILE *pFile;
dvander@821
   457
dvander@821
   458
	sec.pOwner = NULL;
dvander@821
   459
	sec.pIdentity = g_pCoreIdent;
dvander@821
   460
dvander@821
   461
	if ((herr=g_HandleSys.ReadHandle(hndl, g_FileType, &sec, (void **)&pFile))
dvander@821
   462
		!= HandleError_None)
dvander@821
   463
	{
dvander@821
   464
		return pContext->ThrowNativeError("Invalid file handle %x (error %d)", hndl, herr);
dvander@821
   465
	}
dvander@821
   466
dvander@821
   467
	return (fflush(pFile) == 0) ? 1 : 0;
dvander@821
   468
}
dvander@821
   469
dvander@345
   470
static cell_t sm_BuildPath(IPluginContext *pContext, const cell_t *params)
dvander@345
   471
{
dvander@345
   472
	char path[PLATFORM_MAX_PATH], *fmt, *buffer;
ds@711
   473
	int arg = 5;
dvander@345
   474
	pContext->LocalToString(params[2], &buffer);
dvander@345
   475
	pContext->LocalToString(params[4], &fmt);
dvander@345
   476
dvander@345
   477
	atcprintf(path, sizeof(path), fmt, pContext, params, &arg);
dvander@345
   478
dvander@345
   479
	return g_SourceMod.BuildPath(Path_SM_Rel, buffer, params[3], "%s", path);
dvander@345
   480
}
dvander@345
   481
dvander@347
   482
static cell_t sm_LogToGame(IPluginContext *pContext, const cell_t *params)
dvander@347
   483
{
dvander@347
   484
	char buffer[1024];
dvander@347
   485
	size_t len = g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@347
   486
dvander@347
   487
	if (len >= sizeof(buffer)-2)
dvander@347
   488
	{
dvander@347
   489
		buffer[1022] = '\n';
dvander@347
   490
		buffer[1023] = '\0';
dvander@347
   491
	} else {
dvander@347
   492
		buffer[len++] = '\n';
dvander@347
   493
		buffer[len] = '\0';
dvander@347
   494
	}
dvander@347
   495
dvander@347
   496
	engine->LogPrint(buffer);
dvander@347
   497
dvander@347
   498
	return 1;
dvander@347
   499
}
dvander@347
   500
dvander@347
   501
static cell_t sm_LogMessage(IPluginContext *pContext, const cell_t *params)
dvander@347
   502
{
dvander@347
   503
	char buffer[1024];
dvander@351
   504
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@347
   505
dvander@347
   506
	IPlugin *pPlugin = g_PluginSys.FindPluginByContext(pContext->GetContext());
dvander@347
   507
	g_Logger.LogMessage("[%s] %s", pPlugin->GetFilename(), buffer);
dvander@347
   508
dvander@347
   509
	return 1;
dvander@347
   510
}
dvander@347
   511
dvander@347
   512
static cell_t sm_LogError(IPluginContext *pContext, const cell_t *params)
dvander@347
   513
{
dvander@347
   514
	char buffer[1024];
dvander@351
   515
	g_SourceMod.FormatString(buffer, sizeof(buffer), pContext, params, 1);
dvander@347
   516
dvander@347
   517
	IPlugin *pPlugin = g_PluginSys.FindPluginByContext(pContext->GetContext());
dvander@347
   518
	g_Logger.LogError("[%s] %s", pPlugin->GetFilename(), buffer);
dvander@347
   519
dvander@347
   520
	return 1;
dvander@347
   521
}
dvander@347
   522
dvander@255
   523
static FileNatives s_FileNatives;
dvander@252
   524
dvander@252
   525
REGISTER_NATIVES(filesystem)
dvander@252
   526
{
dvander@252
   527
	{"OpenDirectory",			sm_OpenDirectory},
dvander@252
   528
	{"ReadDirEntry",			sm_ReadDirEntry},
faluco@274
   529
	{"OpenFile",				sm_OpenFile},
faluco@274
   530
	{"DeleteFile",				sm_DeleteFile},
faluco@274
   531
	{"ReadFileLine",			sm_ReadFileLine},
faluco@274
   532
	{"IsEndOfFile",				sm_IsEndOfFile},
faluco@274
   533
	{"FileSeek",				sm_FileSeek},
faluco@274
   534
	{"FilePosition",			sm_FilePosition},
faluco@274
   535
	{"FileExists",				sm_FileExists},
faluco@274
   536
	{"RenameFile",				sm_RenameFile},
faluco@274
   537
	{"DirExists",				sm_DirExists},
faluco@274
   538
	{"FileSize",				sm_FileSize},
faluco@274
   539
	{"RemoveDir",				sm_RemoveDir},
faluco@274
   540
	{"WriteFileLine",			sm_WriteFileLine},
dvander@345
   541
	{"BuildPath",				sm_BuildPath},
dvander@636
   542
	{"LogToGame",				sm_LogToGame},
dvander@636
   543
	{"LogMessage",				sm_LogMessage},
dvander@347
   544
	{"LogError",				sm_LogError},
dvander@821
   545
	{"FlushFile",				sm_FlushFile},
dvander@252
   546
	{NULL,						NULL},
dvander@252
   547
};