You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
4.5 KiB
201 lines
4.5 KiB
/*
|
|
* Adobe Universal Font Library
|
|
*
|
|
* Copyright (c) 1996 Adobe Systems Inc.
|
|
* All Rights Reserved
|
|
*
|
|
* UFLMem.c
|
|
*
|
|
* These are the memory allocation, deletion, etc... routines used by UFL.
|
|
* All memory blocks are allocated at the given size plus the size of 1
|
|
* unsigned long. The current size of the block is then stored in the first
|
|
* unsigned long in the block. The address of the block plus the first unsigned long
|
|
* is returned to the caller.
|
|
*
|
|
* $Header:
|
|
*/
|
|
|
|
#include "UFLCnfig.h"
|
|
#ifdef MAC_ENV
|
|
#include <Memory.h>
|
|
#endif
|
|
|
|
#include "UFLMem.h"
|
|
#include "UFLStd.h"
|
|
|
|
#ifdef KERNEL_MODE
|
|
|
|
PVOID UFLEXPORT
|
|
KMNewPtr(
|
|
PVOID p,
|
|
ULONG ulSize
|
|
)
|
|
|
|
{
|
|
if (p != NULL)
|
|
{
|
|
*((PULONG) p) = ulSize;
|
|
return (PBYTE) p + sizeof(ULONG_PTR);
|
|
}
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
VOID UFLEXPORT
|
|
KMDeletePtr(
|
|
PVOID p
|
|
)
|
|
|
|
{
|
|
if (p != NULL)
|
|
MemFree((PBYTE) p - sizeof(ULONG_PTR));
|
|
}
|
|
|
|
#else // !KERNEL_MODE
|
|
|
|
#if defined(MAC_ENV) && defined(__MWERKS__) && !defined(powerc)
|
|
#pragma pointers_in_D0
|
|
#endif
|
|
|
|
/* Global static variable */
|
|
void *UFLEXPORT
|
|
UFLNewPtr(
|
|
const UFLMemObj *mem,
|
|
unsigned long size
|
|
)
|
|
{
|
|
|
|
unsigned long* p = (unsigned long*)(*mem->alloc)((UFLsize_t) (size + sizeof(ULONG_PTR)), mem->userData );
|
|
if ( p == (unsigned long*)nil )
|
|
return nil;
|
|
|
|
// Memory allocated by UFLNewPtr is zero-initalized.
|
|
|
|
*p = size;
|
|
UFLmemset(mem, (void*)((char *)p + sizeof(ULONG_PTR)), 0, size);
|
|
|
|
return (void*)((char *)p + sizeof(ULONG_PTR));
|
|
|
|
}
|
|
|
|
void UFLEXPORT
|
|
UFLDeletePtr(
|
|
const UFLMemObj *mem,
|
|
void *ptr
|
|
)
|
|
{
|
|
if ( ptr != nil )
|
|
(*mem->free)( (void*)( ((unsigned char*)ptr) - sizeof(ULONG_PTR) ), mem->userData );
|
|
}
|
|
|
|
#if defined(MAC_ENV) && defined(__MWERKS__) && !defined(powerc)
|
|
#pragma pointers_in_A0
|
|
#endif
|
|
|
|
#ifdef MAC_ENV
|
|
// on the Macintosh, memcpy is frequently not well implemented because
|
|
// most applications call BlockMove instead.
|
|
|
|
void UFLEXPORT
|
|
UFLmemcpy(
|
|
const UFLMemObj *mem,
|
|
void *destination,
|
|
void *source,
|
|
unsigned long size
|
|
)
|
|
{
|
|
if ( (((unsigned long)source) & 3) || (((long)destination) & 3) )
|
|
BlockMove( source, destination, size );
|
|
|
|
else {
|
|
|
|
unsigned long *src = (unsigned long*)source;
|
|
unsigned long *dst = (unsigned long*)destination;
|
|
unsigned char *srcb, *dstb;
|
|
long count = (size >> 2) + 1;
|
|
|
|
while ( --count )
|
|
*dst++ = *src++;
|
|
|
|
count = (size & 3);
|
|
if ( count != 0 ) {
|
|
srcb = (unsigned char*)src;
|
|
dstb = (unsigned char*)dst;
|
|
++count;
|
|
while ( --count )
|
|
*dstb++ = *srcb++;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
void UFLEXPORT
|
|
UFLmemcpy(
|
|
const UFLMemObj *mem,
|
|
void *destination,
|
|
void *source,
|
|
unsigned long size
|
|
)
|
|
{
|
|
if ( destination != nil && source != nil)
|
|
(*mem->copy)( (void*)destination, (void*)source, (UFLsize_t) size , mem->userData );
|
|
|
|
// don't want to use this because size parameter is system dependend
|
|
// allow the client to chose whichever way.
|
|
// Warning!!! be carefull of platforms on which size_t is a 2 byte integer
|
|
//memcpy( destination, source, (size_t)size );
|
|
}
|
|
|
|
#endif // !MAC_ENV
|
|
|
|
#endif // !KERNEL_MODE
|
|
|
|
void UFLEXPORT
|
|
UFLmemset(
|
|
const UFLMemObj *mem,
|
|
void *destination,
|
|
unsigned int value,
|
|
unsigned long size
|
|
)
|
|
{
|
|
if ( destination != nil )
|
|
(*mem->set)( (void*)destination, value , size , mem->userData );
|
|
|
|
// don't want to use this because size parameter is system dependend
|
|
// allow the client to chose whichever way.
|
|
// memset( destination, value, (UFLsize_t)size );
|
|
|
|
}
|
|
|
|
unsigned long
|
|
UFLMemSize(
|
|
void *ptr
|
|
)
|
|
{
|
|
return *(unsigned long *) ((unsigned char *)ptr - sizeof(ULONG_PTR));
|
|
}
|
|
|
|
UFLBool
|
|
UFLEnlargePtr(
|
|
const UFLMemObj *mem,
|
|
void **ptrAddr,
|
|
unsigned long newSize,
|
|
UFLBool bCopy
|
|
)
|
|
{
|
|
unsigned long oldSize = *(unsigned long *) ((unsigned char *)(*ptrAddr) - sizeof(ULONG_PTR));
|
|
void *newBuf;
|
|
|
|
newBuf = UFLNewPtr( mem, newSize );
|
|
if ( newBuf == nil )
|
|
return 0;
|
|
if ( bCopy )
|
|
UFLmemcpy( mem, newBuf, *ptrAddr, (unsigned long)min(oldSize, newSize) );
|
|
UFLDeletePtr( mem, *ptrAddr );
|
|
*ptrAddr = newBuf;
|
|
|
|
return 1;
|
|
}
|
|
|