/********************************************************************** * Copyright (C) 1998-2000, International Business Machines Corporation * and others. All Rights Reserved. **********************************************************************/ #include "ucmpwrit.h" #include /* UCMP8 format: offset size what --------------------------------------------- 0 4 ICU_UCMP8_VERSION 4 4 count 8 512*2 = 1024 fIndex [uint16's] (UCMP8_kIndexCount*2) 1032 1*fCount fArray [int8_t's] + padding (to extend fCount to the nearest multiple of 4) */ /* Sanity check. */ #if (UCMP8_kIndexCount != 512) # error UCMP8_kIndexCount - changed size. Check to see if different pading needed. #endif U_CAPI uint32_t U_EXPORT2 udata_write_ucmp8 (UNewDataMemory *pData, const CompactByteArray* array) { int32_t size = 0; udata_write32(pData, ICU_UCMP8_VERSION); size += 4; udata_write32(pData, array->fCount); size += 4; udata_writeBlock(pData, array->fIndex, sizeof(array->fIndex[0])*UCMP8_kIndexCount); size += sizeof(array->fIndex[0])*UCMP8_kIndexCount; udata_writeBlock(pData, array->fArray, sizeof(array->fArray[0])*array->fCount); size += sizeof(array->fArray[0])*array->fCount; while(size%4) /* end padding */ { udata_writePadding(pData, 1); /* Pad total so far to even size */ size += 1; } return size; } /* internal constants*/ #define UCMP16_kMaxUnicode_int 65535 #define UCMP16_kUnicodeCount_int (UCMP16_kMaxUnicode_int + 1) #define UCMP16_kBlockShift_int 7 #define UCMP16_kBlockCount_int (1 << UCMP16_kBlockShift_int) #define UCMP16_kBlockBytes_int (UCMP16_kBlockCount_int * sizeof(int16_t)) #define UCMP16_kIndexShift_int (16 - UCMP16_kBlockShift_int) #define UCMP16_kIndexCount_int (1 << UCMP16_kIndexShift_int) #define UCMP16_kBlockMask_int (UCMP16_kBlockCount_int - 1) static const int32_t UCMP16_kMaxUnicode = UCMP16_kMaxUnicode_int; static const int32_t UCMP16_kUnicodeCount = UCMP16_kUnicodeCount_int; static const int32_t UCMP16_kBlockShift = UCMP16_kBlockShift_int; static const int32_t UCMP16_kBlockCount = UCMP16_kBlockCount_int; static const int32_t UCMP16_kBlockBytes = UCMP16_kBlockBytes_int; static const int32_t UCMP16_kIndexShift = UCMP16_kIndexShift_int; static const int32_t UCMP16_kIndexCount = UCMP16_kIndexCount_int; static const uint32_t UCMP16_kBlockMask = UCMP16_kBlockMask_int; /* UCMP16 format: offset size what --------------------------------------------- 0 4 ICU_UCMP16_VERSION 4 4 count 8 4 blockShift 12 4 blockMask 16 512*2 = 1024 fIndex [uint16's] (UCMP16_kIndexCount*2) 1032 1*fCount fArray [int16's] + padding (to extend fCount to the nearest multiple of 4) */ #if (UCMP16_kIndexCount_int != 512) # error UCMP16_kIndexCount - changed size. Check to see if different pading needed. #endif U_CAPI uint32_t U_EXPORT2 udata_write_ucmp16 (UNewDataMemory *pData, const CompactShortArray* array) { int32_t size = 0; udata_write32(pData, ICU_UCMP16_VERSION); size += 4; udata_write32(pData, array->fCount); size += 4; udata_write32(pData, array->kBlockShift); size += 4; udata_write32(pData, array->kBlockMask); size += 4; udata_writeBlock(pData, array->fIndex, sizeof(array->fIndex[0])*UCMP16_kIndexCount); size += sizeof(array->fIndex[0])*UCMP16_kIndexCount; udata_writeBlock(pData, array->fArray, sizeof(array->fArray[0])*array->fCount); size += sizeof(array->fArray[0])*array->fCount; while(size%4) /* end padding */ { udata_writePadding(pData, 1); /* Pad total so far to even size */ size += 1; } return size; }