tfe-1.0/area/
tfe-1.0/files/
tfe-1.0/logs/
tfe-1.0/logs/immortal/
tfe-1.0/logs/mob/
tfe-1.0/logs/object/
tfe-1.0/logs/player/
tfe-1.0/logs/room/
tfe-1.0/notes/clans/
tfe-1.0/player/
tfe-1.0/prev/
tfe-1.0/prev/area/
tfe-1.0/prev/player/
tfe-1.0/prev/rooms/
tfe-1.0/rooms/
tfe-1.0/src-gc/
tfe-1.0/src-msvc/
tfe-1.0/src-unix/
tfe-1.0/www/
tfe-1.0/www/html/
#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;
}