summaryrefslogblamecommitdiffstats
path: root/private/crt32/heap/findaddr.c
blob: d7e9c699ca56dcb9205b66d5b0bd2b54a1f7ce4d (plain) (tree)











































































































                                                                                
/***
*findaddr.c - Find a heap entry
*
*	Copyright (c) 1989-1991, Microsoft Corporation. All rights reserved.
*
*Purpose:
*	Defines the _heap_findaddr routine
*
*Revision History:
*	07-06-89   JCR	Module created.
*	07-18-89   JCR	Return -1 if nothing in heap
*	11-13-89   GJF	Fixed copyright
*	12-04-89   GJF	Renamed header file (now heap.h). Also, some tuning.
*	12-18-89   GJF	Added explicit _cdecl to function definition
*	03-09-90   GJF	Replaced _cdecl with _CALLTYPE1, added #include
*			<cruntime.h> and removed #include <register.h>.
*	09-27-90   GJF	New-style function declarator.
*
*******************************************************************************/

#include <cruntime.h>
#include <heap.h>
#include <stddef.h>

#define TRUE	1

/***
*int _heap_findaddr() - Find a heap entry
*
*Purpose:
*	Given an address, find the corresponding heap entry.
*
*Entry:
*	void * address = address to look for
*	PBLKDESC * ppdesc = pointer to pointer to heap descriptor to be
*		filled in by this routine.
*
*Exit:
*
*	_HEAPFIND_EXACT  =  0 = exact fit, pdesc holds heap descriptor address
*	_HEAPFIND_WITHIN =  1 = not exact fit, pdesc holds previous heap
*				descriptor address
*
*	_HEAPFIND_BEFORE = -1 = address is before the heap (pdesc NOT filled in)
*	_HEAPFIND_AFTER  = -2 = address is after the heap (pdesc NOT filled in)
*	_HEAPFIND_EMPTY  = -3 = no memory in heap (pdesc NOT filled in)
*
*	[If return is negative, supplied pdesc is NOT filled in.]
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/

int  _CALLTYPE1 _heap_findaddr (
	void * address,
	_PBLKDESC * ppdesc
	)
{
	REG1 _PBLKDESC pcurr;

	/*
	 * See if heap there's anything in the heap
	 */

	if (_heap_desc.pfirstdesc == &_heap_desc.sentinel)
		return(_HEAPFIND_EMPTY);

	/*
	 * See if entry is in the heap or not
	 */

	if (_ADDRESS(_heap_desc.pfirstdesc) > address)
		return(_HEAPFIND_BEFORE);

	if (_ADDRESS(&_heap_desc.sentinel) <= address)
		return(_HEAPFIND_AFTER);

	/*
	 * Find the entry
	 */

#ifdef	DEBUG
	for (pcurr = _heap_desc.pfirstdesc; pcurr != &_heap_desc.sentinel;
	     pcurr = pcurr->pnextdesc) {
#else
	for (pcurr = _heap_desc.pfirstdesc; TRUE; pcurr = pcurr->pnextdesc) {
#endif

		if ( _ADDRESS(pcurr->pnextdesc) > address ) {

			/* Address is contained in this entry */
			*ppdesc = pcurr;

			/* Check for an exact fit */
			if ( _ADDRESS(pcurr) == address)
				return(_HEAPFIND_EXACT);
			else
				return(_HEAPFIND_WITHIN);
		}
	}

#ifdef	DEBUG
	/* Should never reach here! */
	_heap_abort();
#endif
}