legend/
legend/area/
legend/player/
/***************************************************************************
 *  God Wars Mud copyright (C) 1994, 1995, 1996 by Richard Woolcock        *
 *                                                                         *
 *  Legend of Chrystancia copyright (C) 1999, 2000, 2001 by Matthew Little *
 *  This mud is NOT to be copied in whole or in part, or to be run without *
 *  the permission of Matthew Little. Nobody else has permission to        *
 *  authorise the use of this code.                                        *
 ***************************************************************************/

/*
 * Matthew Chaplain's Memory Leak Tracer
 * Copyright (c) 2000, All Rights Reserved
 */
#include <stdio.h>

#ifndef MC_MEMORY_H_
#define MC_MEMORY_H_

/*
 * Initialise the memory using the macro MEMORY_INIT.
 *
 * To use:
 * Copy mc_mem.c and mc_mem.h into your directory.
 * In any file that uses malloc or free, include mc_mem.h.
 * Instead of using "malloc" and "free", use "MALLOC" and "FREE".
 * Ensure that mc_mem.o (compiled from mc_mem.c) is linked in with
 * your executable.
 *
 * The memory leak tracer only traces memory if the symbol DEBUG
 * is defined (pass -DDEBUG to the compiler or define it in the code 
 * for more modular control).  If this is not defined, mc_mem.h
 * replaces MALLOC and FREE with the normal malloc and free from
 * stdlib.h.
 *
 * Also possible is passing a MEMORY_HASH symbol, with a numeric
 * value (preferably a prime number) to set the size of the hash
 * to work with.  Higher numbers equal more efficiency, at the
 * expense of memory.
 *
 * Lastly, if a symbol MC_MEM_INTRO is passed (using -DMC_MEM_INTRO
 * at the compile line), the a short message will be printed
 * with the currently set options.
 *
 * Unless a symbol NOREPORTATEXIT is passed, the tracer will register
 * a call to mc_memory_done() with the "atexit" standard function.
 *
 * All error reporting is done to the standard error file.
 */

#ifndef DEBUG 
#define MEMORY_INIT()
#define MALLOC( x ) malloc( (x) )
#define CALLOC( x, y ) calloc( (x), (y) )
#define REALLOC( x, y ) realloc( (x), (y) )
#define FREE( x ) free( (x) )
#else
#define MEMORY_INIT() mc_memory_init()
#define MALLOC( x ) mc_memory_malloc( (x), __FILE__, __LINE__ )
#define CALLOC( x, y ) mc_memory_calloc( (x), (y),  __FILE__, __LINE__ )
#define REALLOC( x, y ) mc_memory_realloc( (x), (y), __FILE__, __LINE__ )
#define FREE( x ) mc_memory_free( (x), __FILE__, __LINE__ )
#endif

void  mc_memory_init( void );
void *mc_memory_malloc( size_t nSize, const char *szFileName, int nLineNumber );
void *mc_memory_calloc( size_t nElements, size_t nSize, 
                        const char *szFileName, int nLineNumber );
void *mc_memory_realloc( void *pvMemory, size_t nSize,
                         const char *szFileName, int nLineNumber );
void  mc_memory_free( void *pvMemory, const char *szFileName, int nLineNumber );
void  mc_memory_done( void );

#endif