#include <ctype.h>
#include <sys/types.h>
#include <signal.h>
#include <stdio.h>
#include <syslog.h>
#include <stdlib.h>
#include "define.h"
#include "struct.h"
const char* memory_name [ MAX_MEMORY ] = { "Unknown", "Accounts",
"Actions", "Affects", "Aliases", "Areas", "Arrays", "Auction",
"Bad Names", "Bans", "Clans", "Customs", "Char. Descr.",
"Enemies", "Event",
"Exits", "Extras", "Helps", "Info",
"Links", "Memory", "Mobs", "Mob_Progs",
"Notes", "Obj_Classes", "Objects", "Obj_Progs",
"Pfiles", "Players", "Programs", "Quests", "Queue",
"Recognize", "Requests",
"Resets", "Rooms", "Shdata", "Shops", "Species",
"Spells", "Tables", "Tells", "Tracks", "Trainers",
"Wizards" };
int memory_number [ 2*MAX_MEMORY-1 ];
int memory_size [ 2*MAX_MEMORY-1 ];
/*
* RECORD ROUTINES
*/
void record_new( const int size, const int type )
{
memory_number [ MAX_MEMORY+type-1 ]++;
memory_size [ MAX_MEMORY+type-1 ] += size;
};
void record_delete( const int size, const int type )
{
memory_number [ MAX_MEMORY+type-1 ]--;
memory_size [ MAX_MEMORY+type-1 ] -= size;
};
void do_memory( char_data* ch, char* )
{
char tmp [ TWO_LINES ];
int number;
int blocks;
int bytes = 0;
for( int i = 0; i < 2*MAX_MEMORY-1; i++ )
bytes += memory_size[i];
page( ch, " Mobs: %d\n\r", mob_list.size );
page( ch, " Objects: %d\n\r", obj_list.size );
page( ch, " Players: %d\n\r", player_list.size );
page( ch, " Extracted: %d\n\r", extracted.size );
page( ch, "\n\r" );
page( ch, "Memory Allocated: %dk\n\r\n\r", bytes/1024 );
sprintf( tmp, "%15s %8s %8s %8s\n\r", "Structure", "Number",
"Blocks", "Bytes" );
page_underlined( ch, tmp );
for( int i = 0; i < MAX_MEMORY; i++ ) {
number = memory_number[ MAX_MEMORY+i-1];
blocks = number;
bytes = memory_size[ MAX_MEMORY+i-1 ];
if( i != 0 ) {
blocks += memory_number[ MAX_MEMORY-i-1 ];
bytes += memory_size[ MAX_MEMORY-i-1 ];
}
sprintf( tmp, "%15s %8d %8d %8d\n\r",
memory_name[i], number, blocks, bytes );
page( ch, tmp );
}
}
/*
* INIT MEMORY
*/
void init_memory( void )
{
for( int i = 0; i < 2*MAX_MEMORY-1; i++ ) {
memory_number[i] = 0;
memory_size[i] = 0;
}
}
/*
* STRINGS
*/
char* alloc_string( const char* string, int type )
{
char* string_new;
int length = strlen( string )+1;
if( length == 1 )
return empty_string;
string_new = new char[length];
memcpy( string_new, string, length );
record_new( length, -type );
return string_new;
}
void free_string( const char* string, int type )
{
if( string != NULL && string != empty_string ) {
record_delete( strlen( string )+1, -type );
delete [] string;
}
}
/*
* EXTRACT EDITED OBJECTS
*/
void extract( wizard_data* imm, int offset, const char* text )
{
char tmp [ TWO_LINES ];
player_data* ch;
void** edit;
void** pntr;
sprintf( tmp, "** %s just deleted the %s you were editing. **\n\r",
imm->real_name( ), text );
edit = (void**)( int( imm )+offset );
for( int i = 0; i < player_list; i++ ) {
ch = player_list[i];
if( !ch->Is_Valid( )
|| ch == imm || wizard( ch ) == NULL )
continue;
pntr = (void**)( int( ch )+offset );
if( *edit == *pntr ) {
*pntr = NULL;
send( ch, tmp );
}
}
*edit = NULL;
}