port bsp31migrate to linux

This commit is contained in:
nillerusr 2020-11-16 20:31:06 +03:00
parent a9d98679f3
commit f930f46fb0
14 changed files with 240 additions and 72 deletions

View File

@ -19,15 +19,16 @@ int main( int argc, char **argv )
{ {
int i; int i;
// if( argc <= 1 )
// COM_FatalError( "usage: bsp31migrate -file <path.bsp> -output <path.bsp>\n" );
COM_InitCmdlib( argv, argc ); COM_InitCmdlib( argv, argc );
i = COM_CheckParm( "-dev" );
if(( i = COM_CheckParm( "-dev" )) != 0 ) if( i != 0 && argc > i+1 )
{
SetDeveloperLevel( atoi( argv[i+1] )); SetDeveloperLevel( atoi( argv[i+1] ));
if( COM_CheckParm( "--help" ) != 0 )
{
Msg( "usage: bsp31migrate -file <path.bsp> -output <path.bsp>\n" );
return 0;
} }
return BspConvert( argc, argv ); return BspConvert( argc, argv );
} }

View File

@ -16,7 +16,7 @@ GNU General Public License for more details.
#ifndef BSP31MIGRATE_H #ifndef BSP31MIGRATE_H
#define BSP31MIGRATE_H #define BSP31MIGRATE_H
#include <windows.h> #include "port.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "mathlib.h" #include "mathlib.h"
#include "stringlib.h" #include "stringlib.h"
@ -26,7 +26,6 @@ GNU General Public License for more details.
#include "wadfile.h" #include "wadfile.h"
#include "bspfile31.h" #include "bspfile31.h"
#include <fcntl.h> #include <fcntl.h>
#include <io.h>
typedef enum typedef enum
{ {
@ -46,4 +45,4 @@ typedef enum
extern int BspConvert( int argc, char **argv ); extern int BspConvert( int argc, char **argv );
#endif//BSP31MIGRATE_H #endif//BSP31MIGRATE_H

View File

@ -1205,8 +1205,5 @@ int BspConvert( int argc, char **argv )
Mem_Free( search ); Mem_Free( search );
Mem_Check(); Mem_Check();
Msg( "press any key to exit\n" );
system( "pause>nul" );
return 0; return 0;
} }

View File

@ -34,12 +34,15 @@ typedef unsigned long ulong;
typedef unsigned char uint8; typedef unsigned char uint8;
typedef signed char int8; typedef signed char int8;
#ifdef _MSC_VER
typedef __int16 int16; typedef __int16 int16;
typedef unsigned __int16 uint16; typedef unsigned __int16 uint16;
typedef __int32 int32; typedef __int32 int32;
typedef unsigned __int32 uint32; typedef unsigned __int32 uint32;
typedef __int64 int64; typedef __int64 int64;
typedef unsigned __int64 uint64; typedef unsigned __int64 uint64;
#endif
#undef true #undef true
#undef false #undef false
@ -77,4 +80,4 @@ enum
#define DXT_ENCODE_ALPHA_SDF 0x1A04 // signed distance field #define DXT_ENCODE_ALPHA_SDF 0x1A04 // signed distance field
#define DXT_ENCODE_NORMAL_AG_PARABOLOID 0x1A07 // paraboloid projection #define DXT_ENCODE_NORMAL_AG_PARABOLOID 0x1A07 // paraboloid projection
#endif//BASETYPES_H #endif//BASETYPES_H

View File

@ -76,7 +76,7 @@ BRUSH MODELS
.bsp contain level static geometry with including PVS and lightning info .bsp contain level static geometry with including PVS and lightning info
============================================================================== ==============================================================================
*/ */
#include "..\..\common\bspfile.h" #include "../../common/bspfile.h"
// header // header
#define Q1BSP_VERSION 29 // quake1 regular version (beta is 28) #define Q1BSP_VERSION 29 // quake1 regular version (beta is 28)

View File

@ -21,13 +21,19 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
// cmdlib.c // cmdlib.c
#ifdef _WIN32
#include <windows.h> #include <windows.h>
#include <direct.h> #include <direct.h>
#include <io.h>
#endif
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <io.h>
#include "stringlib.h" #include "stringlib.h"
#include "cmdlib.h" #include "cmdlib.h"
#include <stdarg.h>
#include <stdlib.h>
#include <unistd.h>
static char **com_argv; static char **com_argv;
static int com_argc = 0; static int com_argc = 0;
@ -118,7 +124,7 @@ void COM_FatalError( const char *error, ... )
va_list argptr; va_list argptr;
va_start( argptr, error ); va_start( argptr, error );
_vsnprintf( message, sizeof( message ), error, argptr ); snprintf( message, sizeof( message ), error, argptr );
va_end( argptr ); va_end( argptr );
Msg( "^1Fatal Error:^7 %s", message ); Msg( "^1Fatal Error:^7 %s", message );
@ -138,7 +144,7 @@ void COM_Assert( const char *error, ... )
va_list argptr; va_list argptr;
va_start( argptr, error ); va_start( argptr, error );
_vsnprintf( message, sizeof( message ), error, argptr ); snprintf( message, sizeof( message ), error, argptr );
va_end( argptr ); va_end( argptr );
Msg( "^1assert failed at:^7 %s", message ); Msg( "^1assert failed at:^7 %s", message );
@ -147,8 +153,12 @@ void COM_Assert( const char *error, ... )
void Q_getwd( char *out, size_t size ) void Q_getwd( char *out, size_t size )
{ {
_getcwd( out, size ); getcwd( out, size );
#ifdef _WIN32
Q_strncat( out, "\\", size ); Q_strncat( out, "\\", size );
#else
Q_strncat( out, "/", size );
#endif
} }
/* /*
@ -209,19 +219,40 @@ I_FloatTime
g-cont. the prefix 'I' was come from Doom code heh g-cont. the prefix 'I' was come from Doom code heh
================ ================
*/ */
double I_FloatTime( void )
{
static LARGE_INTEGER g_Frequency;
static LARGE_INTEGER g_ClockStart;
LARGE_INTEGER CurrentTime;
if( !g_Frequency.QuadPart ) #ifdef _WIN32
#include <winbase.h>
double GAME_EXPORT I_FloatTime( void )
{
static LARGE_INTEGER g_PerformanceFrequency;
static LARGE_INTEGER g_ClockStart;
LARGE_INTEGER CurrentTime;
if( !g_PerformanceFrequency.QuadPart )
{ {
QueryPerformanceFrequency( &g_Frequency ); QueryPerformanceFrequency( &g_PerformanceFrequency );
QueryPerformanceCounter( &g_ClockStart ); QueryPerformanceCounter( &g_ClockStart );
} }
QueryPerformanceCounter( &CurrentTime ); QueryPerformanceCounter( &CurrentTime );
return (double)( CurrentTime.QuadPart - g_ClockStart.QuadPart ) / (double)( g_PerformanceFrequency.QuadPart );
}
#elif _LINUX
double GAME_EXPORT I_FloatTime( void )
{
static longtime_t g_PerformanceFrequency;
static longtime_t g_ClockStart;
longtime_t CurrentTime;
struct timespec ts;
return (double)( CurrentTime.QuadPart - g_ClockStart.QuadPart ) / (double)( g_Frequency.QuadPart ); if( !g_PerformanceFrequency )
} {
struct timespec res;
if( !clock_getres(CLOCK_MONOTONIC, &res) )
g_PerformanceFrequency = 1000000000LL/res.tv_nsec;
}
clock_gettime(CLOCK_MONOTONIC, &ts);
return (double) ts.tv_sec + (double) ts.tv_nsec/1000000000.0;
}
#endif

View File

@ -18,8 +18,10 @@ GNU General Public License for more details.
#ifndef CMDLIB_H #ifndef CMDLIB_H
#define CMDLIB_H #define CMDLIB_H
#include "port.h"
#include <basetypes.h> #include <basetypes.h>
#include "conprint.h" #include "conprint.h"
#include "mathlib.h"
// bit routines // bit routines
#define BIT( n ) (1<<( n )) #define BIT( n ) (1<<( n ))
@ -108,4 +110,4 @@ void CRC32_Final( dword *pulCRC );
void CRC32_ProcessByte( dword *pulCRC, byte ch ); void CRC32_ProcessByte( dword *pulCRC, byte ch );
void CRC32_ProcessBuffer( dword *pulCRC, const void *pBuffer, int nBuffer ); void CRC32_ProcessBuffer( dword *pulCRC, const void *pBuffer, int nBuffer );
#endif #endif

View File

@ -14,15 +14,19 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
*/ */
#include <windows.h>
#include <stdio.h> #include <stdio.h>
#include <basetypes.h> #include "basetypes.h"
#include "stringlib.h" #include "stringlib.h"
#include "conprint.h" #include "conprint.h"
#include "stdarg.h"
#include <time.h>
#define IsColorString( p ) ( p && *( p ) == '^' && *(( p ) + 1) && *(( p ) + 1) >= '0' && *(( p ) + 1 ) <= '9' ) #define IsColorString( p ) ( p && *( p ) == '^' && *(( p ) + 1) && *(( p ) + 1) >= '0' && *(( p ) + 1 ) <= '9' )
#define ColorIndex( c ) ((( c ) - '0' ) & 7 ) #define ColorIndex( c ) ((( c ) - '0' ) & 7 )
#ifdef _WIN32
#include <windows.h>
static unsigned short g_color_table[8] = static unsigned short g_color_table[8] =
{ {
FOREGROUND_INTENSITY, // black FOREGROUND_INTENSITY, // black
@ -34,6 +38,7 @@ FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY, // cyan
FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY, // magenta FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY, // magenta
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE, // default color (white) FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE, // default color (white)
}; };
#endif
static int devloper_level = DEFAULT_DEVELOPER; static int devloper_level = DEFAULT_DEVELOPER;
static bool ignore_log = false; static bool ignore_log = false;
@ -87,8 +92,77 @@ void Sys_PrintLog( const char *pMsg )
if( !pMsg || ignore_log ) if( !pMsg || ignore_log )
return; return;
if( !logfile ) return; time_t crt_time;
fprintf( logfile, "%s", pMsg ); const struct tm *crt_tm;
char logtime[32] = "";
static char lastchar;
time( &crt_time );
crt_tm = localtime( &crt_time );
#ifdef __ANDROID__
__android_log_print( ANDROID_LOG_DEBUG, "Xash", "%s", pMsg );
#endif
if( !lastchar || lastchar == '\n')
strftime( logtime, sizeof( logtime ), "[%H:%M:%S] ", crt_tm ); //short time
#ifdef COLORIZE_CONSOLE
{
char colored[4096];
const char *msg = pMsg;
int len = 0;
while( *msg && ( len < 4090 ) )
{
static char q3ToAnsi[ 8 ] =
{
'0', // COLOR_BLACK
'1', // COLOR_RED
'2', // COLOR_GREEN
'3', // COLOR_YELLOW
'4', // COLOR_BLUE
'6', // COLOR_CYAN
'5', // COLOR_MAGENTA
0 // COLOR_WHITE
};
if( IsColorString( msg ) )
{
int color;
msg++;
color = q3ToAnsi[ *msg++ % 8 ];
colored[len++] = '\033';
colored[len++] = '[';
if( color )
{
colored[len++] = '3';
colored[len++] = color;
}
else
colored[len++] = '0';
colored[len++] = 'm';
}
else
colored[len++] = *msg++;
}
colored[len] = 0;
printf( "\033[34m%s\033[0m%s\033[0m", logtime, colored );
}
#else
#if !defined __ANDROID__
printf( "%s %s", logtime, pMsg );
fflush( stdout );
#endif
#endif
lastchar = pMsg[strlen(pMsg)-1];
if( !logfile )
return;
if( !lastchar || lastchar == '\n')
strftime( logtime, sizeof( logtime ), "[%Y:%m:%d|%H:%M:%S]", crt_tm ); //full time
fprintf( logfile, "%s %s", logtime, pMsg );
fflush( logfile ); fflush( logfile );
} }
@ -101,6 +175,7 @@ print into win32 console
*/ */
void Sys_Print( const char *pMsg ) void Sys_Print( const char *pMsg )
{ {
#ifdef _WIN32
char tmpBuf[8192]; char tmpBuf[8192];
HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE ); HANDLE hOut = GetStdHandle( STD_OUTPUT_HANDLE );
unsigned long cbWritten; unsigned long cbWritten;
@ -146,6 +221,9 @@ void Sys_Print( const char *pMsg )
Sys_PrintLog( tmpBuf ); Sys_PrintLog( tmpBuf );
pTemp = tmpBuf; pTemp = tmpBuf;
} }
#else
Sys_PrintLog( pMsg );
#endif
} }
/* /*
@ -203,6 +281,7 @@ void MsgDev( int level, const char *pMsg, ... )
void MsgAnim( int level, const char *pMsg, ... ) void MsgAnim( int level, const char *pMsg, ... )
{ {
#ifdef _WIN32
va_list argptr; va_list argptr;
char text[1024]; char text[1024];
char empty[1024]; char empty[1024];
@ -228,4 +307,5 @@ void MsgAnim( int level, const char *pMsg, ... )
Sleep( 150 ); Sleep( 150 );
} }
Msg( "^7\n" ); Msg( "^7\n" );
} #endif
}

View File

@ -13,11 +13,19 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
*/ */
#ifdef _WIN32
#include <windows.h> #include <windows.h>
#include <direct.h> #include <direct.h>
#include <io.h>
#else
#include <dirent.h>
#include <errno.h>
#include <unistd.h>
#define O_BINARY 0
#endif
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <io.h>
#include "conprint.h" #include "conprint.h"
#include "cmdlib.h" #include "cmdlib.h"
#include "stringlib.h" #include "stringlib.h"
@ -147,16 +155,21 @@ void stringlistsort( stringlist_t *list )
} }
} }
void listdirectory( stringlist_t *list, const char *path, bool tolower ) void listdirectory( stringlist_s *list, const char *path, bool lowercase )
{ {
char pattern[4096];
struct _finddata_t n_file;
long hFile;
char *c;
int i; int i;
signed char *c;
#ifdef _WIN32
char pattern[4096];
struct _finddata_t n_file;
int hFile;
#else
DIR *dir;
struct dirent *entry;
#endif
Q_strncpy( pattern, path, sizeof( pattern )); #ifdef _WIN32
Q_strncat( pattern, "*", sizeof( pattern )); Q_snprintf( pattern, sizeof( pattern ), "%s*", path );
// ask for the directory listing handle // ask for the directory listing handle
hFile = _findfirst( pattern, &n_file ); hFile = _findfirst( pattern, &n_file );
@ -164,22 +177,33 @@ void listdirectory( stringlist_t *list, const char *path, bool tolower )
// start a new chain with the the first name // start a new chain with the the first name
stringlistappend( list, n_file.name ); stringlistappend( list, n_file.name );
// iterate through the directory // iterate through the directory
while( _findnext( hFile, &n_file ) == 0 ) while( _findnext( hFile, &n_file ) == 0 )
stringlistappend( list, n_file.name ); stringlistappend( list, n_file.name );
_findclose( hFile ); _findclose( hFile );
#else
if( !( dir = opendir( path ) ) )
return;
if( !tolower ) return; // iterate through the directory
while( ( entry = readdir( dir ) ))
stringlistappend( list, entry->d_name );
closedir( dir );
#endif
// convert names to lowercase because windows doesn't care, but pattern matching code often does // convert names to lowercase because windows doesn't care, but pattern matching code often does
for( i = 0; i < list->numstrings; i++ ) if( lowercase )
{ {
for( c = list->strings[i]; *c; c++ ) for( i = 0; i < list->numstrings; i++ )
*c = Q_tolower( *c ); {
for( c = (signed char *)list->strings[i]; *c; c++ )
{
if( *c >= 'A' && *c <= 'Z' )
*c += 'a' - 'A';
}
}
} }
} }
/* /*
============================================================================= =============================================================================
@ -212,20 +236,21 @@ search_t *COM_Search( const char *pattern, int caseinsensitive, wfile_t *source_
return NULL; return NULL;
} }
if( !GetCurrentDirectory( sizeof( root ), root )) Q_getwd( root, sizeof( root ) );
if( !root )
{ {
MsgDev( D_ERROR, "couldn't determine current directory\n" ); MsgDev( D_ERROR, "couldn't determine current directory\n" );
return NULL; return NULL;
} }
Q_strncat( root, "\\", sizeof( root ));
stringlistinit( &resultlist ); stringlistinit( &resultlist );
stringlistinit( &dirlist ); stringlistinit( &dirlist );
slash = Q_strrchr( pattern, '/' ); slash = Q_strrchr( pattern, '/' );
backslash = Q_strrchr( pattern, '\\' ); backslash = Q_strrchr( pattern, '\\' );
colon = Q_strrchr( pattern, ':' ); colon = Q_strrchr( pattern, ':' );
separator = max( slash, backslash ); separator = Q_max( slash, backslash );
separator = max( separator, colon ); separator = Q_max( separator, colon );
basepathlength = separator ? (separator + 1 - pattern) : 0; basepathlength = separator ? (separator + 1 - pattern) : 0;
basepath = (char *)Mem_Alloc( basepathlength + 1 ); basepath = (char *)Mem_Alloc( basepathlength + 1 );
if( basepathlength ) memcpy( basepath, pattern, basepathlength ); if( basepathlength ) memcpy( basepath, pattern, basepathlength );
@ -357,7 +382,11 @@ void COM_CreatePath( char *path )
// create the directory // create the directory
save = *ofs; save = *ofs;
*ofs = 0; *ofs = 0;
_mkdir( path ); #ifdef _WIN32
mkdir( path );
#else
mkdir( path, 0777);
#endif
*ofs = save; *ofs = save;
} }
} }
@ -555,9 +584,28 @@ COM_FolderExists
*/ */
bool COM_FolderExists( const char *path ) bool COM_FolderExists( const char *path )
{ {
DWORD dwFlags = GetFileAttributes( path ); #if XASH_WIN32
DWORD dwFlags = GetFileAttributes( path );
return ( dwFlags != -1 ) && FBitSet( dwFlags, FILE_ATTRIBUTE_DIRECTORY ); return ( dwFlags != -1 ) && ( dwFlags & FILE_ATTRIBUTE_DIRECTORY );
#else
DIR *dir = opendir( path );
if( dir )
{
closedir( dir );
return true;
}
else if( (errno == ENOENT) || (errno == ENOTDIR) )
{
return false;
}
else
{
MsgDev( D_ERROR, "FS_SysFolderExists: problem while opening dir: %s\n", strerror( errno ) );
return false;
}
#endif
} }
/* /*
@ -618,4 +666,4 @@ void SafeWriteExt( long handle, void *buffer, int count, const char *file, const
if( write_count != (size_t)count ) if( write_count != (size_t)count )
COM_FatalError( "file write failure ( %i != %i ) at %s:%i\n", write_count, count, file, line ); COM_FatalError( "file write failure ( %i != %i ) at %s:%i\n", write_count, count, file, line );
} }

View File

@ -193,6 +193,7 @@ SinCos
*/ */
void SinCos( float radians, float *sine, float *cosine ) void SinCos( float radians, float *sine, float *cosine )
{ {
#ifdef _MSC_VER
_asm _asm
{ {
fld dword ptr [radians] fld dword ptr [radians]
@ -204,6 +205,10 @@ void SinCos( float radians, float *sine, float *cosine )
fstp dword ptr [edx] fstp dword ptr [edx]
fstp dword ptr [eax] fstp dword ptr [eax]
} }
#else
*sine = sin(radians);
*cosine = cos(radians);
#endif
} }
/* /*
@ -405,7 +410,8 @@ fast box on planeside test
*/ */
int SignbitsForPlane( const vec3_t normal ) int SignbitsForPlane( const vec3_t normal )
{ {
for( int bits = 0, i = 0; i < 3; i++ ) int bits, i;
for( bits = 0, i = 0; i < 3; i++ )
if( normal[i] < 0.0f ) if( normal[i] < 0.0f )
bits |= 1<<i; bits |= 1<<i;
return bits; return bits;
@ -1220,4 +1226,4 @@ bool Matrix4x4_Invert_Full( matrix4x4 out, const matrix4x4 in1 )
} }
return false; return false;
} }

View File

@ -28,7 +28,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "stringlib.h" #include "stringlib.h"
#include "filesystem.h" #include "filesystem.h"
#include <stdarg.h> #include <stdarg.h>
#include <windows.h>
/* /*
============================================================================= =============================================================================
@ -558,4 +557,4 @@ void TokenError( const char *fmt, ... )
vsprintf( output, fmt, args ); vsprintf( output, fmt, args );
COM_FatalError( "%s", output ); COM_FatalError( "%s", output );
} }
} }

View File

@ -3,11 +3,12 @@
// stringlib.cpp - safety string routines // stringlib.cpp - safety string routines
//======================================================================= //=======================================================================
#include <windows.h> #include "port.h"
#include <ctype.h>
#include "stringlib.h" #include "stringlib.h"
#include <direct.h>
#include "cmdlib.h" #include "cmdlib.h"
#include "mathlib.h" #include "mathlib.h"
#include "stdarg.h"
void Q_strnupr( const char *in, char *out, size_t size_out ) void Q_strnupr( const char *in, char *out, size_t size_out )
{ {
@ -287,17 +288,21 @@ int Q_vsnprintf( char *buffer, size_t buffersize, const char *format, va_list ar
{ {
size_t result; size_t result;
#ifdef _MSC_VER
__try __try
#endif
{ {
result = _vsnprintf( buffer, buffersize, format, args ); result = vsnprintf( buffer, buffersize, format, args );
} }
// to prevent crash while output // to prevent crash while output
#ifdef _MSC_VER
__except( EXCEPTION_EXECUTE_HANDLER ) __except( EXCEPTION_EXECUTE_HANDLER )
{ {
Q_strncpy( buffer, "^1sprintf throw exception^7\n", buffersize ); Q_strncpy( buffer, "^1sprintf throw exception^7\n", buffersize );
result = buffersize; result = buffersize;
} }
#endif
if( result < 0 || result >= buffersize ) if( result < 0 || result >= buffersize )
{ {
@ -534,4 +539,4 @@ skipwhite:
token[len] = 0; token[len] = 0;
return data; return data;
} }

View File

@ -14,11 +14,8 @@ GNU General Public License for more details.
*/ */
#include "conprint.h" #include "conprint.h"
#include <windows.h>
#include <direct.h>
#include <fcntl.h> #include <fcntl.h>
#include <stdio.h> #include <stdio.h>
#include <io.h>
#include "cmdlib.h" #include "cmdlib.h"
#include "stringlib.h" #include "stringlib.h"
#include "filesystem.h" #include "filesystem.h"
@ -930,4 +927,4 @@ void W_SearchForFile( wfile_t *wad, const char *pattern, stringlist_t *resultlis
*((char *)separator) = 0; *((char *)separator) = 0;
} }
} }
} }

View File

@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details. GNU General Public License for more details.
*/ */
#include <windows.h> //#include <windows.h>
#include "cmdlib.h" #include "cmdlib.h"
#include "threads.h" #include "threads.h"
#include "stringlib.h" #include "stringlib.h"
@ -62,7 +62,7 @@ static void *attempt_calloc( size_t size )
if(( base = (void *)calloc( size, 1 )) != NULL ) if(( base = (void *)calloc( size, 1 )) != NULL )
return base; return base;
// try for half a second or so // try for half a second or so
Sleep( 100 ); usleep( 100000 );
} }
return NULL; return NULL;
} }
@ -173,4 +173,4 @@ size_t Mem_Size( void *ptr )
chunk = (memhdr_t *)((byte *)ptr - sizeof( memhdr_t )); chunk = (memhdr_t *)((byte *)ptr - sizeof( memhdr_t ));
return chunk->size; return chunk->size;
} }