Leaked source code of windows server 2003
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

/*
* 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;
}