#include "unicode/utypes.h"
#include "cmemory.h"
#include "unicode/udata.h"
#include "udatamem.h"
void UDataMemory_init(UDataMemory *This) {
uprv_memset(This, 0, sizeof(UDataMemory));
}
void UDatamemory_assign(UDataMemory *dest, UDataMemory *source) {
UBool mallocedFlag = dest->heapAllocated;
uprv_memcpy(dest, source, sizeof(UDataMemory));
dest->heapAllocated = mallocedFlag;
}
UDataMemory *UDataMemory_createNewInstance(UErrorCode *pErr) {
UDataMemory *This;
if (U_FAILURE(*pErr)) {
return NULL;
}
This = uprv_malloc(sizeof(UDataMemory));
if (This == NULL) {
*pErr = U_MEMORY_ALLOCATION_ERROR; }
else {
UDataMemory_init(This);
This->heapAllocated = TRUE;
}
return This;
}
const DataHeader *
UDataMemory_normalizeDataPointer(const void *p) {
const DataHeader *pdh = (const DataHeader *)p;
if(pdh==NULL || (pdh->dataHeader.magic1==0xda && pdh->dataHeader.magic2==0x27)) {
return pdh;
} else {
#ifdef OS400
return (const DataHeader *)*((const void **)p+1);
#else
return (const DataHeader *)((const double *)p+1);
#endif
}
}
void UDataMemory_setData (UDataMemory *This, const void *dataAddr) {
This->pHeader = UDataMemory_normalizeDataPointer(dataAddr);
}
U_CAPI void U_EXPORT2
udata_close(UDataMemory *pData) {
if(pData!=NULL) {
uprv_unmapFile(pData);
if(pData->heapAllocated ) {
uprv_free(pData);
} else {
UDataMemory_init(pData);
}
}
}
U_CAPI const void * U_EXPORT2
udata_getMemory(UDataMemory *pData) {
if(pData!=NULL && pData->pHeader!=NULL) {
return (char *)(pData->pHeader)+pData->pHeader->dataHeader.headerSize;
} else {
return NULL;
}
}
UBool UDataMemory_isLoaded(UDataMemory *This) {
return This->pHeader != NULL;
}