#ifndef __LYLEAKS_H
/*
 *	Avoid include redundancy
 *	Include only if finding memory leaks.
 */
#define __LYLEAKS_H

/*
 *	Copyright (c) 1994, University of Kansas, All Rights Reserved
 *
 *	Include File:	LYLeaks.h
 *	Purpose:	Header to convert requests for allocation to Lynx
 *				custom functions to track memory leaks.
 *	Remarks/Portability/Dependencies/Restrictions:
 *		For the stdlib.h allocation functions to be overriden by the
 *			Lynx memory tracking functions all modules allocating,
 *			freeing, or resizing memory must have LY_FIND_LEAKS
 *			defined before including this file.
 *		This header file should be included in every source file which
 *			does any memory manipulation through use of the
 *			stdlib.h memory functions.
 *		For proper reporting of memory leaks, the function LYLeaks
 *			should be registered for execution by atexit as the
 *			very first executable statement in main.
 *		This code is slow and should not be used except in debugging
 *			circumstances (don't define LY_FIND_LEAKS).
 *		If you are using LY_FIND_LEAKS and don't want the LYLeak*
 *			memory functions to be used in a certain file,
 *			define NO_MEMORY_TRACKING before including this file.
 *		The only safe way to call the LYLeak* functions is to use
 *			the below macros because they depend on the static
 *			string created by __FILE__ to not be dynamic in
 *			nature (don't free it and assume will exist at all
 *			times during execution).
 *	Revision History:
 *		05-26-94	created for Lynx 2-3-1, Garrett Arch Blythe
 */

/*
 *	Required includes
 */
#include <stdlib.h>
#include "HTUtils.h"

/*
 *	Constant defines
 */
#define MAX_CONTENT_LENGTH 50
#ifdef VMS
#define LEAKAGE_SINK "sys$login:Lynx.leaks"
#else
#define LEAKAGE_SINK "Lynx.leaks"
#endif /* VMS */

/*
 *	Data structures
 */
typedef struct SourceLocation_tag	{
	/*
	 *	The file name and line number of where an event took place.
	 */
	CONST char *cp_FileName;
	short ssi_LineNumber;
}
SourceLocation;

typedef struct AllocationList_tag	{
	/*
	 *	A singly linked list.
	 */
	struct AllocationList_tag *ALp_Next;

	/*
	 *	The memory pointer allocated.
	 *	If set to NULL, then an invalid request was made.
	 *	The invalid pointer also.
	 */
	void *vp_Alloced;
	void *vp_BadRequest;

	/*
	 *	The size in bytes of the allocated memory.
	 */
	size_t st_Bytes;

	/*
	 *	The source location of specific event (calloc, malloc, free).
	 *	realloc kept separate since will track last realloc on pointer.
	 */
	SourceLocation SL_memory;
	SourceLocation SL_realloc;
}
AllocationList;

/*
 *	Global variable declarations
 */

/*
 *	Macros
 */
#if defined(LY_FIND_LEAKS) && !defined(NO_MEMORY_TRACKING)
/*
 *	Only use these macros if we are to track memory allocations.
 *	The reason for using a macro instead of a define is that we want
 *		to track where the initial allocation took place or where
 *		the last reallocation took place.
 *	Track where the allocation took place by the __FILE__ and __LINE__
 *		defines which are automatic to the compiler.
 */
#ifdef malloc
#undef malloc
#endif /* malloc */
#define malloc(st_bytes) LYLeakMalloc(st_bytes, __FILE__, __LINE__)

#ifdef calloc
#undef calloc
#endif /* calloc */
#define calloc(st_number, st_bytes) LYLeakCalloc(st_number, st_bytes, \
	__FILE__, __LINE__)

#ifdef realloc
#undef realloc
#endif /* realloc */
#define realloc(vp_alloced, st_newbytes) LYLeakRealloc(vp_alloced, \
	st_newbytes, __FILE__, __LINE__)

#ifdef free
#undef free
#endif /* free */
#define free(vp_alloced) LYLeakFree(vp_alloced, __FILE__, __LINE__)

#endif /* LY_FIND_LEAKS && !NO_MEMORY_TRACKING */

/*
 *	Function declarations
 *	See the appropriate source file for usage.
 */
PUBLIC void LYLeaks NOPARAMS;
PUBLIC void *LYLeakMalloc PARAMS((size_t st_bytes, CONST char *cp_File, CONST
	short ssi_Line));
PUBLIC void *LYLeakCalloc PARAMS((size_t st_number, size_t st_bytes, CONST char
	*cp_File, CONST short ssi_Line));
PUBLIC void *LYLeakRealloc PARAMS((void *vp_alloced, size_t st_newbytes, CONST
	char *cp_File, CONST short ssi_Line));
PUBLIC void LYLeakFree PARAMS((void *vp_alloced, CONST char *cp_File, CONST
	short ssi_Line));

#endif /* __LYLEAKS_H */
