/* ****************************************************************************** * * Copyright (C) 1999-2001, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************/ /*---------------------------------------------------------------------------------- * * UDataMemory A class-like struct that serves as a handle to a piece of memory * that contains some ICU data (resource, converters, whatever.) * * When an application opens ICU data (with udata_open, for example, * a UDataMemory * is returned. * *----------------------------------------------------------------------------------*/ #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) { /* UDataMemory Assignment. Destination UDataMemory must be initialized first. */ 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) { /* allow the data to be optionally prepended with an alignment-forcing double value */ const DataHeader *pdh = (const DataHeader *)p; if(pdh==NULL || (pdh->dataHeader.magic1==0xda && pdh->dataHeader.magic2==0x27)) { return pdh; } else { return (const DataHeader *)((const double *)p+1); } } 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; }