mirror of
https://github.com/elliotnunn/mac-rom.git
synced 2025-01-01 11:29:27 +00:00
4325cdcc78
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included. The Tools directory, containing mostly junk, is also excluded.
111 lines
2.4 KiB
C
111 lines
2.4 KiB
C
/*
|
|
File: Heap.c
|
|
|
|
Contains: This file contains the heap controller functions
|
|
of the Common Test Environment. These functions allow
|
|
the caller to allocate and de-allocate memory in the
|
|
CTE global area.
|
|
|
|
Written by: Mark Appleman
|
|
|
|
Copyright: © 1990, 1992 by Apple Computer, Inc., all rights reserved.
|
|
|
|
Change History (most recent first):
|
|
|
|
<SM2> 5/2/92 kc Roll in Horror. Comments follow:
|
|
<H2> 3/6/92 AL Upgraded to CTE v2.1 (copied over from XXTest project).
|
|
|
|
*/
|
|
//
|
|
// Heap.c
|
|
//
|
|
|
|
#include "GenericTypes.h"
|
|
#include "CTETypes.h"
|
|
#include "Heap.h"
|
|
#include <String.h>
|
|
|
|
// Alignment macros (NOTE: n and size must be intergal types
|
|
// and size must be a power of 2).
|
|
#define AlignUp(n, size) (-(-n & ~(size - 1)))
|
|
#define AlignDown(n, size) (n & ~(size - 1))
|
|
|
|
//
|
|
// InitHeap() - Initialize the CTE heap.
|
|
//
|
|
void *InitHeap(CTEGlobals *globs, void *baseAddr, long size)
|
|
{
|
|
globs->heapPermPtr = globs->heapBottom =
|
|
(void *)AlignUp((long)baseAddr, sizeof(long)) ;
|
|
globs->heapTempPtr = globs->heapTop =
|
|
(void *)AlignDown((long)baseAddr + size, sizeof(long)) ; ;
|
|
|
|
return(globs->heapBottom) ;
|
|
}
|
|
|
|
|
|
void *AllocPermMem(CTEGlobals *globs, long size)
|
|
{
|
|
BYTE *newPermPtr ;
|
|
void *memPtr ;
|
|
|
|
// Make size a multiple of a longword.
|
|
size = AlignUp(size, sizeof(long)) ;
|
|
|
|
newPermPtr = (BYTE *)globs->heapPermPtr + size ;
|
|
|
|
if(newPermPtr > globs->heapTempPtr)
|
|
{
|
|
memPtr = NULL ; // out of heap mem.
|
|
}else{
|
|
memPtr = globs->heapPermPtr ;
|
|
globs->heapPermPtr = (void *)newPermPtr ;
|
|
}
|
|
|
|
return(memPtr) ;
|
|
}
|
|
|
|
void *AllocTempMem(CTEGlobals *globs, long size)
|
|
{
|
|
BYTE *newTempPtr ;
|
|
void *memPtr ;
|
|
|
|
// Make size a multiple of a longword.
|
|
size = AlignUp(size, sizeof(long)) ;
|
|
|
|
newTempPtr = (BYTE *)globs->heapTempPtr - size ;
|
|
|
|
if(newTempPtr < globs->heapPermPtr)
|
|
{
|
|
memPtr = NULL ;
|
|
}else{
|
|
globs->heapTempPtr = (void *)newTempPtr ;
|
|
memPtr = globs->heapTempPtr ;
|
|
//memset(memPtr, 0, size) ;
|
|
{
|
|
ULONG *longPtr = memPtr;
|
|
|
|
// TERROR ALERT! HORROR ALERT! Link with StdClib.o if
|
|
// Carl Hewitt and/or Steve Christensen allows it so that
|
|
// the "shift" instruction can be removed.
|
|
// Aaron 2/2/92
|
|
//long longCount = size / sizeof(ULONG) ;
|
|
long longCount = size >> 2 ;
|
|
|
|
|
|
while(longCount > 0)
|
|
{
|
|
*longPtr++ = 0 ;
|
|
longCount-- ;
|
|
}
|
|
}
|
|
}
|
|
|
|
return(memPtr) ;
|
|
}
|
|
|
|
void FreeTempMem(CTEGlobals *globs)
|
|
{
|
|
globs->heapTempPtr = globs->heapTop ;
|
|
}
|