|
AMX Mod X Plugin Approver
Join Date: Aug 2005
Location: Decapod 10
|
07-07-2015
, 15:01
Re: [INC] DString - Dynamic Strings
|
#11
|
Quote:
Originally Posted by WildCard65
Emp, your code caused a "Not enough space on the stack" error.
PHP Code:
L 06/25/2015 - 16:24:11: [SM] Exception reported: Not enough space on the stack
L 06/25/2015 - 16:24:11: [SM] Blaming plugin: dstringtest.smx
L 06/25/2015 - 16:24:11: [SM] Call stack trace:
L 06/25/2015 - 16:24:11: [SM] [0] Line 22, C:\Users\User\Downloads\addons\sourcemod\scripting\dstringtest.sp::DString_Create()
|
Does this reproduce the same error?
untested revision
PHP Code:
/**************************************************************************
* *
* DString - Dynamic Strings *
* Author: Eun *
* Version: 1.0.1 Emp`s changes *
* *
**************************************************************************/
#if defined _DSTRING_INCLUDED
#endinput
#endif
#define _DSTRING_INCLUDED
#if !defined DSTRING_BUFFERLEN
#define DSTRING_BUFFERLEN 4048
#endif
methodmap DString < DataPack
{
public DString() = DString_Create;
public Copy() = DString_Copy;
public Format() = DString_Format;
public Add() = DString_Add;
public AddEx() = DString_AddEx;
public Read() = DString_Read;
public ReadEx() = DString_ReadEx;
property int Length
{
public get() { return DString_Length( this ); }
}
public Clear() = DString_Clear;
}
stock DString DString_Create( const char[] str = "" )
{
DString handle = view_as < DString > new DataPack();
int len = strlen( str );
if ( len )
{
handle.WriteCell( len );
handle.WriteString( str );
}
return handle;
}
stock int DString_Copy( DString handle, const char[] str )
{
if ( !handle ) return 0;
handle.Reset( true );
int len = strlen( str );
if ( len )
{
handle.WriteCell( len );
handle.WriteString( str );
}
return len;
}
stock int DString_Format( DString handle, const char[] str, any ... )
{
char buffer[ DSTRING_BUFFERLEN ];
VFormat( buffer, sizeof buffer, str, 3 );
return handle.Copy( handle, buffer );
}
stock int DString_Add( DString handle, const char[] str )
{
if ( !handle ) return 0;
int len_base = handle.Length;
if ( !len_base ) return handle.Copy( str );
int len_add = strlen( str );
if ( !len_add ) return len_base;
for ( char[] buffer = new char[ len_base ]; handle.IsReadable( 1 ); handle.ReadString( buffer, len_base ) ) { }
handle.WriteString( str );
handle.Reset( false );
int len_new = len_base + len_add;
handle.WriteCell( len_new );
return len_new;
}
stock int DString_AddEx( DString handle, const char[] str, any ... )
{
char buffer[ DSTRING_BUFFERLEN ];
VFormat( buffer, sizeof buffer, str, 3 );
return handle.Add( buffer );
}
stock int DString_Read( DString handle, char[] buffer, int buffersize )
{
for ( int len_temp, len = handle.Length ; len_temp < len ; len_temp += strlen( buffer[ len_temp ] ) )
handle.ReadString( buffer[ len_temp ], buffersize );
return len;
}
stock char[] DString_ReadEx( DString handle )
{
int len = handle.Length;
if ( !len ) len++;
char[] buffer = new char[ len ];
handle.Read( buffer, len );
return buffer;
}
stock int DString_Length( DString handle )
{
if ( !handle ) return 0;
handle.Reset( false );
if ( !handle.IsReadable( 1 ) ) return 0;
return handle.ReadCell();
}
stock void DString_Clear( DString handle )
{
handle.Reset( true );
}
stock void DString_Delete( DString &handle )
{
delete handle;
}
|
|
|
|